OmniAICreator/Qiita-1.07M huggingface dataset:
【AI-102 合格体験記】Azure AI Engineer Associate

## 概要
今更ですが、Azureの資格の一つ、`AI-102: Azure AI Engineer Associate`に合格したので誰かの役に立てばと思い情報を残しておきます。

### 受験の動機
- 生成AIを含めたAzure AI Serviceでできることの理解
- 個人開発および仕事で使える技術強化のため
- 学習の結果が目にみえる形で残ることで、個人的に嬉しくなるため

### 所感・結果

Score: 841点/1000点
受験回数: 1回
総勉強時間: 25h（5日間のAzure AI Serviceの講座 4h×5、自学5h）

## AI-102とは
[こちら](https://learn.microsoft.com/ja-jp/credentials/certifications/azure-ai-engineer/?practice-assessment-type=certification)に詳細がまとまっています。
これまで学習や試験の内容を踏まえると、`Azure AI Serviceでできること・できないこと知りシステム設計の舵取りをするひと向け`の資格です。合格するためには、Azure AI Services全般の機能の理解、AI Modelのカスタマイズ、簡易的なデモシステムの実装経験、またAPI・SDKを用いてAIを呼び出す仕組みについてもざっくりと理解している必要があります。

## 学習方法
大きく4点を利用しました。
1. [トレケノート社](https://www.trainocate.co.jp/): Azure AI Services講座（2h/日*5日間, 社内の試みで参加できたため）
1. [MS LearnのラーニングPATH](https://learn.microsoft.com/ja-jp/training/courses/ai-102t00)
1. [MS Learn Practice Assessment](https://learn.microsoft.com/ja-jp/credentials/certifications/azure-ai-engineer/practice/assessment?assessment-type=practice&assessmentId=61&practice-assessment-type=certification)
1. Microsoft Document


振り返ってみると2でのハンズオン学習が最も効果的でした。1のセミナーでは、全体に合わせて説明が進んでしまったため、深く理解するだけの時間が確保できませんでした。しかし、後日MS Learnのラボ環境（例: [AI SearchのLab](https://learn.microsoft.com/ja-jp/training/modules/create-azure-cognitive-search-solution/8-exercise-search)）を利用して、自分の手を動かしながら学んだことで試験にとどまらない開発知識を得ることができました（英語のマニュアルを読み解く必要があります）。

2を時間をかけて実施したため、3はほとんど実施していません。Practiceではすぐに回答を確認し、4のdocumentを確認する方法をおすすめします。後述しますが、試験ではMS Learnが閲覧できますので、記憶以上にMicrosoftのdocumentのどこに回答となる記述があるのか？ということを知っておくことが大切となります。また、Practiceはscoreが80%を超えることを一つの基準としていますが、幾度も繰り返すと正解を覚え始めるので理解度の指標として信用ができなくなっていきます。不足した知識を補う程度のものと認識しておくと良いと思います。私は3, 4回やりましたが一度も80%を越えませんでした。

もしLabではなく、個人や会社の環境を利用する場合は使用前にコストの確認をしておくと安心です。Document IntelligenceなどFreeのプランで使うことができるAI Serviceもあります。[参照](https://azure.microsoft.com/ja-jp/pricing/details/cognitive-services/)

AI ServicesはAzure上で確認すると大きく以下の種類があるようです（訳で表現が変わるので注意）。これらの機能と、どのような場面で何を使うのか、ということは理解しておく必要があります。
- Azure OpenAI
- Azure AI Search
- Computer Vision
- Face Service
- Custom Vision
- Speech Service
- Language Service
- 翻訳
- Document intelligence
- ボット サービス
- Anomaly Detector
- Content Moderator
- Health Insights
- Personalizer
- Metrics Advisor
- Immersive Reader
- Azure AI services multi-service account
- Content Safety

## 試験について
試験時間: 100分（時間はほぼ使い切った）
問題数: 凡そ60問（ケース問題も含まれる、人によって変わるかも）
受験方法: テストセンター（自宅受験も可能）
選択言語: Python

幾つかのMS試験を受けて個人的なTips
- AZ-104で自宅受験をしたがテスト用のソフトの影響があったのか、ラップトップの動作がとても重くなった。MS Learn検索や通常のページ遷移でも1分ほどロスしとても焦ったため、その後はできるだけテストセンターで受験している
- 先述の通り本番でもMS Learnが使える。学習時からdocumentのサイトマップや記載内容の粒度（概要のみか具体的なソースも含まれるかなど）をある程度理解しておくと焦らない
- 他の方々もおっしゃるように試験問題の言語をときどき切り替える。試験内容の翻訳が完璧でないので選択肢を絞れない時や意味がわからない時は、使ってみると答えがわかることがある（これは学習時にも使うとよい）
- 休憩は可能。ただし、休憩をすると前の問題に戻ることができなくなる。（前の問題の答え合わせはできない）
- Docker、CLI、Power Shellのコマンドに関わる問題が出題されることもある。その時はMS Learnに近い答えが載っている可能性もあるので探してみるとよい
Up Network と DreamSmart、Google Gemini を搭載した世界初の Web3 AI グラスを発表

このパートナーシップは、AI、XR、Web3 インセンティブを通じて人間と機械の相互作用を再定義することを目指す

![upnetwork_xr.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784576/03879a9b-8006-e45f-fefd-cc64138c8a36.jpeg)


シンガポール、2025年1月14日 – ユーザー主導の AI エージェントオペレーティングシステム [Up Network](https://upnetwork.xyz/) は、グローバル技術リーダーである [DreamSmart]() と提携し、世界初の Web3 AI グラスを発表しました。この革新的な製品は、最先端のインダストリアルデザイン、AI、XR（拡張現実）機能、そして Web3 インセンティブを統合しており、人間と機械の相互作用を再定義し、ポストスマートフォン時代を切り拓く重要なステップとなります。

## 人間と機械の新たな相互作用の未来がここに
DreamSmart の StarV ブランドのもとで開発された Web3 AI グラスは、技術との接続方法を再定義し、人間と機械の関係におけるパラダイムシフトを実現します。Google の Gemini によって駆動されるこのグラスは、会話するだけで自然なインタラクションが可能で、直感的でシームレスな体験を提供します。複雑さを簡素化し、状況に応じた知能でユーザーのニーズに適応し、データをプライベートかつユーザー自身が管理できる状態に保ちます。

## 新しい基準を打ち立てる特長
● 軽量で快適：わずか44gの軽量設計で、1日中快適に装着可能。8時間の連続使用が可能なバッテリーを搭載。
● ガイドウェーブ技術による没入型XR：洗練された光学ガイドウェーブディスプレイを搭載し、生産性、エンターテインメント、日常業務にシームレスな拡張現実（XR）体験を提供。
● AI知能（ci）搭載：Google Gemini やその他の高度なAIエージェントを装備し、リアルタイムの文脈認識型インテリジェンスを提供。Google や Samsung の現行製品を凌駕する性能を誇る。

### Web3 をシンプルに：AI グラスが誰にでも Web3 を可能に

Web3 技術は複雑で、分散型システムへの接続、ウォレットやデジタル資産の管理、ブロックチェーンアプリの利用などが求められます。Up Network との統合を通じて、この Web3 AI グラスはハンズフリーの自然言語インタラクションを提供し、リアルタイムかつ文脈に応じたサポートで複雑さとアクセス性のギャップを埋めます。

### Web3 AI グラスの主なメリット
●	簡略化された Web3 アクセス：AI エージェント群が協調してタスクを処理し、初心者でも自然言語でブロックチェーンやAIと対話可能に。
●	AI 駆動の報酬：トークン化されたインセンティブにより、AI エージェントとのやり取りや分散型活動への参加を通じて報酬を獲得。
●	データ主権：データを資産として所有し、オンデバイス処理や匿名化ストレージを通じて完全な管理とプライバシーを確保。
●	プライバシー重視の体験：すべてのインタラクションをオンデバイスで安全に処理し、ユーザーのデータ主権を維持しながら使いやすさを損なわない設計。

「DreamSmart とのパートナーシップにより、世界初の Web3 AI グラスを発表できることは、Up Network にとって大きな前進です」と、Up Network の共同創設者である Devansh Khatri氏は述べています。「このグラスは単なるデバイスではなく、AI、XR、Web3 インセンティブを統合した強力なエコシステムで、コンピューティングと分散型技術の未来へのゲートウェイとなるものです。」

## 市場での提供時期
Web3 AI グラスは2025年第1四半期に発売予定です。価格、販売地域、限定プレビューに関する詳細は追って発表されます。

-------------

**Up Network について**
[Up Network](https://upnetwork.xyz/) は、世界18億台のスマートデバイス向けにユーザー主導の AI エージェントオペレーティングシステムを構築しています。このプラットフォームは、個人がデータを管理、収益化、統治できるようにし、AI エージェントが個別化された文脈認識型体験を提供します。

**DreamSmart について**
[DreamSmart](https://flyme.global/) は、先進的な Flyme AIOS オペレーティングシステム、最先端の AI 技術、ダイナミックなオープンエコシステムを駆使するグローバル技術革新企業です。「スマートフォン＋XR＋スマートカー」というアプローチを軸に、消費者向けエレクトロニクスと自動車産業のシナジーを推進し、複数デバイス間で没入型体験を提供しつつ、グローバルなスマートモビリティエコシステムを構築しています。
NRQLのhourOfやminuteOfを数値と比較したい場合

## 背景
あるログを検索しようとしてNRQLを書いていたが、合っているはずの比較がうまく動作しなかった。
```SQL:NRQL
-- timestampがJanuary 1, 2025 0:00:00だが、以下はfalseになった
WHERE hourOf(timestamp) = 15
```

## 原因
NRQLでは、`hourOf`に`timestamp`を渡しただけでは `15:00`のような文字列の出力になり、数値と比較することができない。

## 対応
第二引数に `numeric` を渡したところ、数値と比較ができるようになった。
```SQL:NRQL
AND hourOf(timestamp, numeric) = 15
```

## 解説
NRQLの`hourOf`や`minuteOf`は、第二引数にformat (`string` or `numeric`) を渡すことができる。ここに`numeric`を渡すことで、数値として出力されるようになり、数値との比較が可能になる。

## 参考記事
> NRQL: 時間ごとのファセット結果
> https://docs.newrelic.com/jp/docs/nrql/nrql-references/nrql-group-results-across-time/
備忘録

### 概要
 大規模言語モデルを活用してテキスト生成や応答生成を行う核となるブロック。
### 設定ポイント
- プロンプトテンプレートの作成: AIの役割を定義。
- システムプロンプト: 具体的な指示を記述（例: 「あなたは製品サポートの専門家です。」）。
-  ユーザープロンプト: ユーザーからの具体的な質問を受け付ける。
#### 前提
- モデル設定
	1. APIの取得

#### Step1：パラメータの設定
- USER :
	- ユーザーの入力: userは、ユーザーがモデルに入力するテキスト
	- 対話の継続: systemとuserのやり取りを通じて、会話形式の対話を実現
	- 動的な応答: userの入力内容に応じて、モデルが柔軟に応答を生成
- SYSTERM :
	- モデルへの指示: systemは、モデルに対して、どのような役割を担い、どのような情報を生成すべきかという指示を与えるためのプロンプト
	- 文脈の提供: モデルが生成するテキストの文脈を事前に設定し、一貫性のある応答を促すことができる
	- 制約の定義: モデルの生成範囲を限定し、望ましくない出力を防ぐことができる
- Temperature : ランダム性や多様性の調整. 大きいほど生成内容の多様性が大きい.
				文章の正確性などは0.1や0.2, 創造的な物語の出力には0.9や1
				
- Top-p(Nucleus)Sampling：予測する次の単語の閾値
						累積確率, 小さいほど出力は多様になる.
	
- Presence Penalty：対数確率にも続いてペナルティを加える. 生成されるテキストが繰り返しにならないように設定するペナルティ項
- Frequency Penalty：同じトークンが繰り返し出現することを抑制し、多様性のあるテキストを生成しやすくなる. 確率的に同じトークンが続きやすい
		　※目的 Frequency Penalty：単語の多用を防ぎ、多様性を高める  
				Presence Penalty：一度出現した単語の再出現を防ぎ、多様性を高める
- Max Tokens：出力の最大トークン
- Seed：出力のブレ. 大きいほど固定
- response_format：出力値を指定できる. テキスト化,JSONファイル
- Stop sequences：終了するキーワードの指定.

### 実験

```system
あなたはstable diffusionのプロンプトの作成者です．入力されたお題を英単語で出力し，[,]で区切り出力してください
```

入力：ワンピースのルフィが飯を食べている．

| モデル（追加ナリッジ無し）          | 結果                                                                                    |
| ---------------------- | ------------------------------------------------------------------------------------- |
| gpt-4o-mini-2024-07-18 | Luffy, eating, One Piece, joyful, colorful, anime, food, cheerful                     |
| gpt-4o-mini            | Luffy, One Piece, eating, food, anime, cheerful, pirate, adventure, colorful, dynamic |
| gpt-3.5-turbo          | One Piece, Luffy, eating                                                              |
| gpt-3.5-turbo-16k      | Luffy, eating, One Piece                                                              |
| gpt-3.5-turbo-0125     | One Piece, Luffy, eating                                                              |


少ない単語からはgpt-4o以降がやはり強いことが分かる.
「Bad Apple but Quine」を作る方法を考える


## 制約

外部ファイルを読み込まない

## 何が難しいか

動画データをテキスト上で表現する方法
動画ファイルをbase64に変換すると途轍もない文字数になると思われる

## 案1.超絶劣化させる

画質とFPSを超絶劣化させればいけるか？
ただこれは見栄えが悪いのであまりしたくはない

## 案2.ゼロ幅文字でbase64を隠す

1. 動画ファイルをbase64に変換
1. それをさらにゼロ幅文字に変換
1. それをQuineに組み込む
1. すると膨大な文字数のbase64があら不思議、表示上は0文字になってしまう

テキストファイルを開くのが激重になるかもしれない？
なりそうだな
PCのスペックが低いと無理かも

### 参考

https://qiita.com/akicho8/items/db922164eb708da90e73

## チラ裏

動画ファイルに音声データは不要
少しでも容量を減らしたいので

動画ファイルはあらかじめ白黒のみに変換しておきたい

というかgifが案外いいか？

より良い方法があるならbase64にこだわる意味はない
はじめての Contribute 完了 at Azure SDK for Python

# 背景

バグを発見したので、せっかくなので Contribute しようとしたところ、
- 非同期処理への水平展開
- 計算量の少ない方法の逆提案

をされたけど、なんとか Merge まで行きついた記録。目出度い :laughing: 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/df7acdbb-d949-036e-5040-7bae2b3bb3e2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/a7f1ce76-0729-0179-c41e-3039383e4309.png)


はじまりは以下

https://qiita.com/baku2san/items/5d6f5b06fec713b93563

# やったこと

1. Reviewer の提案の理解
   - 何をすべきか？
       - 提案の取り込み
       - 水平展開
   - どうすればいいのか？
       - Fork 先で、追加編集して commit すれば、pull request に反映されそう
1. ということで変更
    - 編集。まぁ、これは簡単
    - おそるおそるコミット
    - 無事、Pull Request にて、commit が反映され、自動 task が走り出した。
    - ただ・・squash しておくべきなのかが不安だったので、正直に書いておく
    - あとは、以前と同じく reviewer の反応を待つことする
1. 失敗と修正
   - commit 内容が test にて format error になっていた。
   - Codespace で使えるか試したらいけそうだったので、black で format して commit
   - これで OK かと思ったら・・
   - Reviewr から 括弧は意味変わっちゃうので要らないよって提案がきた。
       - ってことで、Commit suggestion で提案を受け入れ :laughing: 
      ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/24df8d37-407d-733f-0f99-da829bfd9267.png)
         - 最初の提案も、これで受け入れてればもっと簡単だったのね、と反省 :sweat: 
   - `Black` の format について、`version が違うんじゃないか？` という突っ込み
   - guidline を読んだ際によくわかってなかったけれど、以下のようにやるって話だったらしい。改めて tox.ini を確認してみたら、black の version も指定してあった。tox について理解不足が恥ずかしい :sweat: 
      > pip install tox
tox run -e black -c ../../../eng/tox/tox.ini --root . -- azure
      - 相対アドレスから考えて、以下まで移動してから実行したらいい感じに直った
         >  cd sdk/identity/azure-identity
   - ってことで、再度 commit して、自動タスク待ち
   - 無事タスクも全部通ったので、再度 review 待つことにする
1. Reviewer からの反応待ち
   - `LGTM` ってことで、無事完了

:::note
`Commit Suggestion` は、提案を受け入れて Commit する機能
:::

## 当初の案と、提案とで、padding がどう変わるか？

確かに、余分な padding を避けるためには、+4 は不要だった :sweat: 

途中、括弧つけちゃってたのは、浅はかすぎた・・

| len(base64_meta_data) | padding_needed = -(len(base64_meta_data) % 4) | padding_needed = -len(base64_meta_data) % 4 |　base |
|-----------------------|-----------------------------------------------|---------------------------------------------|-|
| 0                     | 0                                             | 0                                           |4|
| 1                     | -1                                            | 3                                           |3|
| 2                     | -2                                            | 2                                           |2|
| 3                     | -3                                            | 1                                           |1|
| 4                     | 0                                             | 0                                           |4|

```python: 
import pandas as pd

lengths = range(11)  # This will create a range from 0 to 10
results = []
for length in lengths:
    expr1 = -(length % 4)
    expr2 = -length % 4
    results.append((length, expr1, expr2))

df = pd.DataFrame(results, columns=["len(base64_meta_data)", "padding_needed = -(len(base64_meta_data) % 4)", "padding_needed = -len(base64_meta_data) % 4"])
print(df)
```

# あとがき

初めての事ばかりだったが、やっぱりやったことないことをするのは刺激があっていいですね。

悩んだ時は、楽な道を避けるのが一番ですな。 :laughing:
neovimでGitHub Copilotを触ってみた

## はじめに
そろそろCopilotを触っておかないと、老いの悪魔に連れていかれてセミになりそうなのでやってみた。

## 環境設定
1. Node.jsがインストールされているか確認
    ```zsh
    node -v
    ```
1. npmがインストールされているか確認
    ```zsh
    npm -v
    ```
1. github/copilot.vimをclone
    ```zsh
    git clone https://github.com/github/copilot.vim.git ~/.config/nvim/pack/github/start/copilot.vim
    ```
1. github/copilot.vimをセットアップ
    neovimで`:Copilot setup`を実行
    Webブラウザが起動して認証画面が表示されるので、neovimに表示されている8桁の文字列を入力

## さっそく実践
Pythonで人類の叡智、「足し算」のロジックを組んでみる。
1. neovim起動
    ```zsh
    vi add.py
    ```
1. `def add(x`まで入力したら、この状態に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3980043/1d25e527-1779-03cc-9469-aaf4e8cbfad6.png)
1. そのままtabキーで、足し算完成
1. ついでにモジュール利用するためのおまじないを。改行して`if `と入力したら、この状態に・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3980043/f748abd3-04b0-b327-b360-828b9fe3e1ac.png)
1. その後のtabキーで完成・・・
1. 正常に動作することを確認
    ```zsh
    python add.py
    ```
    実行結果はもちろん「`3`」

## 感想
気持ち良すぎる。
明日はChatの拡張機能を入れてみよう。
Oracleの関数まとめ

# はじめに
プログラマになり日々の仕事にあっぷあっぷですが
メモがてら書きます。

最近SQLを読むことが増えました！
以前まではMySQLしか触ったことがなく、最近oracleを触りだしました。
見たことない関数をよく見るので、メモがてら記事にしておきます！

# SQLとは
SQL はデータベース(RDBMS)を操作するための言語です。
データベースにデータを挿入したり、検索したりする際に利用します。
SQL の言語は、「DML」「DDL」「DCL」の 3 種類に分けられます。

# Oracle
Oracleは、Oracle Corporationが開発・販売するリレーショナルデータベース管理システム(RDBMS)です。主な特徴は以下の通りです。

- 世界シェアNo.1のデータベース管理システム5
- 高い堅牢性と障害耐性を持つ
- 多くのプラットフォームで利用可能
- 大規模なデータベースシステムに適している
- 高いパフォーマンスと効率的なデータ管理能力

# OracleのSQL関数

# **LPAD関数**

**書式**

```sql
**LPAD(strings1, length, strings2)
LPAD(文字列,桁数,うめる文字列)**
```

**引数**

**strings1 : 文字列
length：調整後のバイト数
strings2：埋める文字列戻値　バイト数を調整された文字列**

https://ichilv.com/sql-lpad/

# **TRIM関数**

**書式**

```sql
**TRIM(文字列)**
```

**引数文字列のみの場合**

```
--文字列の前後の半角スペースを削除する例
SELECT TRIM('   ORACLE 1Z0-061学習   ') FROM DUAL;

--文字列の前後の全角スペースは削除されない例
SELECT TRIM('　　　ORACLE 1Z0-061学習　　　') FROM DUAL;
```

https://auroralights.jp/entry/2021/04/24/180810

# **NVL関数**

**書式**

```sql
**NVL（式1,式2）**
```

最初の[引数](https://e-words.jp/w/%E5%BC%95%E6%95%B0.html)で指定した[式](https://e-words.jp/w/%E5%BC%8F.html)1を評価して[値](https://e-words.jp/w/%E5%80%A4.html)が非[NULL値](https://e-words.jp/w/Null.html)であればその[値](https://e-words.jp/w/%E5%80%A4.html)を返し、[NULL値](https://e-words.jp/w/Null.html)であれば2番目の[引数](https://e-words.jp/w/%E5%BC%95%E6%95%B0.html)で指定した[式](https://e-words.jp/w/%E5%BC%8F.html)2の評価した[値](https://e-words.jp/w/%E5%80%A4.html)を返す。

https://e-words.jp/w/NVL%E9%96%A2%E6%95%B0.html

# **SUBSTR関数**

**書式**

```sql
SUBSTR(strings, sposition, length)
```

**引数**

strings : 切り出す文字列
sposition : 切り出し開始位置
length:切り出す文字数

**戻値**

切り出された文字列

例

```sql
SUBSTR（テーブルA.タイムスタンプ年月日）,1，4）
||　'/'
SUBSTR（テーブルA.タイムスタンプ年月日）,5，2）
||　'/'
SUBSTR（テーブルA.タイムスタンプ年月日）,7，2）

// 出力値
YYYY/MM/DD
```

# **DECODE関数**

**書式**

```sql
DECODE (expression, value1, replace1[, value2, replace2...]);
```

DECODE関数は、引数で指定された式の値のもとに、値を変換する関数です。

**引数**

expression : もとになる式の値
value : 比較する値
replace : 置き換える値

**戻値**

変換後の値

例

```sql
 SELECT 列名1, DECODE(列名1, 1, '良品倉入', 2, '要修倉入', 3, '不再用倉入', 'その他') 列名2
 FROM 表名;
```

# おわりに
設計書と睨めっこな毎日です。。
分からない関数が出てきたら都度追加予定です。
(DAY22) 俺と学ぶRust言語~コマンドライン引数~

# 今日の内容
- コマンドライン引数とは
- ツール作成

# はじめに
[前回](https://qiita.com/FUKAch/items/b8ba9f03eb0a50b4d355)はif letについて学びました。
今回はコマンドライン引数について学びます。

# コマンドライン引数とは
コマンドライン引数とは、プログラムを実行する際に、プログラム名の後に渡すデータのことを指します。

### 標準入力との違い
標準入力は、プログラム実行中にユーザーから入力を受け取る仕組みです。ターミナルで実行中のプログラムが入力待ち状態になることがあります。
これに対してコマンドライン引数は、プログラム実行時に渡されます。

### 値の受け取り方法
```rust
std::env::args
```
または、外部クレートを使う方法もあります。
実際にコマンドライン引数を渡す方法は、`cargo run`する際に、例えば「1, 2, 3」を渡したければ以下のようにします。
```
cargo run 1 2 3
```

### 例: コマンドライン引数を表示するプログラム
```rust
fn main() {
    let args = std::env::args();
    println!("{:?}", args);
}
```
例えば、`cargo run`する際に、「cargo run 1 2 3」と入力すると、以下の出力を得ることができます
```
Args { inner: ["target\\debug\\cmd_input.exe", "1", "2", "3"] }
```

### 注意点
上の例の実行結果を見てください。第一引数は"1"ではありません。
コマンドライン引数の取得において、 **第一引数はプログラムの実行ファイル名** になります。

また、そのままだと要素はイテレータになるので、普通はベクタに変換して扱います。
ベクタに変換する方法は簡単で、`collect`関数を利用します。
```rust
fn main() {
    let args: Vec<String> = std::env::args().collect();
    println!("{:?}", args);
}
/******** 実行結果 ********
["target\\debug\\cmd_input.exe", "1", "2", "3"]
*************************/
```
ベクタに変換することで、要素を指定して取り出すことが容易にできます。

# ツールを作ろう
コマンドライン引数を利用してツールを作ってみましょう。
今回は「ファイル内容を読み取って文字数や行数をカウントするツール」を作成します。

コマンドライン引数には読み取るファイル名を与えます。
読み取ったファイルの「ファイル名」、「行数」、「文字数」を出力します。
```rust
use std::{env, fs, io::Read};

//行数カウント
fn lines(content: &String) -> u32 {
    let mut lines: u32 = 1;
    for c in content.chars() { if c == '\n' { lines += 1 } }
    lines
}
//文字数カウント
fn chars(content: &String) -> u32 {
    let mut chars: u32 = 0;
    for c in content.chars() { if c != '\n' && c != '\r' { chars += 1 } }
    chars
}

fn main() {
    let args: Vec<String> = env::args().collect();
    if args.len() < 2 { panic!("Specify the file name!"); }
    let file_result = fs::File::open(&args[1]);
    
    if let  Ok(mut file) = file_result {
        let mut content = String::new();
        file.read_to_string(&mut content).unwrap();
        println!("fname: {}", &args[1]);
        println!("lines: {}", lines(&content));
        println!("chars: {}", chars(&content));
    } else {
        eprintln!("Could not load file!");
    }
}
/******** 実行結果 ********

PS C:\Users\Darkn\cmd_input> cargo run test.txt
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.00s
     Running `target\debug\cmd_input.exe test.txt`
fname: test.txt
lines: 5
chars: 17

*************************/
```
実行結果は実行文を含んでいます。

エントリーポイントから解説します。
まずコマンドライン引数を受け取ります。ここで、もし引数が1つしかなければ、ファイル名を指定されていないので、パニックさせています。でなければ、指定されたファイルを開きます。
次に、ファイルが開けたかどうかを評価します。もしファイルが開けなければプログラムを終了します。
ファイルが開ければ内容を取得し、ユーザー定義関数「lines()」、「chars()」をそれぞれ実行して、文字列の行数および文字数（改行を除く）を取得しています。

# おわりに
今回はコマンドライン引数について学びました。外部クレートを使う方法は後で編集して載せるかもしれません。
次回はファイルの読み書きを学びます。
dbt incremental update bigquery

# はじめに

dbtを使ってBigQueryのデータを管理する場合は、大きなテーブルでは incremental updateにすることで、コストを時間的にも経済的にも、下げることができる。

# incremental updateのタイプ

- merge: unique_keyを設定することで、新しい値で更新することができるが、すべてのデータをスキャンするので、大きなテーブルには向かない
- insert_overwrite: 対象となるテーブルはpartitionされている必要があるが、対象のpartitionのみを全取り換えすることで、読み込みと書き込みの量を減らせる
- microbatch (beta): ([ref](https://docs.getdbt.com/docs/build/incremental-microbatch))

microbatchはbetaなので今回はまだ読んでいないので、この時点で巨大テーブルのコストを下げるために使うのは `insert_overwrite`であることがわかります。


# insert_overwriteの設定

以下のように設定できます。

```sql
{{ config(
    materialized="incremental",
    incremental_strategy="insert_overwrite",
    partition_by={
      "field": "created_date",
      "data_type": "timestamp",
      "granularity": "day",
      "time_ingestion_partitioning": true,
      "copy_partitions": true
    }
) }}
```

設定内容:

1. `materialized="incremental"`: incrementalを指定することでテーブルが作成されます。
1. `incremental_strategy="insert_overwrite"`: strategyを指定します。
1. `partition_by` には、partitionの設定を書いていきます
    1. `created_date`でpartitionを行っています
    1. `data_type` で partitionするdata_typeを指定します
    1. `granularity` で `day`, `hour` などを指定することが出来ます。
    1. `time_ingestion_partitioning` とすることでingest timeを使ってpartitionすることができます。 (ref: https://cloud.google.com/bigquery/docs/partitioned-tables#ingestion_time)
    1. `"copy_partitions": true` で dynamic partitionの中でも tempのtableを bigquery  copy table APIをつかって atomicに入れ替えるので、insertコストがかからず安く、さらに速くなります。


# 結論

dbtで管理する大きなBQテーブルには、以下の設定を!

- `incremental`
- `insert_overwrite`
- `copy_partitions`


# Ref

- https://docs.getdbt.com/reference/resource-configs/bigquery-configs
Lovable AI にウェブアプリを作ってもらった

## はじめに
プロンプトで指示を出すだけでWebアプリを作ってくれる生成AIは数多くありますが、今回あまり耳馴染みのないLovable AIというサービスを使ってみました。

## Lovable AIとは
公式サイトの言葉を引用すると、以下の記載があります。
> あなたのアイデアをあなた自身の言葉で表現するだけで、それが美しさと完全な機能を備えたアプリケーションに生まれ変わります。

https://lovable.dev/

実際にサービスを使ってみて、割とこの言葉通りのことが実現可能だと感じました。
作りたいサービスの概要と必要な機能を箇条書きで書いて指示を出したところ、数十秒でサイトが構築され、画面の動きを試すことができました。

## 使い方
会員登録は無料でできます。GitHubやGoogleアカウントでの会員登録も可能です。
![{72AA20FA-0843-4EAC-BB47-456C12034318}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/0370bb66-51d3-3a91-ec2a-06ecfa461025.png)
ログインしたら、画面中央のテキストボックスにプロンプトを入力し、Createボタンを押下すればあとは自動でWebアプリを生成してくれます。
ちなみに、テキストボックス下の文字が書かれた丸いボタンを押下すると、文字に書かれた内容のプロンプロが自動的にテキストボックスに入力されます。試しにweather dashboardというボタンを押してみると、自動的に以下のプロンプトが入力されました。
![{0F2A8D85-1E78-4E4C-9468-1FCC5E075FCB}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/62e44f92-c469-13dc-1ffe-1d303e368076.png)

## 作ったWebアプリ
今回は災害時に避難場所や避難所の収容人数、掲示板の役割を果たすWebアプリを作ってくださいという指示を出してみました。
日本語で書いたプロンプトをChatGPTで英語に翻訳してもらい、指示を投げました。
プロンプトはこちら。
> 災害時に使えるアプリを作ってください。アプリには以下の機能を作成してください。・避難マップ・各地域の掲示板（誰でも書き込み、返信可能）・誰がどこに避難しているかが一目でわかる地図・インターネットに接続した瞬間に情報の取得、表示・避難場所ごとに避難ルールを表示
> Please make an app that can be used in times of disaster. Please create the following functions for the app. Evacuation map BBS for each town (anyone can post messages) Anyone can reply to the posts on the bulletin board. Map to check at a glance who is evacuating and to which location. ・Information is retrieved and displayed the moment the Internet is connected, even when the Internet is not available. Rules for each evacuation site are displayed for each evacuation site.

左側のChat部分でプロンプトを投げ、数十秒後出来上がったWebアプリです。
先ほどのような適当な指示でもこれだけのものがすぐに作成されました。(※最初は英語で作成されたため、日本語に翻訳してほしいというプロンプトを再度投げています。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/36936800-1fdd-af3e-20ba-1b11f251d31c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/1244992c-d945-9b14-e43e-fce5a0991032.png)
コミュニティ掲示板のページにはコメントが投稿できそうだったので、実際にコメントを書いて投稿するボタンを押してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/6a70ac4d-70e8-fa57-df43-d0eca3629d7e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/4f1669a0-53b1-732a-a95a-b78416367ceb.png)
コメントが投稿されました。出来上がったアプリの動きを画面上ですぐに試せる点がとても良いと思いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/2a539f49-5618-e6be-86a2-f6798f7902c2.png)
画面や機能の修正をしたければ、画面左下から支持を入力すればすぐに修正したコードを画面を表示してくれます。実際に英語から日本語への翻訳や、タイトルの文言修正などを指示したところすぐに修正されました。

Githubと連携すれば、すぐにソースコードをクローンすることができます。(画面右上の `<> Edit code`を押下)
![{FEE90F72-FDE4-4902-94AE-31A271CB199E}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/c745d862-9ddc-9629-1002-3cfe14e1815a.png)

無料プランでは１日5回まで、１か月で50通まで指示を出すことが可能です。以下料金プランです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/5492bd9b-1090-1e69-e05e-f868cffa8abc.png)

## 最後に
最後までお読みいただきありがとうございました。
気軽にWebアプリを作ってみることができるので、気になった方はぜひ試してみてください。

## 仲間を募集しています！

ARIではエンジニア・ITコンサルタント・PM職全方位で仲間を募集しております。
カジュアル面談、随時受付中です！
ご興味ある方はこちらをご覧ください。

https://note.com/ari_hr/n/n4aed9ba75421
OpenAIのEmbedding APIを使って関連性を数値化する

# はじめに
昨年末に社内の先輩エンジニアから、
「忘年会でアプリを作って、簡単な発表会をしよう！」という素敵な提案がありました。

「**社内の誰かが企画したものには全部乗っかる**」をモットーに過ごすと決めていたので、
OpenAIのAPIを触れたことがなかったので、AIを使った簡単なゲームを作ることにしました。

# 実際の画面
![画面収録 2025-01-12 22.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577266/241eaf1d-ad50-4368-487f-b82046d99e94.gif)

# ゲームの概要
- お題の単語を決める（例：テスト）
- お題の言葉が生成文に入るような質問文を考える（例：学校で受けるものといえば？）
- お題の言葉が生成文に含まれていたら勝ち

# 点数化できるものは何だろう？
勝敗判定以外に、質問文の長さで得点を決めるというルールにしました（短いほど高得点）。
ルールが1つだと物足りないので、「**お題と質問文の関連性が低ければ高得点**」という条件を追加することに。
「関連性って数値にできるの？」と思いつつ調べた結果、[Embedding API](https://platform.openai.com/docs/guides/embeddings)というもので実装できそうなので、使ってみました。


# 実際のコード（一部）
```ruby
  def calculate_relevance(target_word, user_question)
    # お題の言葉を直接含む場合はペナルティを適用
    if user_question.include?(target_word)
      return 0
    end

    # Embedding APIを使って質問文とお題の埋め込みを取得
    question_embedding = get_embedding(user_question)
    target_embedding = get_embedding(target_word)

    # コサイン類似度を計算
    similarity_score = cosine_similarity(generated_embedding, target_embedding)

    # 類似度スコアを逆転させて、関連性が高いほど低点となるようにする
    relevance_score = (1 - similarity_score) * 100
    relevance_score
  end

  # Embedding APIを使って埋め込みベクトルを取得
  def get_embedding(text)
    client = OpenAI::Client.new
    response = client.embeddings(
      parameters: {
        model: "text-embedding-ada-002",
        input: text
      }
    )
    response["data"][0]["embedding"] 
  end

  # コサイン類似度を計算するヘルパーメソッド
  def cosine_similarity(vec1, vec2)
    dot_product = vec1.zip(vec2).map { |x, y| x * y }.sum
    magnitude1 = Math.sqrt(vec1.map { |x| x**2 }.sum)
    magnitude2 = Math.sqrt(vec2.map { |x| x**2 }.sum)
    (dot_product / (magnitude1 * magnitude2)).round(3)
  end
end

```

# 結局何をしているの？
単語（お題）と文章（質問文）をベクトルに変換し、
「それぞれのベクトルがどれくらい同じ方向を向いているか」で関連性を表しています。

この原理は「**マッチングアプリで趣味の近いユーザー同士を繋げる**」機能などに応用ができるみたいですね。

# ゲームとしての改善点
- 関連性の点数がどのような質問文で似たような点数になってしまう
- 同じ単語で文字の種類が異なるもの（りんご、リンゴ、林檎）を同じものとして扱いたい
- お題をランダム出力できるようにして点数を競うモード、タイムアタックモードの実装


# まとめ
関連性を数値化することで、ゲーム性を少し向上させることができました。

初めてOpenAIに触れてみましたが、導入方法が簡単で、個人利用の範囲だと料金も高くありませんでした。
興味のある方はお試しあれ。
AGP 8.8 での Manifest merger failed エラーとその解決策

[前回の記事](https://qiita.com/h-nimrod/items/cf4931daac69442b7a80)では、Android Gradle Plugin (AGP) を 7 から 8 へアップデートした際に発生した `BuildConfig` と `R` クラスの生成に関する変更点とその解決策を記載しました。
今回は、AGP 8.8 へアップデートした際に遭遇した `Manifest merger failed : Attribute property#android.adservices.AD_SERVICES_CONFIG@resource...` エラーについてに対応した内容を記載します

## 1. エラーの再現と詳細なエラーメッセージの解析

AGP を 8.8 へアップデート後、プロジェクトのビルド時に以下のようなエラーが発生しました。

```
Manifest merger failed : Attribute property#android.adservices.AD_SERVICES_CONFIG@resource value=(@xml/gma_ad_services_config) from com.google.android.gms:play-services-ads-lite:23.3.0] AndroidManifest.xml:92:13-59
	is also present at [com.google.android.gms:play-services-measurement-api:22.0.2] AndroidManifest.xml:32:13-58 value=(@xml/ga_ad_services_config).
	Suggestion: add 'tools:replace="android:resource"' to <property> element at AndroidManifest.xml to override.
```
このエラーは、異なるライブラリで定義されている `android.adservices.AD_SERVICES_CONFIG` 属性が競合していることを示しています。
具体的には、`com.google.android.gms:play-services-ads-lite` と `com.google.android.gms:play-services-measurement-api` がそれぞれ異なる `AD_SERVICES_CONFIG` リソースを定義しているため、マニフェストのマージに失敗していました。

## 2. 実施した解決策：tools:replace を使用してオーバーライド

エラーメッセージの Suggestion に記載されている通り、`tools:replace="android:resource"` を AndroidManifest.xml に追加することで、この問題を解決できます。

具体的には、アプリケーションの AndroidManifest.xml ファイル内の <application> タグ内に、以下のように <property> タグを追加します。

```xml:app/src/main/AndroidManifest.xml
<application>

  <property
      android:name="android.adservices.AD_SERVICES_CONFIG"
      android:resource="@xml/gma_ad_services_config"
      tools:replace="android:resource" />

</application>
```

この設定により、`com.google.android.gms:play-services-ads-lite` で定義されている `gma_ad_services_config` リソースを優先的に使用するように指定することができました。
CubeIDEからVSCodeExtensionへのコード移行

# はじめに
STM32 VSCodeExtensionが想像以上に便利だったので、これまでCubeIDEで開発していたプロジェクトもVSCodeExtensionに移行しようと思います。詳しいやり方はVSCodeExtension内のUserguideに記載されていました。
ちなみにVSCodeExtensionの導入については以下の記事をご覧ください。

https://qiita.com/Falcon496/items/79c49b4f99e5c447cc1b

# 使用環境
* OS : win11
* STM32VSCodeExtension v2.1.1
* STM32CubeMX v6.13.0
* STM32CubeCLT v1.17.0
* テスト用マイコン : stm32f767

# テスト用プログラムの作成
今回はテスト用プログラムとしてCubeIDEでLED_testという名前で新たなプロジェクトを作成しました。またmain.cのwhileループ内をLEDが点滅するように以下のように書き換えます。
```c:main.c
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
    HAL_Delay(100);
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
```
問題なくLEDが点滅することを確認できました。
# プロジェクトの移行
では、早速プロジェクトの移行作業をしていきましょう！Userguideによると
* プロジェクトをSTM32CubeIDE/MXで作成し、STM32VSCodeextension 1.0.0で管理していたもの
* プロジェクトをSTM32CubeIDE/MXで作成し、STM32VSCodeextension 1.0.0で取り込んでいないもの
* STM32CubeIDE/MXを使わずに生成したもの

で移行方法が異なるようです。今回は2つ目についてやっていきます。（1つ目でも大まかな流れは同じ用ですが途中削除するファイルが違うようです。）

## プロジェクトのアップデート
CubeIDEのバージョンが低い場合、アップデートが必要なようです。STM32CubeIDE v1.15.0かそれより新しいものでプロジェクトを開きビルドとデバッグをしてください。

## 不要ファイルの削除
プロジェクトとcmakeで再構成する前に不要ファイルの削除を行います。削除前にバックアップを取ることが推奨されていました。不要ファイルは以下の通りです。
### STM32CubeIDEで作成し、STM32VSCodeextensionで開いたことがない場合
* .settings/
* .cproject
* .project

以上の３つのファイルを削除します。
### STM32CubeIDEで作成し、STM32VSCodeextension 1.0.0で取り込んでいた場合
* .vscode folder
* build folder
* cmake folder
* CMakeLists.txt
* CMakePresets.json
* nvcpkg_configuration.json

以上6つのファイルを削除するようです。

## CMakeで作成
STM32CubeMXを使ってCMakeでプロジェクトを生成します。
1. STM32CubeMX v6.11.0かそれ以降のバージョンでiocファイルを開きます
1. 「migrate」が必要なときmigrateします
1. 「project manager panel」を開きます
1. 「Toolchain / IDE」を"STM32CubeIDE" から "CMake" に変更 
1. 「GENERATE CODE」を実行  
![スクリーンショット 2025-01-15 201529.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976768/1f8cf973-3363-8df5-fe90-d75f0ae75293.png)

## vscodeにプロジェクトをインポートする
STM32VSCodeextensionから作成したCMakeのフォルダをインポートします。![スクリーンショット 2025-01-15 202329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976768/11bd7338-b2c2-c28a-2036-8ffbea0688a6.png)

## CMakeLists.txtの編集
自作ファイル等がある場合CMakeLists.txtを編集します。今回は特に変更ありません。

## ビルドして書き込んでみる
ここまでできたら新規作成したプロジェクトと同じです！早速書き込んでみましょう。しっかりと書き込むことが出来ました。詳しい書き込み方法は前述の記事をご覧ください。

# 最後に
CubeIDEからVScodeにプロジェクトの移行が出来ました。CMakeListsの編集が少々面倒ですが、Copilotを利用できるなど移行するだけの価値があると思います。
Turing Smart Screen

# Turing Smart Screen とは、

PC に接続して、CPUやGPUの情報を常時モニターするディスプレイです。
USB で接続しますが、Serial ポートアクセスです。

![](https://ae-pic-a1.aliexpress-media.com/kf/Sfc4bf4ae3676422195eafc9efd5fe791S.jpg_220x220q75.jpg_.avif) [<img width="200" alt="lcd.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/4f0e38e7-7033-0c1c-bb80-999d031f51a7.png" />](https://ja.aliexpress.com/item/1005005995773568.html)


PC に接続すると、次のように表示されます。
![turzx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/f4c3dbfe-e5bf-965d-6ea1-205a3b225026.png)
[www.turzx.com](https://www.turzx.com) は `Turing Smart Screen`の公式サイトのようです。



# Windows OS

上記サイト右上の「[Download](https://www.turzx.com/2023/03/02/直链下载directdownload/)」をクリックすると、APPのダウンロードページに遷移します。
この中から「3.5inch app english version 英文版 2024/12/13」をクリックし、ダウンロードした`35inchENG15.rar`を適当なフォルダに展開します。

`UsbMonitor.exe`を起動して、このディスプレイに表示する内容の設定します。
一度設定すると、次回以降はモニター表示を自動起動します。

:::note warn
この自動起動を停止する方法が分かりません。
スタートアップフォルダやスタートアップレジストリを探しても見つけられませんでした。
:::


# Linux OS

上記サイトでダウンロードできるアプリは、Windows 用のみです。

Ubuntu などの Linux の場合は、[`Turing Smart Screen`](https://github.com/mathoudebine/turing-smart-screen-python)を使って表示できます。

インストール方法は、次のサイトにコンパクトにまとめられています。

https://phazertech.com/tutorials/turing-smart-screen.html




# 類似製品

https://qiita.com/nak435/items/e0802355dad0f0865c69


<br><br>

**以上**
個人的な備忘録：ベイズ統計学が全くわからなかったので、理解を深めるために記事としてアウトプットしてみた

## はじめに
正直なところ、ベイズ統計学については全くの初心者です。「ベイズ統計学の『べ』」もわからないほどですが、思い切ってこの記事を書いてみることにしました。

:::note warn
***まずお伝えしておきますが、この記事の内容はChatGPTと会話しながら作成したものであり、私自身の理解が十分とは言えません***。
:::

しかし、苦手な分野でも積極的にアウトプットすることで、自分の成長につながると信じています。**そこで、この記事としてまとめてみることにしました。**

## 書こうと思ったきっかけ
私が受講しているITスクールで、尊敬する講師の方がベイズ統計学についてリアルタイムで講義をしてくださいます。

:::note alert
**内容についてはまだ十分に理解できていない部分が多いですが、とりあえずアウトプットすることで少しでも前進したいと考えています。**
:::

温かい目で見守っていただけると幸いです。

## ベイズ統計学とは？

ベイズ統計学とは、確率を「**ある出来事が起こる可能性**」として考え、新しい情報を得るたびにその確率を更新する方法です。

これを可能にするのが「**ベイズの定理**」で、過去の知識（事前確率）と新しいデータ（尤度）を組み合わせて未来を予測します。

日常では、天気予報や医療診断などに使われています。

:::note info
新しい情報を取り入れて柔軟に判断を改善するのが特徴です。
:::

### ベイズ統計学の基本概念

ベイズ統計学の中心には「ベイズの定理」があります。ベイズの定理は以下のように表されるみたいです。

![Screenshot 2025-01-15 at 18.40.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/356e09d5-418d-2924-10d3-a16ac927cc3b.png)

## ベイズ統計学のプロセス

### 事前分布（Prior）
データを観測する前に持っている知識や仮定を、**確率分布**として表現します。  
事前分布は、未知のパラメータについての主観的な信念や過去の知識を反映します。

---

### 尤度（Likelihood）
観測されたデータが、特定のモデルやパラメータでどの程度説明できるかを示します。  
尤度は、**モデルの適合度**を数値的に評価し、データを生成する確率を計算します。

---

### 事後分布（Posterior）
ベイズの定理を使い、**事前分布**と**尤度**を基にして、データから学んだ後の信念を更新します。  
事後分布は次のように表されます：

$$
P(\theta | \text{data}) = \frac{P(\text{data} | \theta) \cdot P(\theta)}{P(\text{data})}
$$

ここで：
- $ P(\theta | \text{data}) $：事後分布
- $ P(\text{data} | \theta) $：尤度
- $ P(\theta) $：事前分布
- $ P(\text{data}) $：正規化定数（証拠、Evidence）

## ChatGPTに教えてもらったベイズ統計学の身近な例

### シナリオ: お菓子の袋の中身を推測する
あなたは、赤と青のキャンディがランダムに入った袋を持っています。ただし、中に何個の赤と青のキャンディが入っているのかはわかりません。

1. **事前分布（Prior）**
    最初に、「袋の中の赤いキャンディの割合（赤キャンディ率）」について何も知らないと仮定します。この場合、赤いキャンディの割合は 0%～100% のどの値も同じくらいあり得ると考えます。これを **事前分布** とします。

    例: 赤いキャンディの割合を 0%～100% の間で一様に分布していると仮定。

2. **尤度（Likelihood）**
    袋からランダムに 10 個のキャンディを取り出して調べたところ、7 個が赤で、3 個が青だったとします。この観測データ（赤が 7、青が 3）から、「袋に赤いキャンディが多い可能性は高そうだ」と考え始めます。

    **尤度** は、「袋の赤キャンディ率が特定の値だった場合、この観測データがどのくらい起こりやすいか」を計算します。

3. **事後分布（Posterior）**
    次に、観測データ（赤 7、青 3）をもとに **ベイズの定理** を使って赤いキャンディ率の確率を更新します。たとえば、「赤いキャンディが 70% くらいの袋である可能性が一番高そうだ」と結論付けられます。

    新しい信念（事後分布）は、「赤いキャンディの割合は 70% の周辺が最も確からしい」と示されます。

## ベイズ統計学を使うポイント

この例では、最初の信念（赤いキャンディ率はどの値もあり得る）から始まり、観測データをもとに「赤いキャンディの割合は 70% くらいだろう」と結論を得るプロセスをベイズ統計学で表しています。

:::note info
**※【ポイント】**
**1. 最初の推測（事前分布）を立てる。**
**2. 実際のデータ（観測結果）を確認する。**
**3. ベイズの定理を使って、データに基づいて推測（事後分布）を更新する。**
:::

これは、天気予報や医療診断など、私たちの生活の中で直感的に行っていることに似ています！

## まとめ
ここまでお読みいただき、ありがとうございました。

:::note warn
***今回の記事はほとんどChatGPTに助けてもらいながら作成しましたが、統計学について少しは理解の「入り口」に立てたような気がします。***
:::

これからも、わからないことに対して積極的にアウトプットすることで、理解を深めていきたいと思います。
[Nuxt.js]  Runtime Configの値が、nitro 起動時に設定した環境変数の値で書き換わらない

# 前提
Nuxt.js (Nuxt3) には、Runtime Configという機能があり、
実行時に環境変数から読み込んだ値で、設定を上書きする事ができる。

よく他の記事などで設定している際に、下記のように設定されている場合がある。

```javascript
export default defineNuxtConfig({
  runtimeConfig: {
    exampleSecret: 'example',
    public: {
      baseUrl: process.env.BASE_URL || '(デフォルト値)',
    }
  }
})
```

この場合、`baseUrl` は、ビルド時に設定されている、環境変数「BASE_URL」の内容が適用される。

そのため、nitroサーバ起動時に環境変数「BASE_URL」を指定してもその値は適用されない。

それだと、ビルドは先に済ませておき、デプロイ先で起動時の環境変数によって設定を変更したい場合に対処できない。

# 結論

nitroサーバを起動した際に、 `baseUrl` の値を上書きしたい場合は

```bash
NUXT_PUBLIC_BASE_URL="(上書きしたい値)"
```

のように指定する必要がある。

つまり、
```
「NUXT_」 + 「PUBLIC_」 + 「(RuntimeConfig変数名のスネークケース)」
```
で環境変数に指定してやる必要がある。

Privateの場合は「PUBLIC_」が不要になるので上記の例における、 
`exampleSecret` の値をサーバ起動時に上書きしたい場合は

```bash
NUXT_EXAMPLE_SECRET="(上書きしたい値)"
```
のように指定することになる。

# あとがき

公式ドキュメントや動画にも記載があるが見逃しやすかったため記事化

https://nuxt.com/docs/guide/going-further/runtime-config

https://www.youtube.com/watch?v=_FYV5WfiWvs&feature=youtu.be
【Amplify】Lambda実行ロールへSecretsManager権限を追加する


CloudFormationテンプレートファイルを開き、`lambdaexecutionpolicy>Properties>PolicyDocument>Statement`の配列に以下を追加

```json:
...
},
// ここから追加
{
  "Effect": "Allow",
  "Action": [
    "secretsmanager:GetSecretValue"
  ],
  "Resource": {
    "Fn::Sub": [
      "arn:aws:secretsmanager:${region}:${account}:secret:*",
      {
        "region": {
          "Ref": "AWS::Region"
        },
        "account": {
          "Ref": "AWS::AccountId"
        }
      }
    ]
  }
}
```

`*` のご利用は計画的に
【アップデート】Amazon Connect の習熟度について

## はじめに
2024年12月23日付けの AWS アップデートにて、Amazon Connect に関する発表が2件ありました。今回はこちらの習熟度に関連する機能のアップデートについて実機検証を行いましたので、ご紹介します。

[Amazon Connect が特定の範囲のエージェントの習熟度へのルーティングのサポートを開始](https://aws.amazon.com/about-aws/whats-new/2024/12/amazon-connect-routing-range-agent-proficiencies/?nc1=h_ls)
[Amazon Connect でルーティング時に特定の習熟度を除外する機能を提供](https://aws.amazon.com/jp/about-aws/whats-new/2024/12/amazon-connect-exclude-proficiencies-routing/)

## 習熟度の設定方法
習熟度は、Amazon Connect が提供する機能の一つで、エージェントごとのスキルや言語の流暢さなどを数値で設定し、コールフロー内でそのレベルに応じたルーティングを行うことができます。習熟度はレベル1からレベル5まで選択可能で、デフォルトでは connect:Language と connect:Subtype 属性が登録されています。

例えば、次のような設定が可能です。
- クレジットカードと自動車ローンに関する問い合わせを持つ顧客が、クレジットカードレベル4以上かつ自動車ローンレベル4以上のスペシャリストに接続される。

今回の検証ではデフォルトの connect:Language を使用します。
まずは、ユーザー管理から対象のエージェントの習熟度を設定します。対象のユーザーを開くと、一番下に「詳細設定を表示」とあるので、そちらをクリックします。そうすると、属性を設定できる項目があるので、今回は英語の習熟度をレベル2に設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/1a65d0af-1e46-a0b4-b46e-9d34571929c2.png)

次に、対象のフローで「ルーティング条件の設定」ブロックを挿入します。このブロックは「キューへ転送」ブロックの前に配置するのが適切です。
このブロックで要件を設定していきます。以下の画像では、英語の習熟度レベルが3以上のエージェントが該当するため、もし、先ほど設定したエージェントがいる場合はつながりません。有効期限を10秒に設定しているため、10秒経てばつながるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/27ca995a-85ba-c3ca-5401-d3c052ce065f.png)

## Amazon Connect が特定の範囲のエージェントの習熟度へのルーティングのサポートを開始
習熟度レベルが今までは相対範囲での指定でしたが、今回のアップデートで絶対範囲も指定できるようになりました。
「ルーティング条件の設定」ブロックで手動で設定→要件の追加をクリックします。事前定義された属性と値を入力し、その下に相対範囲と絶対範囲が選べるようになっているので、絶対範囲を選択します。すると、最小習熟度レベルと最大習熟度レベルが設定できるので、以下の画像では2~3を選択しています。これで電話をかけると、上で設定したエージェントの習熟度に該当するので、電話がつながります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/e51b472a-54e7-557e-bd2e-7240b4e4994d.png)

## Amazon Connect でルーティング時に特定の習熟度を除外する機能を提供
こちらのアップデートでは、習熟度を除外するための NOT 演算子が新たに追加されました。
こちらは 「AWS Lambda 関数の呼び出し」ブロックからの出力に基づいて、ルーティング基準を判定するため、動的に設定する場合にのみ使用できます。
呼び出す Lambda 関数のように記載しました。
この Lambda 関数は英語以外に属しているエージェントにつながります。そのため、今回設定したエージェントは英語の習熟度を設定しているため、つながりません。

```javascript:NOTAttributeCondidtion.mjs
export const handler = async(event) => {
  const response = {
    "MyRoutingCriteria": {
        "Steps": [
            {
                "Expression": {
                    "NotAttributeCondition": {
                        "Name" : "connect:Language",
                        "Value" : "connect:English",
                        "ProficiencyLevel": 1,
                        "ComparisonOperator": "NumberGreaterOrEqualTo"
                    }
                },
                "Expiry" : {
                    "DurationInSeconds": 30
                }
            }
        ]
    }
}    
    return response;
};
```

「ルーティング条件の設定」ブロックは動的に設定、名前空間を外部、キーを MyRoutingCriteria と設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/01edcf56-8fcd-db33-614e-ea298a2bdbbd.png)

このアップデートにより、特定の習熟度を除外するルーティングが可能となりました。

## まとめ
今回は習熟度のアップデート情報について実機検証しました。
習熟度を利用することによって、適切なスキルを持つエージェントが対応できるため、問い合わせの品質向上が見込めます。
この記事がどなたかの参考になれば幸いです！
DockerでGo開発環境を構築する (Vim/Neovim編)

## モチベーション

- Dockerを使ってクリーンな開発環境を構築したい
- Vim（Neovim）でGo言語を書きたい

 ## Dockerfileの作成

以下が，Go開発環境を構築するためのDockerfileです．

```
FROM ubuntu:latest

# 共通の依存関係をインストール
RUN apt-get update -y \
    && apt-get install -y \
    software-properties-common \
    curl \
    git \
    build-essential \
    python3 \
    python3-pip \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Goをインストール
RUN add-apt-repository ppa:longsleep/golang-backports -y \
    && apt-get update -y \
    && apt-get install -y golang-go \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Node.jsとnpmをインストール
RUN curl -sL https://deb.nodesource.com/setup_lts.x | bash - \
    && apt-get update -y \
    && apt-get install -y nodejs \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# NeovimをPPAからインストール (stable版)
RUN add-apt-repository ppa:neovim-ppa/stable -y \
    && apt-get update -y \
    && apt-get install -y neovim \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

ENV GOPATH=/root/go
ENV PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
ENV NODE_ENV=development

# 必要なディレクトリを作成
RUN mkdir -p $GOPATH \
    && mkdir -p /root/.config/nvim/ \
    && mkdir -p /root/.local/share/nvim/site/autoload

# vim-plugをインストール
RUN curl -fLo /root/.local/share/nvim/site/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

# 設定ファイルをコピー
COPY init.vim /root/.config/nvim/init.vim
COPY coc-settings.json /root/.config/nvim/coc-settings.json

# Neovimプラグインをインストール
RUN nvim -u /root/.config/nvim/init.vim +PlugInstall +qall

# srcディレクトリを作成
RUN mkdir -p /root/src

WORKDIR /root/src
```

### 解説: 

- **ベースイメージ:** ubuntu:latestを使用
- 共通依存関係のインストール: curl，git，build-essential，python3，python3-pipなど開発に必要なツールをインストールします．

:::note info
Pythonはスニペットプラグインの[UltiSnips](https://github.com/SirVer/ultisnips)を使用するためにインストールします．UltiSnipsの使用にはPython環境が必要です．
:::

- **Goのインストール:** longsleep/golang-backports PPAを使用してGoをインストールします．

PPAについては以下が参考になります．

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0314


- **Node.jsとnpmのインストール:** NodeSourceのAPTリポジトリを使用してNode.jsとnpmをインストールします．

:::note info
Node.jsは補完エンジンの[coc.nvim](https://github.com/neoclide/coc.nvim)を使用するためにインストールします．coc.nvimの使用にはNode.jsの環境が必要です．
:::

- **設定ファイルのコピー:** ローカルのinit.vimとcoc-settings.jsonをコンテナ内にコピーします．

- **Neovimのインストール:** Neovimをneovim-ppa/stable PPAからインストールします．

- **vim-plugのインストール:** プラグインマネージャーとして[vim-plug](https://github.com/junegunn/vim-plug)をインストールします．

## 設定ファイル
COPYする設定ファイルには以下を記述

```init.vim
call plug#begin()

（省略）

" vim-goプラグインのインストールとバイナリインストール
Plug 'fatih/vim-go', { 'do': ':GoInstallBinaries' }

" coc.nvimプラグインのインストール
Plug 'neoclide/coc.nvim', {'branch': 'release'}

" ultisnipsプラグインのインストール
Plug 'SirVer/ultisnips'

（省略）

call plug#end()
```

```coc-settings.json
{
  "languageserver": {
    "golang": {
      "command": "gopls",
      "rootPatterns": ["go.work", "go.mod", ".vim/", ".git/", ".hg/"],
      "filetypes": ["go"],
      "initializationOptions": {
        "usePlaceholders": true
      }
    }
  }
}
```

## イメージのビルドとコンテナを実行
```
docker image build --tag go .
```

```
docker container run --name go -it go bash
```
Next.jsのAPIルートで環境の違いに気付かなかった話

今回は私がやってしまった、Next.jsでよくありそうな開発あるあるを共有したいと思います。APIルート内でNode.jsのAPIを使おうとして「あれ？」となった経験から、サーバーサイドとクライアントサイドの違いについて学んだことをまとめてみました。

## どんな失敗をしたの？

APIルート内でファイルアップロードの処理時間を計測しようと思って、何も考えずに書いたコードでこんなエラーに遭遇しました：

```
Unhandled Runtime Error
TypeError: process.hrtime is not a function
Source: src/utils/index.ts (356:29) @ hrtime
  354 | // Create timing manager
  355 | const createUploadTiming = (): UploadTiming => ({
> 356 |   processStartTime: process.hrtime(),
      |                             ^
  357 |   uploadStart: new Date()
  358 | });
```

「あれ？おかしいな...」と思いながらコードを見直してみたところ、私の初歩的なミスが明らかになりました。

## やっちゃった原因

Next.jsのAPIルートを使っていると、コードがサーバーサイドで動いているのかクライアントサイドで動いているのか、ちょっと混乱することがありますよね。今回の場合：

1. **APIルートの特徴**
   - APIルートのコードは基本的にサーバーサイドで実行される
   - でも、そのAPIを呼び出すコードはクライアントサイドで動く

2. **今回のミス**
   - APIを呼び出す側（クライアントサイド）のコードで`process.hrtime()`を使おうとしてた
   - ブラウザには`process`オブジェクトがないので当然エラーに...😅

### process.hrtime()って実はすごい！

そもそも`process.hrtime()`を使おうとしたのには理由があって、これがNode.jsの高精度タイマーとしてかなり優れているんです：

- [秒, ナノ秒]のタプルを返すので、ナノ秒レベルの精度がある
- システムの単調増加クロックを使用するので、時計の調整に影響されない
- `process.hrtime.bigint()`を使えばナノ秒単位の数値を直接取得できる
- Node.js環境では最も高精度な時間計測が可能

...でもブラウザでは使えないんですよね 😅

## どう直したの？

調べてみると、`performance.now()`という便利なAPIがあることがわかりました：

```typescript
// Before: うっかりNode.js専用のコードを書いてた...
const timing = {
  processStartTime: process.hrtime(),  // [秒, ナノ秒]のタプル
  uploadStart: new Date()
};

// After: performance.now()を使用
const timing = {
  processStartTime: performance.now(),  // ミリ秒単位の高精度タイマー
  uploadStart: new Date()
};
```

### performance.now()もすごい！

調べてみると、実は`performance.now()`もかなり優れたAPIだということがわかりました：

- マイクロ秒レベルの精度（Date.now()より高精度！）
- システムクロックの変更の影響を受けない
- ブラウザでもNode.jsでも使える（Node.jsの場合は要import）
- 今回の用途（処理の開始時点からの相対時間）で、測定が簡単

⚠️ **注意点**：サーバーサイド（APIルート内）で`performance.now()`を使用する場合は、`node:perf_hooks`からのインポートが必要です：


```typescript
import { performance } from 'node:perf_hooks';
```

## Next.jsでの教訓

この経験から、Next.jsを使う上で大事なことに気付きました：

1. **実行環境を意識する**
   - APIルート → サーバーサイド（Node.js環境）
   - APIを呼び出すコード → クライアントサイド（ブラウザ環境）
   - Server ComponentsとClient Componentsの区別も同様に重要

2. **環境固有のAPIの扱い**
   - Node.js固有のAPIはサーバーサイドでのみ使用
   - ブラウザ固有のAPIはクライアントサイドでのみ使用
   - 共通のAPIを使う場合も、環境による違いを確認

3. **コードの配置を考える**
   - Node.js専用の処理はAPIルートの中に
   - ブラウザ依存の処理は適切にクライアントコンポーネントに
   - 必要に応じて環境チェックを実装

## まとめ

恥ずかしい失敗ではありましたが、これをきっかけにNext.jsでの実行環境の違いをより意識するようになりました。特にApp RouterやServer Componentsを使う場合は、コードがどこで実行されるのかを常に意識することが大切だと学びました。

似たような「あれ？」を経験した方や、これから経験しそうな方の参考になれば幸いです。Next.jsの開発では、サーバー/クライアントの境界を意識することで、より堅牢なアプリケーションが作れるはずです。

このブログは https://tech.jugoya.ai/ で公開している Next.js プロジェクトの開発過程で得られた知見の一つです。他の記事やソースコードも公開していますので、ぜひご覧ください！

ちなみに、より詳しく知りたい方は以下のドキュメントもチェックしてみてください：

- [Next.js: API Routes](https://nextjs.org/docs/pages/building-your-application/routing/api-routes)
- [Node.js: Performance Hooks](https://nodejs.org/api/perf_hooks.html)
- [MDN: performance.now()](https://developer.mozilla.org/docs/Web/API/Performance/now)

皆さんも似たような経験がありましたら、ぜひコメントで教えてください！
[Date Management] データ管理ツールの概論（役割、類似性、分類）

# データ管理ツールの役割と主なツール
|ツール名|役割|主なツール|
|:--|:--|:--|
|iPaaS|クラウドベースで異なるクラウドアプリケーションやオンプレミスシステムを連携させる|- Boomi<br>- MuleSoft<br>- Workato|
|DIS<br>(Date Integration Solution)|複数のデータソース（オンプレミス、クラウド、APIなど）からデータを収集し、統合してアプリケーションや分析のために提供する|- Informatica<br>- Talend<br>- Dell Boomi<br>- Azure Data Factory<br>- Ab Initio|
|ETLツール|データを抽出（Extract）、変換（Transform）、ロード（Load）するプロセスを自動化|- Talend<br>- Apache Nifi<br>- Informatica PowerCenter|
|データストリーミングツール|リアルタイムでデータを処理・配信する|- Apache Kafka<br>- Amazon Kinesis<br>- Google Pub/Sub<br>- Azure Event Hubs|
|MDM<br>(Maste Date Management)|組織内のマスターデータ（顧客情報、製品情報など）を統一、クレンジングし、一貫性を確保する|- Informatica MDM<br>- Stibo Systems<br>- SAP Master Data Governance (MDG)|
|データガバナンスツール|データの管理方針（セキュリティ、利用制限、ライフサイクルなど）を策定・実施|- Collibra<br>- Alation<br>- Informatica Axon|
|ERP|財務、製造、物流、人事などの基幹業務を統合管理する|- SAP ERP<br>- Oracle ERP Cloud<br>- Microsoft Dynamics 365|
|CRM|顧客データを管理し、営業やマーケティング活動を最適化する|- Salesforce<br>- HubSpot<br>- Microsoft Dynamics CRM|
|BIツール|データを分析し、ダッシュボードやレポートで視覚化してビジネスインサイトを提供|- Tableau<br>- Power BI<br>- Qlik Sense|
|DWH<br>(Date Warehouse)|大量のデータを統合して保存し、分析に適した形で管理するためのプラットフォーム|- Snowflake<br>- Google BigQuery<br>- Amazon Redshift<br>- Microsoft Azure Synapse Analytics|

# 各ツールの類似性による誤認理由
|ツール名|役割（要約）|誤認理由|
|:--|:--|:--|
|iPaaS|アプリケーション連携|誤認先：DISやETLツール<br>iPaaSはアプリケーション間のリアルタイム連携に焦点を当てている|
|DIS|データソースを統合|誤認先：ETLツール<br>データ統合はETLだけでなく、リアルタイム連携や複雑なワークフローも対象|
|ETLツール|データ抽出・変換・ロード|誤認先：DIS<br>ETLツールはデータ統合の中の特定の機能を担う|
|データストリーミングツール|リアルタイムデータ処理|誤認先：ETLツール<br>データストリーミングはリアルタイムデータ処理に特化||MDM|データ品質と整合性|誤認先：DIS<br>MDMは「データ品質管理」に特化しており、統合プロセス全体は含まない|
|MDM|データ品質と整合性|誤認先：DIS<br>MDMは「データ品質管理」に特化しており、統合プロセス全体は含まない|
|ERP|基幹業務管理|誤認先：CRM<br>ERPは基幹業務全体を統合し、CRMはその中の顧客管理に特化|
|CRM|顧客データ管理|誤認先：MDMやDIS<br>CRMは顧客データの運用管理が中心|
|データガバナンスツール|データポリシー管理|誤認先：MDM<br>データガバナンスはポリシー管理が中心|
|BIツール|データ分析・視覚化|誤認先：DWH<br>BIツールはデータを蓄積せず、既存データを可視化するために利用|
|DWH|データ蓄積・分析専用|誤認先：データベース<br>データウェアハウスは「分析専用」に特化している|


# 各ツールの親子関係
~~~:親子関係
iPaaS
├── DIS
│   ├── ETLツール
│   └── データストリーミングツール
├── MDM
│   ├── データガバナンスツール
│   ├── ERP
│   └── CRM
├── BIツール（連携先）
└── DWH（連携先）
~~~

# 参考リンク
- [イラスト付きで解説！BIツールとDWHの違いは？](https://it-trend.jp/bi/article/bi_dwh)
- [ETLツールの比較12選！タイプ別に一覧化して紹介](https://www.aspicjapan.org/asu/article/13985)
- [EAI、ETL、ERP、MDM システムの違いとは？](https://smooz.cloud/news/column/eai-etl-erp-mdm-%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E9%81%95%E3%81%84%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B/)
- [【図解】BIツールと「DWH」や「ETL」との違いとは？](https://it-trend.jp/bi/article/bi-as_dwh_etl)
- [ETLツールとは？DWH・EAIとの違いや必要な理由・選ぶ際のポイントを解説](https://www.toshibatec.co.jp/datasolution/column/20240301_01.html)
- [DWH（データウェアハウス）とは？　データベースとの違い、主な機能と活用例、連携・併用で相乗効果が期待できるIT製品を紹介](https://itselect.itmedia.co.jp/crm/article/1517/)
- [BIツールとDWHの違いを分かりやすく解説](https://www.hitachi-solutions-create.co.jp/column/core-system/bi-dwh.html)
- [ETLツールおすすめ10選を徹底比較！選び方のポイント](https://growth-marketing.jp/knowledge/etltools/)
- [https://www.ntt.com/content/dam/nttcom/hq/jp/business/services/data-utilization/dxplatform/sdpf/simulation/pdf/03.pdf](https://www.ntt.com/content/dam/nttcom/hq/jp/business/services/data-utilization/dxplatform/sdpf/simulation/pdf/03.pdf)