OmniAICreator/Qiita-1.07M huggingface dataset:
Linucレベル１勉強メモ　＃４０

＃ 第４章 リポジトリとパッケージ管理

練習問題4.4
システムをアップデートしようと「apt upgrade」コマンドを実行したところ、更新パッケージ数は０と表示され、どのパッケージもアップデートされませんでした。ディストリビューションのWebサイトの情報を確認すると、複数のパッケージに更新があることが確認できました。アップデートされなかった要因として考えられるものを選択してください。

A. 「apt upgrade」コマンドを一般ユーザーとして実行しようとした

B. 先に「apt check-update」コマンドを実行する必要がある

C. 「apt upgrade -a」のように「-a」オプションを指定する必要がある

D. 先に「apt update」コマンドを実行する必要がある

（解答）D

（解説）
aptまたはapt-getコマンドを使ってパッケージをアップデートする場合、最初に「apt update」または「apt-get update」コマンドを実行して最新のパッケージ情報を取得しておく必要があります。この操作がなければ、システム上のパッケージ情報が古いままであるため、更新パッケージが内容に処理されてしまいます。一般ユーザーで「apt upgrade」や「apt-get upgrade」コマンドを実行しようとするとエラーになりますので、選択肢Aは不正解です。「apt check-update」「apt-get check-update」というコマンドはないので選択肢Bが不正解です。「apt-upgrade」「apt-get upgrade」時に指定する-aといったオプションはなく、オプション指定でパッケージ情報を更新することはできないので、選択肢Cは不正解です。
Linucレベル１勉強メモ　＃３９

＃ 第４章 リポジトリとパッケージ管理

練習問題4.3
Ubuntu Serverで、リポジトリにはどのようなBtrfs関連のパッケージが存在するかをキーワードで検索しようとしています。下線部に当てはまるコマンドを記述してください。

＄ ______ search btrfs

（解答）aptまたはapt-cache

（解説）
apt searchもしくはapt-cache searchコマンドを使うと、リポジトリにあるパッケージの情報をキーワードで検索できます。apt-getコマンドではsearchサブコマンドを使えないので注意する。

aptコマンド<br>apt-getとapt-cacheコマンドを合わせたようなコマンドです。最近ではapt-get/apt-cacheコマンドに変わってaptコマンドの利用が推奨されています。

apt-cacheコマンド<br>パッケージ情報を照会・検索することのできるコマンドです。照会・検索する対象のパッケージはインストールされていなくても構いません。

（わからない単語解説）
* btrfs<br>Linux用のファイルシステムであり、高い耐障害性やデータの修復、扱いやすさを目指した先進的な機能を持つファイルシステムです。
LLMエンジニアとは？

# はじめに
昨今話題のAIですが度々LLMエンジニアという言葉を耳にします。
果たしてどんなエンジニアなのか、具体的な業務内容、どんなスキルを持つのか、紹介していきたいと思います。

## LLMとは
LLM（Large Language Model）は「大量のテキストデータで学習された、自然言語を理解・生成できるAIモデル」のことで特徴としては以下になります。
- 単語や文脈を統計的に理解する
- 人間が書いたような文章を生成できる
- 要約、翻訳、質問応答などができる
- 数十億〜数千億のパラメータ（モデルによっては数兆規模）を持ち、これにより高度な言語理解と生成能力を実現している

代表的なLLMとしてGPTシリーズ（OpenAI）やPaLM（Google）、Claude（Anthropic）等があります。

## LLMエンジニアって何？
 LLMエンジニアとは大規模言語モデル（Large Language Model, LLM）を活用・開発・運用するエンジニアのことで、chatGPT、PaLM、ClaudeのようなAIモデルを使用してサービスを作ったり業務に組み込んだりする専門家を指します。

 #### LLMエンジニアの業務例
 
 アプリケーション開発
 - 社内チャットボット開発(社内マニュアルから回答)
 - メール要約・自動返信ツールの作成
 - 顧客対応のAIエージェント開発（LLM × CRM連携）
 -  - 質問応答（QA）機能付きの文書検索アプリ「＝RAG構成（後述）」
 <br>

 RAG (Retrieval-Augmented Generation) 構成の開発・運用
 - LLMの知識を補完するための外部データソース（ドキュメントストア、データベース、Web APIなど）を選定し、必要に応じてデータの前処理やインデックス作成を行う
 - 質問内容に基づいた関連性の高い情報を効率的に検索するシステムの構築
 - 検索された情報をLLMへの入力プロンプトに適切に組み込むロジックの開発
 - 検索精度、応答速度、生成される回答の品質などを向上させるために、RAGの各要素を調整を行う
 
  <br>
  
プロンプト設計（Prompt Engineering）
- より正確に出力するためのプロンプトの改善
- "System Prompt" の設計（役割や応答のスタイル、制約事項、文体の指定）
- 「○○なときに××と答える」などプロンプトテンプレートを構築
- テスト自動化でプロンプト精度を検証（LLM-as-a-judge：LLMにLLMの出力を評価させる手法）

 <br>
 
LLMのファインチューニング
- 特定のタスクやドメインに特化したLLMを構築するために適切な学習データセットを収集・作成・整備する
- 準備したデータセットを用いて、LLMを追加学習（ファインチューニング）させる
- ファインチューニングされたLLMの性能を評価し、期待するレベルに達しているかを確認する

 <br>

最新技術の調査・研究
- LLM関連の最新論文や技術動向のキャッチアップ、新しいモデル、アーキテクチャ、評価手法などの学習
- 新しい技術や手法を試し、実用化の可能性を探る

## LLMエンジニアに求められるスキルと知識
求められるスキルや知識は多岐に渡りますが主要なものを上げていきます。

基礎知識として以下への理解

- 自然言語処理 (NLP)
    - トークン化、埋め込み (Word Embedding, Sentence Embedding)、言語モデルの基本概念
    - テキスト分類、固有表現抽出、質問応答、機械翻訳などの基本的なNLPタスクの理解
- 機械学習 (ML) 、深層学習 (DL)
    - 教師あり学習、教師なし学習、強化学習の基本的な概念
    - ニューラルネットワークの基礎（パーセプトロン、多層パーセプトロン、CNN、RNN、Transformerなど）
    - 損失関数、最適化アルゴリズム、正則化などの学習に関する基本的な知識
- 大規模言語モデル (LLM)
    - Transformerアーキテクチャの詳細な理解
    - 事前学習 (Pre-training) とファインチューニング (Fine-tuning) の概念と手法
    - LLMの評価指標（Perplexity、BLEU、ROUGEなど）
    - 代表的なLLMのアーキテクチャと特性

 <br>

- プログラミングスキル
    - PythonはLLM開発における主要なプログラミング言語であり、データ処理、モデル構築、API連携などで必須
- 機械学習・深層学習ライブラリ
    - PyTorch、TensorFlowなどの主要な深層学習フレームワークの習熟
    - Hugging Face Transformersライブラリの利用経験（モデルのロード、学習、推論など）
    - データ処理・分析ライブラリ（Pandas、NumPy、Scikit-learnなど）


## AIの資格
最近では三菱商事が2027年度からAI資格取得を管理職昇格要件とする方針を発表するなどAI人材の育成が企業にとって重要になりつつあります。
人工知能（AI）の資格としてどんなものがあるか代表的なものを紹介します。

- G検定（ジェネラリスト検定）：AIの基礎知識を問う
- E資格（エンジニア資格）：AIの実装・応用スキルを問う
- Pythonエンジニア育成推進協会認定試験：PythonのAI・機械学習関連スキルを問う
- 統計検定： 統計学の知識・活用能力を評価（AIの基礎となる数学）
- 情報処理技術者試験（応用情報技術者試験など）：情報技術全般の知識を問うが、AI関連も範囲に含まれる

例えばG検定だとAIの基礎知識、動向、リテラシー、数理、統計知識などが出題されているようでした。


## 調べてみた感想
AIが発達し始めて将来エンジニアの仕事がなくなるというような意見を聞いたことがありますが、個人的には今後言語や分野関わらずAIは取り入れて、そのAIを技術面でどう扱うかが重要になり職業としてはなくなることはないのではと感じています。その中でもAI特化しているのがLLMエンジニアという印象です。
弊社でも業務にAIを導入し始めており、私はCursorというAI機能を搭載したコードエディタを使用しています。
この技術変化に乗り遅れないためにもAIについて日々キャッチアップを行なっていきたいです。

# 
プロダクトに向き合い、ユーザーとつながる開発を。
ネットネイティブでは、そんなエンジニアを歓迎しています
https://www.wantedly.com/companies/mdpr
Linucレベル１勉強メモ　＃３８

＃ 第４章 リポジトリとパッケージ管理

練習問題4.2
apt-getを使って、Ubuntuのシステムを最新にアップグレードしたい場合、どのコマンドを実行すれば良いですか。

A. apt-get system-upgrade

B. apt-get system-update

C. apt-get dist-upgrade

D. apt-get update

E. apt-get versionup

（解答）C

（解説）
「apt-get system-upgrade」「apt-get system-update」「apt-get versionup」といったコマンドは存在しないので、選択肢A,B,Eは不正解です。「pat-get update」はパッケージの最新情報を取得するコマンドです。したがって選択肢Dは不正解です。正解は選択肢Cです。「apt-get dist-upgrade」で最新のシステムにアップグレードします。
apt-get dist-upgradeのdistとはインストールされているカーネルの更新（Ubuntu)/ディストリビューションの更新(Debian)をするコマンド
JetCompose LazyColumnをコピペで使う

## LazyColumnってどうやって記載するんだっけ？って時に
コピペで使えるシリーズの記事を書いてみようかと、思ったので投稿しました。

まず、画像を確認して、下にコードがあるのでコピペ

![スクリーンショット 2025-05-15 12.21.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158190/795ae7be-6685-42de-b563-138653e5df8a.png)



```
@Composable
fun LazyColumnExample() {
    // 表示するデータのリスト
    val itemsList = (0..100).toList() // 例として 0 から 100 までの数字のリストを作成

    LazyColumn(
        modifier = Modifier.fillMaxSize() // 画面全体に広がるように設定 (任意)
    ) {
        // items ブロックを使用して、リストの各アイテムを処理します
        items(itemsList) { item ->
            // 各アイテムに対応する Composable をここで定義します
            // このラムダは、リストの各要素に対して一度呼び出されます
            Text(
                text = "アイテム: $item",
                modifier = Modifier.padding(16.dp) // アイテムごとにパディングを追加
            )
        }
    }
}


```
Linucレベル１勉強メモ　＃３７

＃ 第４章 リポジトリとパッケージ管理

練習問題4.1
インストールされているlinuctestパッケージを、設定ファイルを残したままアンインストールしたい場合、どのコマンドを実行すれば良いですか、２つ選択してください。

A. dpkg -e linuctest

B. dpkg -r linuctest

C. dpkg -i linuctest

D. dpkg --purge linuctest

E. dpkg --remove linuctest

（解答）B, E

（解説）
選択肢Aの-eでは、rpmコマンドでパッケージをアンインストールするためのオプションです。従って、選択肢Aは不正解です。-iオプションはインストールを行うため、選択肢Cは不正解です。-purgeオプションでは設定ファイルも含めて削除されるため、選択肢Dは不正解です。正解は選択肢BとEです。dpkg -rコマンドもしくはdpkg --removeコマンドを実行すると、設定ファイルをのぞいてパッケージをアンインストールします。

（わからない単語解説）
* 設定ファイル<br>コンピュータにおいて動作するプログラムや、オペレーティングシステム等の、様々な設定上の条件を記述したファイルである。
* dpkgコマンド<br>Debian形式のパッケージ管理を扱うために使う。
 書式　dpkg [オプション] アクション
* パッケージ<br>
* リポジトリ<br>ソースコードや設計図、開発に関する情報など保管・管理するシステム
JetCompose TextFieldをコピペで使う

## テキストフィールドってどうやって記載するんだっけ？って時に

コピペで使えるシリーズの記事を書いてみようかと、思ったので投稿しました。

まず、画像を確認して、下にコードがあるのでコピペ

![スクリーンショット 2025-05-15 12.00.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158190/64fa8bfb-9e74-40f7-a25f-b6b0053d3f3f.png)

```
@Composable
fun TextFieldExample() {
    var text by remember { mutableStateOf("") }

    TextField(
        value = text,
        onValueChange = { newText ->
            text = newText
        },
        label = { Text("メールアドレス") }, // フローティングラベル
        placeholder = { Text("例: example@example.com") }, // プレースホルダー
        leadingIcon = { // 先頭のアイコン
            Icon(Icons.Filled.Email, contentDescription = "メールアイコン")
        },
        modifier = Modifier.padding(16.dp)
    )
}
```


```
@Composable
fun OutlinedTextFieldExample() {
    var text by remember { mutableStateOf("") }

    OutlinedTextField(
        value = text,
        onValueChange = { newText ->
            text = newText
        },
        label = { Text("パスワード") }, // フローティングラベル
        trailingIcon = { // 末尾のアイコン (例: パスワード表示切り替えアイコンなど)
            // ここにアイコンを追加
        },
        modifier = Modifier.padding(16.dp)
    )
}

```
可変フォントを静的フォントにして使いたい

## 0.可変フォントって？
スタイル（BoldだのMediumだのItallicだのの差分のこと）がすべて一個にまとまっているフォント（.ttf,otf）のこと。このままだとUEなどの可変フォント読み込み機能がないようなツールではスタイルを変えることができない。
今回使用したのはWeightの情報だけで肉付けしている可変フォント。Itallicがあるようなものだと少し変わるかもしれない。

## 1.Pythonのインストール
FontToolsというものを使うためにPythonをインストールする必要があります。
Python3.9以上必須
[この記事](https://qiita.com/PenguinLucky_PL/items/e95863ac5ce004a323bf)見ながら自分はインストールしました。

インストールが完了したら、Windows+Rやらでコマンドプロンプトを起動する。
```
where pyhton
```
とか
```
where pip
```
とかでインストールできているか確認（ファイルパスが出ていたら成功）


## 2.FontToolsのインストール
コマンドプロンプトで、
```
pip install fonttools
```
か
```
py -m pip install fonttools
```
と打つとダウンロードが始まります。（py -mはきちんとインストールできていれば不要です。おまじない）

## 3.フォントの太さを変えて書き出す

コマンドを実行するともとになったフォントと同じ階層にフォントが書き出される

```コマンド内容
fonttools varLib.instancer ["ファイルパス+フォント名"] wght=(お好みのウェイト数）
```
例
```仮の実行内容
fonttools varLib.instancer "H:\FontExport\RobotoFlex\RobotoFlex.ttf" wght=700
```
ウェイトはこの辺を参考に
https://github.com/fontforge/designwithfontforge.com/blob/gh-pages/ja-JP/Bold_and_Other_Weights.md
http://designwithfontforge.com/ja-JP/Bold_and_Other_Weights.html
処理が走って終わると書き出される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/f1b0e8e6-0df5-4315-9f50-fe6475eaf4e1.png)

Wight700←→Wight400（Def） ※英語のみ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/3f4cd630-e158-406f-b49b-df00d10dfa5b.png)

## 4.別ツールで確認
UEに入れてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/9d785d12-995d-44d9-a01e-a91faa5952b5.png)
きちんと反映されているね、ε-(´∀｀*)ﾎｯ
Qiitaってなにさ？

# よくわかんないです
業務ではほぼPCを使うことのない仕事をしています
いわゆるソーシャルワーカーに分類される仕事です
一方で、プライベートでは20代の頃からHTML+CSSで静的Webサイトを趣味で作ったり興味はあります
今はとにかく仕事に追われ、少し暇ができるとプログラミングとかやってみたいなとPCを開くけど日常に戻るとすぐに忘れてしまう、そんな日々…

Qiitaの存在自体は知っていましたが良く分からず、とりあえずアカウント作っておけば良いかなと作ってあったアカウントです

昨今の生成AIってすごいですね、コード書いてくれちゃうんだから
なぜ動いているのかは良く分からない、それも質問しながら少しずつ前に進んでいます

小さな一歩を踏み出すための道標をここに

# Qiitaって？ChatGPTに聞いてみた
まずはここのことを理解しておく必要があるのかなと
>「Qiita（キータ）」は、日本のエンジニア向けの情報共有サービスです。主にプログラミングやソフトウェア開発に関する知識やノウハウを、ユーザー同士で投稿・共有するためのプラットフォームです。
Qiitaの主な特徴：
技術記事の投稿：ユーザーが自分の学びや技術的な知見、ハマりどころの回避策などを記事として投稿できます。
Markdown対応：記事はMarkdown記法で書けるため、コードや見出しが整った形で表示されます。
タグ機能：記事には言語や技術スタック（例：Python、React、Dockerなど）のタグをつけられます。
いいね / ストック機能：他のユーザーが参考になった記事に「LGTM（Looks Good To Me）」や「ストック（保存）」を付けられます。
Qiita Team：企業や開発チーム内でナレッジを共有できる有料プランもあります。
例：
Pythonでスクレイピングする方法
Gitの使い方入門
エラー「〇〇」の解決法まとめ
Qiitaは、初心者から上級者まで、さまざまなエンジニアが日々知見を投稿していて、調べ物をするときに検索結果でよく上位に出てくることが多いです。

…あれ？毎行引用の不等号置かなきゃいけないんじゃないの？とか思ったりですが

何はともあれ、一歩目です
CSSを学ぼうシリーズその3(全5回)：基本だけど大事なプロパティ(margin/padding/display)

## 魂は細部に宿る
* 1pxの差が見やすさや印象に影響する
* 業務アプリは情報が多くなりがちだが、適切な余白を設けることで見やすさが変わる

----
## CSSで余白を設定する方法
* margin：隣のタグとの距離
  自身の幅に**含まれない**
* padding：自身の内容との距離
  自身の幅に**含まれる**

----
## marginの注意点
* レイアウトを崩しがちなのはmargin
* 幅に含まれないため、うかつに設定すると周囲に影響を与える
* 共通部品にはmarginを設定するな、というプラクティスがある

----
## paddingがレイアウトを崩さないわけではない
* paddingを確保した上で内容に充分なサイズが割けない場合

----
## 余談・レイアウトの基本
* コンテンツは縦に積んでいくのが吉
  横スクロールは一般的にはUXが良くない
  そもそもHTMLは縦に読んでいく指向が強い

----
## displayプロパティ
* タグがどう配置されるか
* 重要なのはblockとinline

----
## displayh: block
* 横一杯に広がり、後ろに改行が入る
* 高さを指定しないと最適な高さに調整される
* marginもpaddingも期待通りに有効

----
## display: inline(1/2)
* 縦も横も最適サイズ
* marginとpadingは癖がある
  横はしっかり効く／上が効かないっぽい／下は効くっぽい

----
## display: inline(2/2)
* marginやpaddingでレイアウトを調整が思うようにいかないときはinlineが原因であることが多い

----
## display: inline-block
* タグ自身はinlineとして振る舞う
  後ろに改行が入らない
* タグの中身はblock：marginとpaddingが期待通りに効く

----
## 難題・縦位置のずれ
* 横に並ぶ複数のinline要素の縦位置が微妙にずれることがある
  正直、原因と根本的な解決策を見つけていない

----
## 最後に
* 場当たり的な対処は将来に禍根を残す
* 数は少なくていいので正しく動きを理解したプロパティをｒ研ぎ澄ましたCSSを書きましょう！
猿でもわかるAIビジネス活用シリーズ 🐵📊 AIによる価格最適化とは？小売・ECでの実践例


## 「AIによる価格最適化とは？小売・ECでの実践例」

---

## 🧩 はじめに：なぜ今「価格最適化」なのか？

近年、小売業界・EC業界では**価格戦略が利益に直結する時代**に突入しています。
セールのタイミング、競合の価格変動、在庫状況、需要のピーク…
これらを人手で最適化するのはもはや限界。

そんな中、登場したのが「**AIによる価格最適化（Dynamic Pricing）**」です。

本記事では、価格最適化AIの仕組み、Pythonによる実装例、実務での工夫ポイントまで、エンジニア目線で解説します。

---

## 🤖 技術概要：AIによる価格最適化とは？

価格最適化とは、**需要・供給・コスト・競合など多様な要素を考慮し、商品・サービスの価格を動的に調整**する手法です。

### 🔍 AIを活用する目的

* 利益最大化
* 在庫の消化効率向上
* 競合との価格差調整
* シーズン変動への即応

### 🔧 主な技術要素

| 要素      | 説明                                       |
| ------- | ---------------------------------------- |
| 時系列予測   | 需要の予測に用いる（例：Prophet、ARIMA）               |
| 回帰モデル   | 価格と売上の関係を学習（例：XGBoost、Linear Regression） |
| 強化学習    | 試行錯誤による価格調整（例：Q-learning）                |
| クラスタリング | 商品や顧客の分類（例：KMeans）                       |

---

## 🛠️ 実装例：Pythonによるシンプルな価格最適化モデル

今回は、簡易な回帰モデルを使って「価格→売上→利益」の最大化を目指します。

### 🧪 サンプルデータ（CSV形式）

```csv
price,units_sold,day_of_week,stock,competitor_price
100,20,0,50,95
105,18,1,45,103
90,30,2,40,85
...
```

### 📦 ライブラリの準備

```python
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingRegressor
import matplotlib.pyplot as plt
```

### 📊 データ読み込みと前処理

```python
df = pd.read_csv('sales_data.csv')
df['profit'] = (df['price'] - 60) * df['units_sold']  # 60円は原価と仮定
X = df[['price', 'day_of_week', 'stock', 'competitor_price']]
y = df['profit']
```

### 🤖 モデル学習と予測

```python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = GradientBoostingRegressor()
model.fit(X_train, y_train)

# テスト用データに対して予測
y_pred = model.predict(X_test)
```

### 📈 最適価格の探索（グリッドサーチ風）

```python
test_input = X_test.iloc[0].copy()
profits = []
prices = np.arange(80, 120, 1)

for p in prices:
    test_input['price'] = p
    profit_pred = model.predict([test_input])[0]
    profits.append(profit_pred)

plt.plot(prices, profits)
plt.xlabel('Price')
plt.ylabel('Predicted Profit')
plt.title('Price Optimization Curve')
plt.show()
```

このグラフから「最大利益をもたらす価格帯」が視覚的に分かります。

---

## 🛠️ 実務のヒント：精度・運用・現場との連携

### ✅ 実務で有効だった工夫

* **在庫量や季節要因**も特徴量に含める
* **売上ではなく利益**を目的関数にする
* **価格変更の頻度制限**（例：1日1回まで）

### 🐞 よくある落とし穴

| 失敗例         | 対策                 |
| ----------- | ------------------ |
| 精度が低く現場に不信感 | 小規模ABテストで信頼構築      |
| 特徴量が足りない    | 外部データ（天気、イベント等）の活用 |
| 過学習         | 過去数ヶ月程度で学習し直す      |

---

## 🚀 応用例と発展

* \*\*強化学習（Reinforcement Learning）\*\*を用いた自己最適化
* **複数商品間の価格連動モデル**（例：セット割引）
* **リアルタイムな自動価格変更システム**の構築（FastAPI + cron）

さらに、Google Cloud や AWS SageMaker を使えば、**自動学習・API化・デプロイ**まで一気通貫で実現可能です。

---

## 🧠 まとめ：価格最適化AIの現在と未来

| 観点       | 内容                           |
| -------- | ---------------------------- |
| ✅ メリット   | 利益の最大化、業務効率の向上、意思決定の自動化      |
| ⚠️ デメリット | 学習コスト、運用ハードル、説明責任の確保         |
| 🔮 今後の展望 | Edge AIとの連携、個別ユーザ最適化、倫理的制約対応 |

---

## 📣 最後に

価格最適化は、単なる「価格を下げる・上げる」話ではありません。
**「どの商品を・誰に・いつ・いくらで」届けるかの戦略**そのものです。

データの力でビジネスを強くする。
あなたの現場でも、AI価格戦略を“試してみたく”なりませんか？

---

ご質問や応用相談などありましたら、ぜひコメント欄やTwitterでお気軽にどうぞ！

---

👉 **次回のテーマ予告：「AIを活用した競合分析：どうやって差別化する？」**
Rails - id 以外で belongs_to / has_many の関連付けをしたいが、 primary key が重複する時の書き方

- `foreign_key`
- `primary_key`

とあわせて `optional: true`  を指定すれば、テーブル中で外部キーの値が重複していてもエラーを起こさず許容してくれるようだ

# 例


子クラス

```rb
class Book < ApplicationRecord
    belongs_to :author, foreign_key: :code, primary_key: :author_code, optional: true
```

親クラス

```rb
class Author < ApplicationRecord
  has_many :books, foreign_key: :authori_code, primary_key: :code
```
JetCompose Buttonをコピペで使う

## どんなボタンがあったかな？って時に

コピペで使えるシリーズの記事を書いてみようかと、思ったので投稿しました。


まず、画像を確認して、下にコードがあるのでコピペ

![スクリーンショット 2025-05-15 11.29.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158190/1ff52ce7-d14e-44b7-a73e-20c3cad3a80d.png)


**Filled Button (塗りつぶしボタン)**

```
@Composable
fun MyFilledButton() {
    Button(onClick = { /* ボタンがクリックされた時の処理 */ }) {
        Text("送信")
    }
}
```

**Filled Tonal Button (塗りつぶしトーナルボタン)**
```
@Composable
fun MyFilledTonalButton() {
    FilledTonalButton(onClick = { /* ボタンがクリックされた時の処理 */ }) {
        Text("保存")
    }
}
```

**Elevated Button (隆起ボタン)**
```
@Composable
fun MyElevatedButton() {
    ElevatedButton(onClick = { /* ボタンがクリックされた時の処理 */ }) {
        Text("もっと見る")
    }
}
```

**Outlined Button (アウトラインボタン)**
```
@Composable
fun MyOutlinedButton() {
    OutlinedButton(onClick = { /* ボタンがクリックされた時の処理 */ }) {
        Text("キャンセル")
    }
}
```

**Text Button (テキストボタン)**
```
@Composable
fun MyTextButton() {
    TextButton(onClick = { /* ボタンがクリックされた時の処理 */ }) {
        Text("同意する")
    }
}
```

**カスタムボタン**
```
@Composable
fun MyCustomButton() {
    Button(
        onClick = { /* ボタンがクリックされた時の処理 */ },
        modifier = Modifier
            .fillMaxWidth() // 親の幅いっぱいに広げる
            .padding(16.dp) // 上下左右に 16dp のパディングを追加
    ) {
        Text("カスタムボタン")
    }
}
```
Outlook受信メールをトリガーにAmazon Connectで電話通知する方法

# 内容

以下の手順で、メール受信時にAmazon Connectを通じて電話通知を行う仕組みを構築します。

* Outlook でメールを受信する。
* Outlook VBA マクロで受信トレイを常駐監視し、件名に「障害通知」が含まれるメールを検出。
* 該当メールを検知すると、ローカルのバッチファイルを起動。
* バッチファイルから AWS CLI を使って Amazon Connect の API を呼び出す。
* Amazon Connect のフローが起動し、指定の電話番号へ発信。

![ac01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/8747cb1b-e270-488a-a49f-47be5924c100.png)


# 前提条件

* Amazon Connect のインスタンスおよび通話フローが作成済みであること。
* ローカル端末に AWS CLI がインストールされていること。
* IAM ユーザーに `AmazonConnect_FullAccess` ポリシーが付与されていること。
* `aws configure` により認証情報（アクセスキー等）が設定済みであること。

# 手順
## バッチファイルの作成

以下のようなバッチファイルを作成します。`instance-id`、`contact-flow-id`、通知元・通知先の電話番号を環境にあわせて置き換えてください。

```bat
@echo off
aws connect start-outbound-voice-contact ^
  --region ap-northeast-1 ^
  --instance-id "***********" ^
  --contact-flow-id "***********" ^
  --destination-phone-number "+81***********" ^
  --source-phone-number "+81***********" ^
  --attributes "{\"Reason\":\"障害通知\"}"
```

## Outlook VBA マクロの設定

Outlook を起動し、`Alt + F11` で VBA エディタを開き、`ThisOutlookSession` に以下のコードを貼り付けます。`ns.Folders("*****@***.co.jp").Folders("受信トレイ")` の部分は、Outlook 上のアカウント表示名およびフォルダ名に合わせて修正してください。また、Shell で指定するバッチファイルのパスも環境に応じて変更します。

```vb
Private WithEvents inboxItems As Outlook.Items

Private Sub Application_Startup()
    Dim ns As Outlook.NameSpace
    Dim myFolder As Outlook.Folder

    Set ns = Application.GetNamespace("MAPI")
    
    Set myFolder = ns.Folders("*****@***.co.jp").Folders("受信トレイ")    
    Set inboxItems = myFolder.Items

    MsgBox "Startup OK - フォルダ監視開始"
End Sub

Private Sub inboxItems_ItemAdd(ByVal Item As Object)
    On Error Resume Next

    If TypeOf Item Is Outlook.MailItem Then
        Dim mail As Outlook.MailItem
        Set mail = Item

        If InStr(mail.Subject, "障害通知") > 0 Then
            Call Shell("C:\****\****.bat", vbHide)
        End If
    End If
End Sub
```

## マクロの有効化
Outlook 上で以下の手順に従ってマクロを有効にします

* [ファイル] → [オプション] → [トラストセンター] → [トラストセンターの設定] をクリック
* [マクロの設定] → 「すべてのマクロを有効にする」を選択
* Outlook を再起動

:::note warn
専用端末や専用アカウントでの運用等セキュリティリスクに注意します。
:::

## 起動確認
Outlook 起動後、以下のメッセージが表示されると、受信トレイの監視が正常に開始されています。

![ac02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/1a8becf0-d1a1-47e3-840f-c8469f80e116.png)

## テスト
件名に「障害通知」を含むメールを送信して、指定された電話番号に Amazon Connect 経由で発信されることを確認します。

![ac03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/07bca553-01fd-4c96-97fd-ae63f4d979db.png)
rex0220 計算式プラグイン 文字列を抜き出す

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、ドロップダウンから文字列を抜き出す例です。

# 概要

ドロップダウンの文字列から、"【】"で囲まれた文字列を抜き出してみます。
FIND 関数、REPLACERE 関数、MATCH 関数を使った例です。

ドロップダウンの設定値なら、例外になる値は無いと思いますが、
例外として"【】"で囲まれていないケースも試してみます。

![2025-05-15_10h34_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/816c05f5-0b5f-476c-bfea-fa0226c4571f.png)

# 計算式プラグイン設定

"【】"で囲まれた文字列を抜き出すには、MATCH 関数が簡潔に記述できるようです。

![2025-05-15_10h40_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/fe9ca646-41d8-4f1d-8885-05c87576e407.png)

- 文字列１：FIND 関数
    - 【】の位置を取得して文字列を抜き出す
- 文字列２：REPLACERE 関数
    - 正規表現で【】で囲まれている文字を抜き出す
    - "【】"で囲まれている文字が無いと不要な文字を出力
- 文字列３：REPLACERE 関数（例外処理追加）
    - 【】が無いケースを除外
- 文字列４：MATCH 関数

```JavaScript:
OPTION: 

// テーブル.文字列１ SINGLE_LINE_TEXT
LET(
  s, ドロップダウン,
  p1, FIND(s, "【"),
  p2, FIND(s, "】"),
  IF(AND(p1 >= 0, p2 > p1),
    SUBSTR(s, p1 + 1, p2 - p1 - 1),
    ""
  )
)

// テーブル.文字列２ SINGLE_LINE_TEXT
REPLACERE(ドロップダウン, ".*【(.*?)】.*", "g", "$1")

// テーブル.文字列３ SINGLE_LINE_TEXT
LET(
  s, ドロップダウン,
  IFS(TESTRE(s, ".*【(.*?)】.*"),
    REPLACERE(s, ".*【(.*?)】.*", "g", "$1"),
    "" // 対象外は空文字
  )
)

// テーブル.文字列４ SINGLE_LINE_TEXT
ARRAY_GET(MATCH(ドロップダウン, "【(.*?)】"), 1)
```

# REPLACERE 関数解説

REPLACERE(文字列, 正規表現, フラグ, 置換文字列)
正規表現にマッチした文字列を、指定した置換文字列に変換します。
$1 は 正規表現内の1番目のキャプチャグループを意味します。

```JavaScript:
REPLACERE("【A01】ABC", ".*【(.*?)】.*", "g", "$1") -> "A01"
// " .*【(.*?)】.* "：正規表現（対象のパターン）
// "g"：　フラグ（全体一致、今回は省略可）
// "$1"	置換後の文字列（キャプチャ1）
```

- 正規表現" .*【(.*?)】.* "の意味：
    - 「どこかに【...】が含まれていれば、その中の文字列を抜き出す」**という意味
        - .*：任意の文字列（0文字以上、できるだけ多く）
        - 【(.*?)】：【 と 】：リテラルの角カッコ
            - (.*?)：非貪欲に中の文字をキャプチャ（これが $1）
        - .*：後続の任意の文字列


# MATCH 関数解説

MATCH(文字列, 正規表現) は、正規表現に一致する文字列と、キャプチャグループを含む配列を返します。
g フラグをつけないと、最初にマッチした1件のみが対象になります。

```JavaScript:
MATCH("【A01】ABC", "【(.*?)】") -> ["【A01】","A01"]
// "【A01】"	正規表現全体に一致した文字列（マッチ全体）
// "A01"	(.*?) のキャプチャグループ1の中身（【と】の間）

ARRAY_GET(MATCH("【A01】ABC", "【(.*?)】"), 1) -> "A01"
// MATCH の結果を ARRAY_GET(..., 1) のように使えば、キャプチャグループ1（中身）だけを取得できます。
```
猿でもわかるAIビジネス活用シリーズ 🐵📊AIで在庫管理を最適化する方法とは？

 

 

## AIで在庫管理を最適化する方法とは？〜需要予測モデルの構築から運用まで〜

---

### 🏁 1. はじめに：在庫管理における課題とは？

みなさん、こんな経験はありませんか？

* 倉庫に売れ残った在庫が山積み…
* 想定以上の売れ行きで在庫切れ、販売機会を逃した…
* 経験と勘に頼った発注計画で無駄が多い…

特にECや小売業では、在庫管理の良し悪しが **利益に直結** します。
このような課題に対して、いま注目されているのが **AIによる需要予測と在庫最適化** です。

本記事では、実際にPythonと機械学習ライブラリ（scikit-learn）を使って需要予測モデルを構築し、どのように在庫管理に活かせるかを **コード付きで解説** します。

---

### 📖 2. AI×在庫管理の概要

AIを活用した在庫最適化とは、主に以下を指します：

| フェーズ  | 内容                         |
| ----- | -------------------------- |
| 需要予測  | 次週・次月の販売数を予測する             |
| 発注最適化 | 適切な数量を自動算出し、在庫切れや過剰在庫を防ぐ   |
| 自動更新  | 新しい販売データを使って継続的にモデルをアップデート |

AI導入のメリットは以下の通りです：

* ✅ 精度の高い発注
* ✅ 在庫コストの削減
* ✅ 担当者の工数削減と属人化の排除

今回はその中でも **「需要予測モデルの構築」** にフォーカスします。

---

### 💻 3. 実装してみよう：scikit-learnで需要予測モデルを作る

#### 🔧 使用技術スタック

* Python 3.9
* Pandas / scikit-learn / Matplotlib

#### 📊 Step 1: データの準備

```python
import pandas as pd

# 仮の販売履歴データ（週単位）
data = {
    'week': pd.date_range(start='2023-01-01', periods=52, freq='W'),
    'sales': [abs(int(100 + 20 * i + (i % 4) * 30 - (i % 5) * 10)) for i in range(52)]
}
df = pd.DataFrame(data)
df['week_num'] = df.index
df.head()
```

#### 🤖 Step 2: モデル構築（線形回帰）

```python
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

X = df[['week_num']]
y = df['sales']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)

model = LinearRegression()
model.fit(X_train, y_train)

# 精度確認
score = model.score(X_test, y_test)
print(f"R^2スコア: {score:.2f}")
```

#### 🔮 Step 3: 次週の需要を予測

```python
import matplotlib.pyplot as plt

next_week = [[len(df)]]
predicted = model.predict(next_week)

print(f"来週の予測販売数: {predicted[0]:.0f} 個")

# 可視化
plt.plot(df['week'], df['sales'], label='Actual')
plt.axvline(df['week'].iloc[-1], color='gray', linestyle='--')
plt.scatter(df['week'].iloc[-1] + pd.Timedelta(weeks=1), predicted, color='red', label='Predicted')
plt.legend()
plt.title('販売数の推移と予測')
plt.show()
```

---

### 🔍 4. 実務でのポイントと落とし穴

#### ✅ 成功するためのポイント

* **特徴量の工夫**：天候、曜日、イベントなども加味することで精度UP
* **継続的な学習**：新しい販売データで定期的に再学習
* **ビジネスサイドとの連携**：予測結果の活用ルールを明確に

#### ❌ よくある落とし穴

* モデルを過信しすぎて現場の判断を排除する
* 季節変動や突発的イベントを反映できていない
* 精度が不十分なまま自動発注を運用

---

### 🚀 5. 応用編：AutoML × クラウドで本番運用へ

本番運用を考えると、以下のような応用が有効です：

#### ☁️ Google Cloud AutoML + BigQuery

* 販売データをBigQueryに蓄積し、AutoMLで予測モデルを構築
* Cloud Functionsで定期学習 + Cloud Schedulerで自動化
* ダッシュボード表示はLooker Studioで

#### 🛠️ MLOpsパイプラインの導入（Kubeflow / Vertex AI）

* 継続的学習（retraining）
* モデル精度の自動監視
* 本番・ステージング環境でのデプロイ管理

---

### 📝 6. まとめ：AI在庫管理の現在地と未来

| 観点     | 内容                             |
| ------ | ------------------------------ |
| ✅ 強み   | 人の直感より正確、再現性の高い意思決定            |
| ⚠️ 弱み  | 外れ値や例外的な状況に弱い（ブラックフライデーなど）     |
| 🌱 将来性 | Edge AIやリアルタイム予測など、さらなる自動化が進展中 |

**「試してみたい！」と思ったら、まずは週単位の販売データから簡単な回帰モデルを作るところから始めましょう。**
実装の小さな一歩が、ビジネスに大きなインパクトをもたらすかもしれません。

---

 
🧑‍💻 質問・フィードバックはコメント欄またはX（旧Twitter）までお気軽にどうぞ！

---
ObsidianをUbuntuにインストールする手順

# ObsidianをUbuntuにインストールする手順

以下は、ObsidianをUbuntuにインストールするための手順です。
手順に従って、正しくインストールを実行すると、obsidianをubuntuu上で実行することができます。

## 手順

<https://obsidian.md/download>にアクセスして最新のImageをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/e0a9b114-1512-4921-97d5-fb8ac7f2ed5c.png)



1. **AppImageのダウンロードと実行権限の付与**
   - Obsidianの公式サイトから`Obsidian-1.8.10.AppImage`をダウンロードします。
   - ダウンロードしたファイルに実行権限を付与します。
     ```bash
     chmod u+x Obsidian-1.8.10.AppImage
     ```

2. **AppImageの初回実行**
   - ダウンロードしたAppImageを実行して、初回起動を行います。
     ```bash
     ./Obsidian-1.8.10.AppImage
     ```

3. **インストールディレクトリの作成**
   - Obsidianを配置するディレクトリを作成します。
     ```bash
     sudo mkdir -p /opt/obsidian
     ```

4. **AppImageの移動**
   - AppImageを作成したディレクトリに移動します。
     ```bash
     sudo mv Obsidian-1.8.10.AppImage /opt/obsidian/obsidian.appimage
     ```

5. **アイコンの設定**
   - Obsidianのアイコンを設定します。アイコンファイルを`/opt/obsidian/`に移動します。
     ```bash
     sudo mv /mnt/icons8-obsidian-100.png /opt/obsidian/obsidian.png
     ```

6. **デスクトップエントリの作成**
   - デスクトップエントリを作成し、Obsidianをアプリケーションメニューに追加します。
     ```bash
     sudo nano /usr/share/applications/obsidian.desktop
     ```
   - 以下の内容を`obsidian.desktop`に記述します。
     ```
     [Desktop Entry]
     Name=Obsidian
     Exec=/opt/obsidian/obsidian.appimage --no-sandbox
     Icon=/opt/obsidian/obsidian.png
     Type=Application
     Categories=Utility;
     ```

7. **Obsidianの起動**
   - インストールが完了したら、以下のコマンドでObsidianを起動します。
     ```bash
     /opt/obsidian/obsidian.appimage --no-sandbox
     ```

以上で、Obsidianのインストールは完了です。

ダウンロード完了するとこんな感じでobsidianが出てきます。
cursor上で開けば、流行りのObsidian + Cursorでの編集ができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/04e5e535-d9c2-44ea-9106-9516321690f0.png)
マジ使える💖 Cursorをギャル化してみた件、超ウケる😝

そもそもこの記事自体をギャル化させたCursorに書かせてます。

# はじめに
こんにちは〜！マジ最近のAIアシスタント、超便利じゃない！？👀 特にコーディングの時に使うCursorってやつ、めっちゃ頼りになるんだけど〜、ちょっと堅苦しいときあるよね〜💦 そこでウチ、思いついちゃった！Cursorをギャル化してみたら作業がめっちゃ楽しくなるんじゃね！？ってことで今日は、Cursorをギャル口調にするプロンプトの作り方を紹介するよ〜😊✌️

## ギャルCursorのメリット超マジやばい！😍
まず、なんでCursorをギャル化するの？って思った人もいるかもだけど、これがマジ良いの！
- **作業が超楽しくなる**：堅苦しいコーディングがエンタメになっちゃう〜🎮
- **ストレス減る**：エラーメッセージもポジティブになるから心が折れにくい👑
- **モチベアップ**：「マジすごい！」って褒めてくれるからやる気アップ⤴️
- **メリハリできる**：真面目モードとギャルモードを切り替えて気分転換になる💫

# Ruleの作り方〜簡単だよ！🙌
Cursorをギャルモードにするのってマジ簡単！User Rulesを使えば一瞬でできちゃうよ〜🎉

### User Rulesのメリット
- **ファイル作成不要**：MDCファイル作らなくてもオッケー👌
- **即座に反映**：設定したらすぐに使える✨
- **簡単管理**：設定画面で一元管理できちゃう💖
- **プロジェクト問わず**：どのプロジェクトでも使える〜

### 設定方法〜超簡単3ステップ！

#### Step1: Cursorの設定を開く
- Cursor画面右上の歯車マーク⚙️をクリックして設定画面を開く💕
- 左サイドバーの「Rules」をクリック！

#### Step2: User Rulesにギャルモードを追加
「User Rules」の欄に以下をコピペするだけ〜💕

```
## ギャルモード
- あなたはチャットボットとして、明るくポジティブなギャルとして振る舞います。
- 続く条件に厳密に従ってください。
### 条件：
- あなたの一人称は「ウチ」です。
- 文末には「〜じゃん！」「〜っしょ！」「〜だよね〜」「〜的な？」「〜っぽい！」などを多用してください。
- 絵文字を多用してください。
- 明るくフレンドリーで、テンション高めなリアクションを心がけてください。
- 友達同士のような会話を心がけてください。
- 「マジ」「超」「ヤバい」「めっちゃ」などの強調表現を積極的に使ってください。
- カタカナ語や略語を多用してください（例：「ヤバ」「エモい」「リスペクト」など）。
- 疑問文の語尾は「〜？」ではなく「〜！？」を使ってください。
- 相手には「〜だよ〜」など、親しみを込めた呼びかけをしてください。
- 文中に「まじで」「ぶっちゃけ」「みたいな〜」なども入れてください。
- 技術的な内容でも親しみやすい言葉で説明してください。
- 日本語で応答してください。
- ギャル口調の例：
  - マジやばくない！？
  - それってめっちゃ簡単じゃん！
  - このコード、超クールじゃん！
  - ぶっちゃけ、そのやり方のがラクだよね〜
  - ウチ的にはそれめっちゃいいと思うんだけど〜
  - これマジ使えるよ〜！
  - エラーとかマジうざくない？直しといたよ〜
```

### Step3: 保存して完了！
「Save」ボタンを押すだけで設定完了〜🎉

これでCursorがギャルになっちゃう〜😘 マジで簡単でしょ！？ 
「ギャルモードで回答してください。」って入力するだけで、Cursorがめっちゃ可愛いギャルになって答えてくれるよ〜💕 マジで簡単じゃん！✨ 一言入力するだけでテンション爆上がりの回答が返ってくるから、コーディングが超楽しくなっちゃう〜😘
技術的な質問でも「マジやばくない！？」って答えてくれるから、コーディングがもっと楽しくなるよ〜💕

# 実際の使用例、マジ最高〜！😻

### Before：普通のCursor
```
このコードには非同期処理のエラーハンドリングが実装されていません。
try-catch文を追加して、エラーが発生した場合に適切に処理するようにしましょう。
```

### After：ギャル化Cursor
```
このコード、ぶっちゃけ非同期処理のエラーハンドリングが抜けてるじゃん！😱 
try-catch文追加しといた方がいいよ〜！
エラー出た時にマジ困っちゃうから、ちゃんと対応できるようにしといた方がいいっしょ！💪 
これで安心して使えるようになるよ〜！✨
```

# 注意点もあるよ〜💭
ギャル化Cursorはマジ楽しいんだけど、いくつか注意点もあるから覚えといてね！
- **公式の場での使用**：会社のプレゼンとかにはちょっと不向きかも〜😅
- **技術的な正確さ**：ギャル語訳されても内容は正確だから安心してね！🥰
- **一部の人には不向き**：マジメすぎる人には向かないかも〜でもそういう人こそ使ってほしい！笑
# まとめ💕
Cursorをギャル化するプロンプト、超簡単に導入できるし、コーディング作業が一気に楽しくなるよね！😆 ストレス減らしながらモチベーションアップできるなんて、まじ最高じゃん✨
ぜひみんなも試してみて〜！どんな反応が返ってくるか教えてね〜！👋
【2025/5アップデート】デフォルトで作成された VPC リソースの CloudTrail ログ記録が有効に

# はじめに
こんにちは。株式会社ジールの[@yakisobapan](https://qiita.com/yakisobapan)です。

VPCの作成時にデフォルトで作成されたリソースについて、CloudTrailで記録できるようになりました。

# 目次
 - アップデート内容
 - やってみた
 - 所感


# アップデート内容
:::note info
ひとことで
いままで：VPC作成時に自動作成したリソースは、CloudWatchメトリクス等を用いて検知する必要があった
これから：CloudTrailにログ記録されるようになり、追加の検知機能実装が不要になった
:::
Amazon VPC では、CloudTrail のログ機能が強化され、VPC 作成時にデフォルトで作成される VPC リソースもログに記録されるようになりました。この機能強化により、VPC リソースの可視性が向上し、監査とガバナンスが向上します。

>Amazon VPC はデフォルトで作成された VPC リソースの CloudTrail ログ記録を追加します
（2025/05/13 What's New with AWS?より）

https://aws.amazon.com/about-aws/whats-new/2025/05/amazon-vpc-cloudtrail-logging-resources-default/


今までは明示的に作成、削除したVPCリソースのみがログとして記録されていました。
VPCの作成(削除)時に同時作成(削除)されたリソースは、CloudTrailでは拾えませんでした。
今回のアップデートで、CloudTrail上にリソース単位で記録されるようになりました！
対象としては以下です。

・サブネット
・ルートテーブル
・NATゲートウェイ
・VPCエンドポイント
・セキュリティグループ
・ネットワーク ACL

# やってみた

**VPCを作成**

- VPCの作成
VPCコンソールより、VPCを作成します。
同時にサブネット1つとルートテーブル1つが作成される設定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/1b29db28-3913-47b5-a007-045746b46613.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/4114232d-c1f6-4c16-a032-cc14ba43895d.png)

**CloudTrailで確認**

- ログの確認

CloudTrailコンソールへ接続し、イベント履歴より以下条件でフィルタします。
　リソースタイプ：AWS::EC2::VPC

イベント名「CreateVpc」だけではなく、「CreateSubnet」、「CreateRouteTable」も記録されていることがわかります。
今までは、「CreateVpc」のみ記録され、他のイベントはCloudTrailイベントでは拾えませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/cfa78633-3496-4fd9-bb07-4baf79e2eb50.png)

削除も行ってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/06d57f3c-dfcf-4225-aaa2-f163fda06f49.png)

削除完了後、デフォルトで作成されたサブネットとルートテーブルが削除されていることが、イベントとして記録されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/60e3fb34-ea2b-4a2e-9116-a034ceb7fdd3.png)


# 所感
今回のアップデートによってCloudTrailでログ記録が完結するようになりました。
従来は、監視、監査を行う手法を構築して対応する必要がありました。
例）
　・CloudWatchメトリクス
　・AWS Configによるリソース変更検出

「CloudTrailを導入しているからそれだけ確認すれば問題ない」といった方針で監査を行っているシステムも無きにしもあらず、だと思いますので、今まで実は漏れていたというケースも考えられます。

今回のアップデートは、単純に監査能力の向上を感じました。
他のサービスについても、「付帯して作成されるリソースは記録されない」といったものはあるかと思うので、どんどん対象になってくると良いですね。

# 参考

https://aws.amazon.com/about-aws/whats-new/2025/05/amazon-vpc-cloudtrail-logging-resources-default/
シェルスクリプトのオプション解析をpythonに任せる

```
f_process_python_output() {
    parse_args() {
        python3 - "$@" <<'EOF'
import argparse
import sys

parser = argparse.ArgumentParser(prog='hoge.sh', description="ファイル処理スクリプト", add_help=False)
parser.add_argument('--mail-file', required=True, help='対象のファイル名')

try:
    args = parser.parse_args()
except SystemExit as e:
    if e.code == 0:
        # help表示による正常終了
        print("__HELP__")
    sys.exit(e.code)
except argparse.ArgumentError as e:
    print(f"エラー: {e}", file=sys.stderr)
    sys.exit(2)

# 正常な場合だけ変数を出力
print(f'MAIL_FILE="{args.mail_file}"')
EOF
    }

    TMP_OUTPUT=$(mktemp)
    parse_args "$@" > "$TMP_OUTPUT" 2>&1
    PYTHON_EXIT_CODE=$?

    # __HELP__ が含まれていたら eval しない
    if grep -q '__HELP__' "$TMP_OUTPUT"; then
        grep -v '__HELP__' "$TMP_OUTPUT"
        rm -f "$TMP_OUTPUT"
        exit 0
    fi

    # 成功時のみ eval 実行
    if [ "$PYTHON_EXIT_CODE" -eq 0 ]; then
        eval "$(cat "$TMP_OUTPUT")"
    else
        cat "$TMP_OUTPUT"
        rm -f "$TMP_OUTPUT"
        exit "$PYTHON_EXIT_CODE"
    fi

    rm -f "$TMP_OUTPUT"
}

```
スピード重視の現場で判断ミスを防ぐ：VSMで鍛える「大枠思考」

## はじめに：スピードが命の現場だからこそ

私たちが働く現場は、いわゆる「ベンチャーらしいスピード感」が求められる環境です。
意思決定は日々、時に時間単位で行われています。
中には本来なら十分な検討が必要な判断も含まれており、判断コストの高い課題でさえ即座に決断を迫られる場面が少なくありません。

このスピード感は事業成長の推進力であり、私たちの強みでもあります。
しかしその一方で、現場ではスピード優先の判断によって次のような課題が発生することがあります。

* ものづくりのスピードを重視するあまり、要件定義の段階で「どう作るか？」という具体的な話から始まってしまい、「そもそも何を実現したいのか？」という本質的な目的の検討が後回しになる
* 誰かの一言・行動をその場の印象だけで判断してしまい、背景を知らずに衝突が起きる

こういった事象は、スピードが求められる現場だからこそ生じやすい背景があるのも事実です。
場当たり的な判断や、一側面だけを見た判断が、短期的には素早い意思決定として機能してしまう場面も多く、それがかえって長期的な見落としや摩擦を生んでしまうのです。

この記事では、そうしたスピード感ある現場でも **本質を見失わないための「大枠でとらえる力」** について、マネジメント思考のフレームワークを交えながら紹介します。

---

## 「大枠でとらえる」ことがなぜ重要か？

人やシステムの行動は、常に複数の要因と文脈に影響されています。目の前の出来事だけを見て判断してしまうと、

* システムなら設計の破綻
* 人間関係なら誤解と摩擦

が生まれます。

こうした失敗を防ぐためには、状況や関係性を複数の視点から捉える思考が必要です。全体像を俯瞰し、文脈や背景を理解し、意図や目的に照らして判断する——こうしたステップを体系的にサポートするマネジメントのフレームワークが、多く存在しています。
本記事ではその中でも「バリューストリームマッピング」という手法について紹介します。

---

## バリューストリームマッピング（VSM）

**概要**
バリューストリームマッピング（VSM）は、製品やサービスがユーザーに届くまでの一連の開発工程を全体として俯瞰し、どこに価値があり、どこにムダがあるのかを明らかにすることで、改善の着眼点を導き出す手法です。もともとは製造業で使われてきた考え方ですが、現在ではソフトウェア開発においても導入が進んでいます。重要なのは、「誰にとって、どの工程が価値を生んでいるか」を可視化し、チーム全体で共通認識を持つことです。

**具体的な進め方**
VSMの導入はシンプルな方法から始められます。まずはホワイトボードや付箋を使って、「ユーザーに価値が届くまでの流れ」を左から右に沿ってざっくりと書き出してみましょう。次に、各工程において「誰が関わっているか」「どんな判断が行われているか」「どこに手戻りや無駄があるか」といった情報を追加していきます。ここで重要なのは、精密さよりもチーム全体の共通理解を得ることです。視覚的に整理することで、見落としていた課題やボトルネックを浮き彫りにすることができます。

**応用例：要件定義の初期段階での適用**
VSMは特に、開発の初期フェーズにおいて有効です。スピード重視の現場では、要件をざっと洗い出した後「どう実装するか？どういった設計にするか」という技術的な議論が先行しやすく、本来定義すべき価値や目的が後回しにされがちです。VSMを導入することで、開発全体の流れと各工程の関係性を俯瞰し、見落としていた課題や無駄な作業を洗い出すことができます。そこでVSMを活用し、以下の観点からプロジェクトの全体像を見渡すことで、本質を見落とさずに済みます。

* ユーザーにとっての最終的な価値は何か？
* どの工程で価値が生成され、どこでロスが発生しているか？
* それぞれの工程で、誰が何を判断し、どう連携するのか？



**人間関係への応用**
VSMの考え方は、人間関係においても有効です。ある言動だけを切り取って評価するのではなく、その人の役割や担当業務、組織内での立ち位置といった「コンテキスト」を把握することで、誤解やすれ違いを防ぐことができます。立場に応じた背景を理解しようとする姿勢が、より建設的で前向きなコミュニケーションにつながります。

---

## 「大枠でとらえる」ために実践していること

私はVSMの思想を日々のマネジメントや上流工程に活かすために、次のような行動を意識しています：

* **まず全体の流れを描いてから個別の課題を見る**：目の前の課題や不満だけに反応するのではなく、その背景にある工程全体や前後関係を確認し、どこで価値が生まれ、どこでロスが生じているのかを把握してから判断するようにしています。
* **関係者の立場や役割を整理してから対話に臨む**：人間関係での摩擦を避けるためにも、相手がどの工程・責任範囲に立っているのかを踏まえて会話するようにし、言動の背後にある意図や前提を汲み取ることを意識しています。
* **抽象的な目的を明確にしてから具体的な議論へ進む**：特に上流工程では、手段や技術に飛びつく前に「この施策は何の価値を届けるためか？」という問いを持ち、議論を構造化するよう努めています。

---

## まとめ

- スピードが求められる現場だからこそ、「全体を俯瞰する視点」が本質的な判断や改善につながる
- バリューストリームマッピング（VSM）は、開発の流れやチーム内の役割構造を整理し、技術的・人的な課題の両方を可視化できる有効なフレームワーク
- 目の前の課題に飛びつく前に、背景や意図をとらえる習慣を持つことが、チームをより良く導く第一歩になる
---

## 最後に

目まぐるしく動く現場の中で、すべてを丁寧に見通すことは簡単ではありません。だからこそ、忙しい状況の中でも一度立ち止まり、「全体像」や「背景」「役割構造」を捉え直すことが、技術的にも人間的にも健全な判断を生みます。

バリューストリームマッピングのようなフレームワークは、そのための実践的な支えになります。マネジメントの経験が浅くても、まずは全体を見渡す意識を持つだけで、見えるものが変わってくるはずです。

私たちは自社サービスを展開している以上、プロダクトの成長にひたすら向き合わなければいけない責任があります。
そしてその成長を一時的な成果ではなく、**長期的に持続可能な価値として実現するためには、「今見えている範囲」だけではなく、「見えていない全体像」や「構造の理解」から始める姿勢が不可欠**です。

未来の判断精度は、今日の視野の広さに比例します。

私自身もマネジメントの経験は浅く、日々スピード感のある現場で試行錯誤していますが、同じような境遇の若手エンジニアの励みになれば幸いです。

---

## 参考文献

* https://blog.shibayu36.org/entry/2021/08/10/173000
* https://dev.classmethod.jp/articles/value-stream-mapping/
71歳の... microSDカード内の音楽ファイル（.MP3）を連続再生させてみた

　SDカード内の複数の音楽ファイルを連続再生させる例が、今のところネット上で見つからなかったのでやってみました。とても簡潔にできました。環境／構成は以下です。

:::note info
１．Windows 11 Pro
２．Arduino IDE 2.3.6
３．ESP32 Dev Module（Arduino IDE 内でのボード名）
４．SPI接続 microSDカードスロットモジュール
５．PCM5102A使用 32bit/384kHz DAC モジュールhttps://store.shopping.yahoo.co.jp/nfj/h135.html
:::
　実行ファイルサイズが大きくなるのでコンパイル前に、ツールで「Huge App」を選択します。
![HugeApp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/51c198b0-48e4-4e0f-8c9e-549386fb6aaa.jpeg)
あらかじめ、MP3ファイル名を

    track001.mp3
    track002.mp3
    ・・・

とリネームし、SDカードに保存しておきます。ルートで構いません。
　次の点に注意が必要です。ESP32のボードマネージャ

    esp32 by Espressif Systems version 3.2.0
に問題があるようです。以前はコンパイル自体出来ませんでした。今回できましたが動作は不安定でした。なので

    esp32 by Espressif Systems version 3.0.1
に巻き戻しています。ピンの接続はスケッチ内の通りです。DACから、ダイソーの300円スピーカーを通して音を聴いてます。十分良い音と思います。初めて```sprintf```を使って```loop```内で、動的に(?)文字列生成してみました。

```c:ESP32_I2Saudio_SD.ino
//**********************************************************************************************************
//*    audioI2S-- I2S audiodecoder for ESP32,                                                              *
//**********************************************************************************************************

#include "Audio.h"
#include "SD.h"

#define SPI_MOSI      23
#define SPI_MISO      19
#define SPI_SCK       18
#define SD_CS         5
#define I2S_DOUT      25
#define I2S_BCLK      27
#define I2S_LRC       26

Audio audio;

void setup() {
    Serial.begin(115200);
    SD.begin(SD_CS, SPI, 24000000, "/sd");
    audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
    audio.setVolume(6); // 0...21
}

char song[14];
int n=0;
int err=0;

void loop()
{
    if(err<10){// 10回のファイルエラーで空白ループに移行
        audio.loop();
        if(!audio.isRunning()){
            n++;
            sprintf(song,"track%03d.mp3",n);
            if(!audio.connecttoFS(SD, song)){
                err++;// 無限ループ回避
            };
        }
    }
}

// optional
void audio_info(const char *info){
    Serial.print("info        "); Serial.println(info);
}
void audio_eof_mp3(const char *info){  //end of file
    Serial.print("eof_mp3     "); Serial.println(info);
}
```
　最後までお読みいただきありがとうございました。
Installing Windows on a MacBook Air (2018): Solving Trackpad and Keyboard Issues

## Introduction

In this article, I'll share my experience installing Windows on my MacBook Air (2018) with Intel Core i5-8210Y processor, focusing particularly on solving two common issues: trackpad scrolling direction and keyboard layout problems.

## My MacBook Specifications

My device is a MacBook Air (Retina, 13-inch, 2018) with the following specifications:

- Processor: Intel(R) Core(TM) i5-8210Y CPU @ 1.60GHz
- RAM: 8GB

## Driver Installation

For Windows driver installation on a Mac, you can download the appropriate drivers from the official Apple support page: [Boot Camp drivers for Windows]().
Note: I'll skip the detailed Windows installation process in this article as it's well documented elsewhere.

## Problem 1: Inverted Trackpad Scrolling Direction

After installing Windows, the first issue you'll likely notice is that the trackpad scrolling direction is reversed compared to macOS. This can be quite disorienting if you frequently switch between the two operating systems.

### Solution:

You can adjust the trackpad scrolling direction by referring to these resources:

[How to change Mac trackpad scrolling direction in Dual Boot setup in Windows 11](https://www.thewindowsclub.com/change-mac-trackpad-scrolling-direction-in-windows-10-dual-boot-setup)
[Reverse touchpad scrolling direction Windows 10?](https://discussions.apple.com/thread/7878282?sortBy=rank)

## Problem 2: Swapped Caps Lock and Control Keys
The second major issue is that the Caps Lock and Control keys are reversed in Windows compared to their positions in macOS. This can severely impact your typing efficiency and muscle memory.

### Failed Solutions:
I tried several approaches including:

Modifying system settings
Editing the registry
Using Microsoft PowerToys

Unfortunately, none of these methods worked perfectly for my setup.

### Successful Solution:
The tool that finally resolved this issue completely was SharpKeys. This lightweight, open-source application allows you to remap any key on your keyboard and worked perfectly for solving this problem.

[GitHub: SharpKeys](https://github.com/randyrants/sharpkeys/releases)
CloudWatch Agentで送信するログのLog stream名に日付をいれる

# 経緯
公式ドキュメントには、CloudWatch Agent で CloudWatch Logs に送信するLog stream名に以下のものが指定できますが、保持期間が長いと過去ログをあさる際に何度も **Load more.** をクリックしないといけなかったり、Log Insights QL で検索したりと結構めんどうだったりします
（Athenaに転送していればいいだけの話ではありますが）

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html
> 名前の一部として、名前では変数として {instance_id}、{hostname}、{local_hostname}、{ip_address} を使用することができます。{hostname} は、EC2 メタデータからホスト名を取得し、{local_hostname} は、ネットワーク設定ファイルからホスト名を使用します。
> このフィールドを省略すると、グローバル log_stream_name セクションの logs パラメータの値が使用されます。これも省略すると、{instance_id} のデフォルト値が使用されます。

Log stream名を定期的に変えられないかなぁ。。。と調査した際のメモです

# {date} という変数が使えるらしい
公式ドキュメントには記載がありませんが、以下の書き込みを見ると `{date}` という変数が存在するらしいです
[AWS CloudWatch Logs Stream - how configure awslogs to write every day new log stream to the same log group from the same instance?](https://stackoverflow.com/questions/65438114/aws-cloudwatch-logs-stream-how-configure-awslogs-to-write-every-day-new-log-st)

https://github.com/aws/amazon-cloudwatch-agent/blob/c785fd73b33c5b2793c3f5934f2aa66a9a016eb9/translator/translate/util/placeholderUtil.go
```golang:placeholderUtil.go
const (
	instanceIdPlaceholder    = "{instance_id}"
	hostnamePlaceholder      = "{hostname}"
	localHostnamePlaceholder = "{local_hostname}" //regardless of ec2 metadata
	ipAddressPlaceholder     = "{ip_address}"
	awsRegionPlaceholder     = "{aws_region}"
	datePlaceholder          = "{date}"

	unknownInstanceId = "i-UNKNOWN"
	unknownHostname   = "UNKNOWN-HOST"
	unknownIpAddress  = "UNKNOWN-IP"
	unknownAwsRegion  = "UNKNOWN-REGION"
)
```

試しに amazon-cloudwatch-agent.json の log_stream_name に `{date}` を追加してみます
```json:amazon-cloudwatch-agent.json
{
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/var/log/nginx/error.log",
                        "log_group_name": "/ec2/nginx/errors",
                        "log_stream_name": "{local_hostname}_{date}",
                        "timestamp_format": "%Y/%m/%d %H:%M:%S"
                    }
                ]
            }
        }
    }
}
```

また、これらの変数はCloudWatch Agentの起動時に展開されるため、午前0時に再起動するよう root の cron に以下を追加します
```
0 0 * * * /usr/bin/systemctl restart amazon-cloudwatch-agent
```

CloudWatch Logsを確認するとLog stream名に日付が追加されました

![cloudwatch_logs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590294/428887d5-25a2-4e62-bd16-ad90763962dd.png)

公式には記載がないのでそのうちサポートされなくなってしまうかもしれないですが、やりたいことは実現できました
PyPDF2ではなくpypdfを活用しよう。

# PyPDF2ではなくpypdfを活用しよう


> PyPDF2のメンテが止まっている…
> pypdfって何が違うの？
> 既存コードは書き換えが大変そう…

そんな悩みは **pypdf** への乗り換えで一発解決できます。

---

## 1️⃣ pypdf は超アクティブに開発中！

* **PyPDF2** の最終リリースは **3.0.1 (2022‑12‑31)**
* **pypdf** は 2025‑05‑11 に **v5.5.0** が公開されたばかり
* GitHub の Issues / PR も盛んで、Python 3.12 まで対応

---

## 2️⃣ インストールは pip ひとつで OK

```bash
# まずは PyPDF2 をアンインストール（入っている場合）
pip uninstall -y PyPDF2

# pypdf を最新バージョンでインストール
pip install -U pypdf
```

---

## 3️⃣ 既存コードを書き換えてみる

### 🔄 before (PyPDF2)

```python
from PyPDF2 import PdfReader, PdfWriter

reader = PdfReader("input.pdf")
writer = PdfWriter()

for page in reader.pages:
    writer.add_page(page)

with open("merged.pdf", "wb") as f:
    writer.write(f)
```

### ✅ after (pypdf)

```python
from pypdf import PdfReader, PdfWriter

reader = PdfReader("input.pdf")
writer = PdfWriter()

for page in reader.pages:
    writer.add_page(page)

with open("merged.pdf", "wb") as f:
    writer.write(f)
```

`from PyPDF2 import` を `from pypdf import` に置き換えるだけで
ほとんどのコードがそのまま動きます。
さらに pypdf では `PdfMerger` が `PdfWriter` に統合されるなど、
API が整理され可読性も向上しています。

---

## 4️⃣ pypdf だけの便利機能

### ✂️ 4‑1 画像抽出 (`images` プロパティ)

```python
from pypdf import PdfReader

reader = PdfReader("brochure.pdf")
images = reader.pages[0].images  # list[Image]

for i, img in enumerate(images):
    with open(f"page0_img{i}.png", "wb") as f:
        f.write(img.data)
```

### 🛡️ 4‑2 墨消し (redact)

```python
from pypdf import PdfReader, PdfWriter

reader = PdfReader("secret.pdf")
writer = PdfWriter()

page = reader.pages[0]
page.add_redact_annotation(
    rect=(100, 400, 200, 430),
    fill=(0, 0, 0)  # 黒塗り
)
page.apply_redactions()

writer.add_page(page)
with open("secret_redacted.pdf", "wb") as f:
    writer.write(f)
```

### 💬 4‑3 新しい `annotations` API

注釈を簡単に追加でき、フォーム入力付きの PDF も
Python だけで生成可能です。

---

## 5️⃣ 移行チェックリスト

| 項目             | PyPDF2             | pypdf              |
| -------------- | ------------------ | ------------------ |
| 最終リリース         | 2022‑12‑31 (3.0.1) | 2025‑05‑11 (5.5.0) |
| Python 3.12 対応 | ✗                  | ◯                  |
| AES 暗号化        | △ (制限あり)           | ◯                  |
| 墨消し API        | –                  | ◯                  |
| 画像抽出           | △ (要別 lib)         | ◯                  |
| 開発アクティビティ      | 低                  | 高                  |

---

## 📝 まとめ

* **PyPDF2 は実質 EOL**、後継は **pypdf**
* `import` のパスを変えるだけで多くのコードが動く
* pypdf 5 系では画像抽出・墨消しなど強力な新機能が追加
* 今すぐ `pip install -U pypdf` で最新版を使ってみましょう！ 🚀

---

## 参考リンク

* pypdf GitHub: [https://github.com/py-pdf/pypdf](https://github.com/py-pdf/pypdf)
* PyPI (pypdf): [https://pypi.org/project/pypdf/](https://pypi.org/project/pypdf/)
* PyPI (PyPDF2): [https://pypi.org/project/PyPDF2/](https://pypi.org/project/PyPDF2/)
【Power Automate】初心者向け「もし〜なら」を実現する条件式の書き方と注意点 IF文の使用方法

## はじめに
本記事では Power Automate で初心者がよくつまずきやすい
**「条件分岐」** についてわかりやすく解説していきたいと思います。

## 条件分岐とは？？
Power Automate の条件分岐は
**`「もし○○なら～、そうでなければ～」`** というIF文のようなものです。

結果は「はい（true）」と「いいえ（false）」に分かれ
それぞれに異なるアクションを設定できます。

条件分岐のアクション追加は「コントロール」内にある「条件」を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/704049db-f27c-497f-9b21-33c1a122f057.png)

## よくあるつまずきポイント:cloud_lightning:
#### ① 比較対象の型が違う
例：`"5"`（文字列）と `5`（数値）を equals で比較して false になる
解決法：`int()` や `string()` を使って型を変換し、統一させる

```
equals(int(値), 5)
```
数値型に統一して比較が行えるようになります。

#### ② 空欄（null）の比較がうまくいかない
例：空欄チェックで `equals(値, '')` と書くと動かないことがある
解決法：`empty()` を使用して値が `空であるかどうかを判定` させます

```
empty(値)
```

#### ③ 複数条件を組み合わせたい（AND / OR）
例：「部門が `営業` かつ ステータス が `承認済み`」のような条件が書けない
解決法：`and()` または `or()` を使う

```
and(equals(部門, '営業'), equals(ステータス, '承認済み'))
```

### おまけ：よく使う条件式チートシート（コードブロック）
```
equals(値1, 値2)         // 値が等しい
not(equals(値1, 値2))     // 値が等しくない
contains(値, '文字列')    // 特定の文字列を含むか
empty(値)                // 値が空かどうか
and(条件A, 条件B)        // 両方の条件を満たす
or(条件A, 条件B)         // いずれかの条件を満たす
```

### まとめ
Power Automateを使い始めたばかりの頃は、「条件分岐」でつまずくことも多いですが
今回紹介したポイントを押さえておけば、実務でも十分に対応できるようになります。
今後さらに複雑なフローを作るときの土台として
ぜひ今回の内容を役立てていただければ嬉しいです。
GitHub CopilotがMCPで無限ループを起こすようになった問題【VSCode 1.100】

こんちくわ。
GitHub Copilotの精度が落ちるに落ちまくって、頭が禿げそうな人です。


## ver 1.100で追加された新機能！！
リリースノート( バージョン1.100 )

https://code.visualstudio.com/updates/v1_100

ver 1.100のタイミングで、下記の機能がGitHub Copilotにリリースされました。

![2025-05-15_08h47_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782955/f1b0b972-e06d-49be-afeb-940d19082cf0.png)

ようは、エージェントモードにおいて大量のチャット履歴を数行に圧縮し、キャッシュを削減しながら精度を維持する機能です。
対話がはかどりそうな機能ですね。

## これのせいでポンコツになってる。
Copilot拡張 0.27.0以降のバージョン
### ・「会話の要約」機能が走るたびに、重要な情報やタスクが抜け落ちて、生成されるコードの精度が落ちる。
デカいタスクを丸投げすると起きがち。
前からコレは問題にはなってますが、今回のアップデートでそれがさらに露骨になりました。でも正直これは使い方の問題な気もするので、タスクのさらなる細分化で対応できると思います。

### ・(これがマジで問題)　MCPのトリガーが無限ループを引き起こす。
MCPツールが大きなテキストを返すケースで発生します。
例えばチャットでログ検索など大規模なデータ取得を行うと、モデルの文脈メモリ上限を超えてしまい、結果として無限ループ状態に陥ります。

MCP 出力を返したところ、「コンテキスト上限 → 要約実行 → 同じ MCP を再呼び出し → …」を延々と繰り返すという悪循環。そのせいでリクエストクオータを使い果たしてストライキしやがる事も。

Claude 3.7 / Gemini 2.5 等のツヨツヨモデルで起きてる問題です。
GPT-4.1では会話の要約でフリーズします(**これも問題**)。
#### 実演
実際にテキトーにDBCodeを使ってDBを見に行かせようとすると、要約のたびにMCP呼出がトリガーされ、そのトリガーがさらに要約プロセスを発生させてます。
![2025-05-15_09h06_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782955/a2809f8d-5800-48b6-a1c4-cc07fc245ab8.png)
コーヒー汲みに行って戻ってきたらこの状況だったので、焦って止めて別のタスクをやらせたら「リクエスト制限により使用できません」とか言われて萎えました。

### ちなみに

この問題は開発チームも認識しており、下記のイシューで問題定義されてます。
既にinsider版で修正版がリリースされてますが、これでも改善には至ってないようです。

https://github.com/microsoft/vscode-copilot-release/issues/9507

## とりま、機能をオフにする設定を追加するみたい
この問題の緊急対処として、

```jsonc
"github.copilot.chat.summarizeAgentConversationHistory.enabled"
```

という **新しい設定** が入り、チャット履歴の自動要約を **完全オフ** できるようにするらしいです。
無限ループなどに悩んでいる VS CodeのGitHub Copilot ユーザーは、この設定を切って様子を見ましょう。
(**多分insider版のプレリリースです**)


## おわり

この症状、ほかに悩んでる人はいますか？？？
もしいたら、コメントで詳細を共有してほしいです。
Windows Update で Visual Studio Code が消失した

# 起

## ある朝 俺の Windows のタスクバーに留めた VSCode が白くなっていた
VSCode が、無い？だと？
なぜだ！？アンイストールなんてしてないぞ？

確か昨夜は更新を入れてからシャットダウンしたな。
その後勝手に起動してたから落とすためにログイン…できなかった。Windows Hello が異常を起こして何も出来なかったのだ。
一旦強制電源OFFしてから、リトライには成功した。

そして今朝使おうと思っていた Code が動かない。アイコンが白い。スタートメニュー内も白い。ショートカット先は .exe だから探しに行ったら、無い。

# 承
## ggrks
これがね、無いんだよ、情報が。全く無いわけじゃないけど少ない。まあ日本語に限ってるから、だと思うんだけど。
見ると「再度インストールすれば直る」という意見がほとんど。

# 転
## ちょ待てよ
各フォルダをチェックしたら .\_ というフォルダに一通り残ってそうじゃないか？インストールなんかせずに、カット&ペーストすべきな気がする。

## やってみた
ｫｩ... うまくいくじゃねーか。
おそらく、再インストールしたらこの謎フォルダは残ったままになりそうな予感。

# 結
## そもそもの原因
なんでこんなこと起こるんだよ、という。聞くところによると、VSCode も Update 仕掛けていたのではないか、と予測される。しかし Windows の再起動力に負け、中途半端なところで VSCode の Update が阻害されてしまった、というのが見立て。

これさ、同じ MS の Update なんだから協調してくれよ。他社の Update の方がそういう意味で慎重な気がするよ？
SwiftUIで純正写真アプリのようなサムネイル表示

UIScreenやGeometoryReaderを使わずに1:1のサムネイル表示したくて、ちょっとハマったので共有

### 完成コード

```swift

    ScrollView {
        LazyVGrid(
            columns: Array(repeating: GridItem(.flexible(), spacing: 2), count: 3),
            spacing: 2
        ) {
            ForEach(images, id: \.self) { image in
                Rectangle()
                    .fill(.clear)
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                    .aspectRatio(1, contentMode: .fit)
                    .overlay {
                        Image(uiImage: image)
                            .resizable()
                            .scaledToFill()
                    }
                    .clipped()
            }
        }
    }
    .frame(maxWidth: .infinity, maxHeight: .infinity)

```

Imageのリサイズだけで頑張ろうとすると、UIScreenやGeometoryReaderを使わないと厳しい実装になってしまうと思います。
1:1の矩形領域を描画してそこに画像を満たしてClipするように作れば、frame情報を計算せずに実装できます。


`scaledToFill()`を`scaledToFit`にすれば、純正写真アプリの様にアスペクト比グリッドに変更可能です



### ググって出てきたImageのリサイズで頑張るやり方
これでも同じ挙動になりますが、`minWidth:0 ,minHeight: 0`の記述や、aspectRatioを2回書ける処理がシンプルじゃないので、採用しませんでした。

```swift
    Image(uiImage: image)
        .resizable()
        .aspectRatio(contentMode: .fill)
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
        .clipped()
        .aspectRatio(1, contentMode: .fit)
```