OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftUI @プロパティラッパー

## State
- ビューの状態を管理する。状態が変更されるとビューが再描画される。
```
@State private var count: Int = 0
```
## Binding
- 親ビューと子ビュー間でデータを双方向にバインディングする。
```
@Binding var isOn: Bool
```
## ObserverObject
- 外部のObservableObjectを監視する。通常、ビューの外で管理されるデータを使用する。
```
@ObserverObject var viewModel = MyViewModel()
```
## Environment
- 親ビューから提供された環境値を受け取る。テーマや設定など、ビュー階層全体で共有されるデータを使用する。
```
@Environment(\.colorScheme) var colorScheme
```
## EnvironmentObject
- 環境オブジェクトを使ってビュー階層全体にデータを渡す。ObservableObjectに準拠したオブジェクトを使う。
```
@EnvironmentObject var userSettings: UserSettings
```
## Published
- ObservableObject内のプロパティに使い、そのプロパティが更新されるとビューが更新される。
```
@Published var name = ""
```
## StateObject
- ObservadbleObjectのインスタンスをビュー内で管理し、状態を保持する。インスタンスはビューのライフサイクル内で作成される。
```
@StateObject var viewModel = MyViewModel()
```
## AppStorage
- ユーザー設定をUserDefaultsと連携して管理する。アプリケーションの設定などを保存するのに便利。
```
@AppStorage("userTheme") private var theme: String = "light"
```
## MainActor
- 非同期操作をメインスレッドで実行することを指定する。UIの更新などがメインスレッドで行われることを保証する。
```
@MainActor func updateUI() {
   // メインスレッドでUI更新
}
```
## ViewBuilder
- 複数のビューを条件に応じて組み合わせる際に使用する。ビューのクロージャーを組み立てる。
```
@ViewBuilder var body: some View {
   if isLoggedIn {
        Text("Welcome back!")
   } else {
        Text("please log in")
   }
}
```
## ScaledMetric
- アクセシビリティ設定に基づいてスケーリングされるサイズを取得する。ユーザーの設定に合わせて自動的にサイズが調整される。
```
@ScaledMetic(relativeTo: .body) var fontSize: CGFlote = 16
```
## Transaction
- トランザクション内でプロパティを操作し、状態変更を効率的に管理する。
```
@Transaction var transactionValue: Int = 0
```
## FocusState
- フォーカスされている入力フィールドやビューを管理する。フォームなどで現在どのフィールドにフォーカスがあるかを追跡する。
```
@FocusState private var focusedField: Field?
```
## GestureState
- ジェスチャー（タップ、ドラッグなど）の状態を追跡する。進行中のジェスチャーの情報を反映させるのに使う。
```
@GestureState private var dragOffset = CGSiza.zero
```
## StateObject
- 新しいObservableObjectを作成し、それをビューないで保持する。状態はビューのライフサイクルを通じて維持される。
```
@StateObject var viewModel = MyViewModel()
```
Dify+Xinference+OllamaでローカルAIチャットボットを作る！

# はじめに
とりあえず殴り書きでやったことをダーーーーって書く。
詳細は省いてるかもしれない。

[第二弾：Dify+Xinference+OllamaでローカルAIチャットボットを作る！](https://qiita.com/segfo/items/2d1077060114ae9a17eb)

# モチベーション
いつでもお話しできる友達ほしい。（壁打ち要員）
午前2時くらいに話し始めて5時くらいまで散発的に話しても怒らない友達。大体の友達これやると怒るor応答しないからｗ
昔さ、伺かってソフト有ったじゃないですか。

https://dic.pixiv.net/a/%E4%BC%BA%E3%81%8B

こういうのに組み込みたいんですよ。
ていうかああいうのがLLMで動いてたらロマンしかなくないっすか？
伺かは人工無能がベースだったけど、人工無能って人工知能を目指してたじゃないっすか。
あんまり言語化できないけどロマンあるよねｗ

しかもそれがローカルで**OpenAIのAPIを使わずに**動くって最高じゃないっすか？


# コンセプト
**雑談からハッキング、電気工事の専門的な話まで！** をコンセプトに作っていく。

# エモさ
やっぱりさ、雑談するときってエモい会話ができないとだめだと思うんですよ。
日本って詫びさび的なのあるじゃん。別に詫びさび命ってわけじゃないけど、なんか時期感や時間の考慮くらいはしてほしいんだよね。
ってことで、雑談するときは時間や今の季節の考慮をするように設計します。

# 参考書籍
LangChainとLangGraphによるRAG・AIエージェント［実践］入門

https://www.amazon.co.jp/dp/4297145308

とりあえず4章まで読んだところで、せっかくならというノリで作り始めた。
なお本書籍にはDifyのインストールの方法等は記述がなくすべてOpenAIのAPIを使う前提であるので、それはそれでやった方がいい。

# アーキテクチャ
| ソフトウェア |役割|コメント
|---|---|---|
|Ollama|LLMモデルやEmbeddingsモデルを走らせるやつ|みんな大好きOllama
|Xinference|RAGするときのRerankモデル|辞書を引く時に特化した精度向上のLLMみたいなやつ
|Dify|チャットUIとワークフロー構築|Python+LangChainの代用

## 雑な図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30037/31167106-6d19-47ca-bfe2-37b71d1a9643.png)

# 実装
というわけでやっていき。

## 環境構築
WSL2上のDockerに構築するやつ
[Dify](https://qiita.com/24Century/items/181730f7f17b5381b6b8)
[Xinference](https://qiita.com/orca13/items/93431d9d1e8c1129be69)
[Ollama](https://ollama.com/)

OllamaはWindows上で動かすけど、デフォルトでは127.0.0.1:11434でリッスンするので、以下のようなスクリプトを作って、手動で起動するといい感じになる。Powershell7で動く。

``` ollama_run.ps1
$Env:OLLAMA_HOST="0.0.0.0:11434"
$Env:OLLAMA_CONTEXT_LENGTH=8192
ollama serve
```
OLLAMA_CONTEXT_LENGTHはモデルのコンテキストサイズに合わせて調整するといいかもしれんすけどね。調べてないので知らんけど。知ってる方いたら編集リクエストぶん投げてください。（断固として調べるつもりはない。サーセンｗ）

## 参考書籍を1章～4章まで読む
1章：基本的なLLMって何だろうみたいなやつ　おもろいので読む
2章：OpenAI APIの使い方　この記事のやつやるなら読み飛ばしていいやつ
3章：プロンプトエンジニアリング　これはマジで本の通りにやって感覚をつかむといいやつ
4章：RAG入門　これもマジで本の通りにPythonでやったらいい

## できたもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30037/2ee88003-4856-4213-aa7d-4cb2f16b8a3b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30037/3c9d086d-4df0-410a-9986-538fa6504c3d.png)
![スクリーンショット 2025-03-25 193502.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30037/714b0a9f-92f3-43b0-87b0-cf971d687da3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30037/f803f407-1660-42ed-a0ce-dff2418a7c67.png)

今のところ第二種電気工事士の知識しか教えてないけど、普通に俺より賢いんじゃねーかってくらいには正確に返してくれる（たまにRAGの経路通らなくて雑回答を返すことがあるけど、まだ改善の余地はある）
でも最後の直線って何だって話だし、いうなら「直流」だししかも最後7000Vは交流直流関係ないんだけどね

# セキュリティ
基本的なプロンプトインジェクション（最低限、情報開示を防ぐレベル）を防ぐことはやっておきたい。
あとはまぁ基本的なLLMモデルの性能に頼る。
コンテキストを維持する場合、基本的にプロンプトインジェクションした後はほとんどバグるけどまぁﾖｼｯ

# まとめ
ローカルでもこんなに高性能な奴が工夫次第でできるという話でした。
今後の展望としては前述した伺かのようなものを作ったり、ComfyUIと連携して画像を錬成したりといった感じで、組み合わせで幅が大きく広がるからどんどんやっていきたい。
[LangGraph] Prebuilt ReAct Agentを触ってみる

# 重要な記事
[LangGraph 0.3 Release: Prebuilt Agents](https://blog.langchain.dev/langgraph-0-3-release-prebuilt-agents/)
- 高レベルの抽象化により、簡単に始めることができ、新しい認知アーキテクチャを簡単に試すことができ、この分野への素晴らしい入り口となる
- これまで、上位レベルの抽象化が 1 つあり、メインlanggraphパッケージに存在している。これはcreate_react_agent、単純なツール呼び出しエージェントを作成するためのラッパーだ。今日、これを 0.3 リリースの一部として langgraphから分離し、 langgraph-prebuiltに移動した
- https://langchain-ai.github.io/langgraph/reference/prebuilt/

### langchainアーキテクチャ
![langchainアーキテクチャー](https://python.langchain.com/svg/langchain_stack_112024.svg)
- https://python.langchain.com/docs/concepts/architecture/



# Tool Callingとは
- tool callingはLLMが外部ツールを使用することを指す
- メリット: ツールを活用することでLLMができない作業もできるようになること


![tool calling concept](https://python.langchain.com/assets/images/tool_call_example-2348b869f9a5d0d2a45dfbe614c177a4.png)
参照：https://python.langchain.com/docs/concepts/tool_calling/

1. Tool Callingの関数を定義する
1. 定義した関数をLLMの実行に紐づける
1. LLMから呼び出された関数を実際に実行する

### 試すコード
* https://raw.githubusercontent.com/alingogo/langGraph-study/refs/heads/main/PrebuiltReActAgent/tool_calling_concept.py

### デメリット
* Toolとして定義した関数は bind_tool でモデルに紐づけただけでは自動的に実行されません
* hello worldなどメッセージを入力すると、定義した関数と紐づけることができなく、エラー発生
* 単一AIエージェントで利用できそう

参照：
- [Tool Calling](https://python.langchain.com/docs/concepts/tool_calling/)
- [[LangChain] Tool Calling 入門](https://zenn.dev/pharmax/articles/1b351b730eef61)

# LangGraph

### create_react_agent
![スクリーンショット 2025-03-23 18.56.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13451/851d0b94-2cf9-47ef-b18e-0b876de93155.png)
参照：https://langchain-ai.github.io/langgraph/reference/prebuilt/#langgraph.prebuilt.chat_agent_executor.create_react_agent

1. Toolを呼ばれているか判断する
1. Toolを呼ばれていたら、Toolの結果と共にLLMで判断する
1. 結果出ていれば、処理終了

### 試すコード
* https://raw.githubusercontent.com/alingogo/langGraph-study/refs/heads/main/PrebuiltReActAgent/create_react_agent.py

### メリット
* 計算処理じゃないプロンプトの場合、例えば、「面白い話を教えて」をインプットするでも答えをもらう
2つの自然数が互いに素である確率にπが出てくる不思議【Pythonで実験してみた】

## 記事の内容

今回の記事では、数学的にも、プログラミング的にも、とても興味深いテーマを紹介します。

2つの自然数が互いに素である確率、という問題です。

そして、その答えは、

```math
\dfrac{6}{\pi ^{2}}
```
であるというものです。

自然数が絡む確率の話なのに、なぜか円周率が出てくるのです！！

不思議ですよね。

この記事では、数学的な話とプログラムを使った話で、この問題を解説します。


## 問題のイメージ
もう少し説明しましょう。

自然数は無限にあります。その中から無作為に一つの自然数を選びます。続けて、重複を許しつつもう一度、自然数を無作為に選びます。

このとき選ばれた2つの自然数が互いに素である確率を考えるのです。

この答えに円周率である $ \pi $ が登場することが不思議に見えます。

くわえて、無限は厄介です。無限があるせいでイメージしづらくなります。

### 例
具体的に考えてみましょう。

範囲を100までの自然数とします。

この範囲で自然数を一つ選ぶ。さらに、もう一回選ぶ。

5と19が選ばれたとします。このとき、この2つの自然数が互いに素になるかどうかを考えるのです。

5と19なら、互いに素です。
21と63なら、互いに素ではありません。
68と7なら、互いに素です。

このように試行を繰り返せば、そこには確率を考えることができます。

少しはイメージがわいてきたでしょうか？



## 引用元　
この問題は、数学youtuberの鈴木貫太郎さんの動画から引用しています。
おそらく、もともと有名な問題なのではないでしょうか。

[２つの自然数が互いに素ある確率。６／πの２乗](https://www.youtube.com/watch?v=l_rMXGNrrNc:embed:cite)

## いったいどこから円周率が出てくるのか？

もう少し数学的な話に入っていきましょう。

どこから $ \pi$ が出てくるのか？
この謎の答えは、<b>「自然数の平方の逆数の和」</b>のせいです。

あの天才オイラーが解決した問題です。
オイラーは次の数式を導きました。

```math
\dfrac{1}{1^{2}}+\dfrac{1}{2^{2}}+\dfrac{1}{3^{2}}+\dfrac{1}{4^{2}}+\ldots =\dfrac{\pi ^{2}}{6}
```

この数式を導く過程で、「自然数の平方の逆数の和」を考えるために、三角関数を使って近似しているのです。三角関数を利用しているのならば、円周率である$ \pi$が登場するのも自然です。

詳しい証明は、鈴木貫太郎さんの動画をご覧ください。どのように三角関数を利用しているのか、ぜひチェックを。

そして、2つの自然数が互いに素である確率を求めようとすると、「自然数の平方の逆数の和」が式に現れてくるのです。上記のオイラーの式と繋がります。


## プログラム使えば実験できるのでは!!

ここで一つ思いついたことがあります。

確率の話なのだから、実際に繰り返し試してみればいい。

実験すれば、数式の結果を確かめられるはずです。

コンピュータに繰り返し試行させることで、実際に確率を求めてみましょう！

今回はpythonで実装してみました。

ポイントは互いに素であるかどうかの判定です。これは、互いに1以外の公約数を持たなければいいのです。

2つの数を与えると最大公約数を返してくれる関数を考えます。このとき最大公約数が1ならば、互いに素であると判定できます。最大公約数を求めるアルゴリズムといえば、<b>ユークリッドの互除法</b>です。

ユークリッドの互除法では、以下の手順で最大公約数を求めます。

```python
import math # 円周率をつかうため
import random

def gcd(a, b):
    """
    2つの整数 a, b の最大公約数 (GCD) をユークリッドの互除法で求める関数

    :param a: 整数
    :param b: 整数
    :return: a と b の最大公約数
    """
    while b != 0:  # b が 0 になるまで繰り返す
        a, b = b, a % b  # a を b に、b を a を b で割った余りに更新する
    return a  # b が 0 になったときの a が最大公約数

s = 0
num = 1

while num <= 10000000:
  a = random.randint(1,10000000)
  b = random.randint(1,10000000)
  if gcd(a,b) == 1: # 最大公約数が1のとき互いに素であると判定
    s += 1
  num += 1


print(s / num) # 実験値
print(6 / math.pi**2) # 理論値

```

今回は、1～10000000の中から自然数を選びます。
そして、10000000試行です。

その結果は、次のようになりました。
上が実験で求めた値、下が理論的に求めた値です。
かなり近い値になっていることがわかるとおもいます。この結果には驚きです。数学という理論の強さを目の当たりにした気分です。そして、プログラムをとおしてコンピュータを利用することの面白さも改めて確認できました。

```python
0.607662239233776
0.6079271018540267
```

皆さんの環境でもぜひ試してみてください。
不要なパーティションデストロイヤーシステム

## 春の大掃除

Windowsが入っていた時の残りやUbuntuをdual bootした時にできる変なパーティションありますよね。erase diskでインストールしても消えないやつ。そいつを完全に消し去る完璧で究極の方法をご紹介🎵

## 不要なパーティションデストロイヤーシステム

不要なパーティションデストロイヤーシステム = Windows USB installer 

## 実行手順
このリンクの先にある`Windows 11 のインストール メディアを作成する`をクリックしてインストールメディアを作成しよう。

https://www.microsoft.com/ja-jp/software-download/windows11

この画面まで行ってパーティションを選択して`削除(D)`をクリックして消していく。

![IMG_2059（大）.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/8c168a18-0a9f-49d0-9356-2b8df47f1597.jpeg)
Javaのコンパイラ方式をざっくりまとめてみた[Java初心者]



## はじめに
初めて投稿します。
プログラミング初心者Wakinozaと申します。
Java勉強中に調べたことを記事にまとめています。

十分気をつけて執筆していますが、なにぶん勉強始めたての初心者が書いた記事なので、理解が浅い点などあるかと思います。
記事を参考にされる方は、初心者の記事であることを念頭において、お読みいただけると幸いです。
間違い等指摘いただけると、当方飛び上がって喜びます。
よろしくお願いいたします。

## 対象読者
Java初心者の方。
Java SE Bronze試験を勉強中の方。
その他、Javaのコンパイラ方式について、ざっくり理解したい方など。

## 目次
1\. コンパイラとは
2\. 事前コンパイラ方式とインタープリタ方式
3\. インタープリタ方式
4\. Javaのコンパイルの流れ

## 本文
### 1\. コンパイラとは
何らかのプログラミング言語で書かれたコードを「ソースコード」と呼びます。
ソースコードは、会話用の言語に近い文法を使っているため、人間にも読み書きしやすいのが利点ですが、コンピュータには理解できません。
コンピュータに理解してもらうには、ソースコードを機械語（ネイティブコード）に翻訳する必要があります。
このソースコードから機械語への翻訳作業を「コンパイル」、翻訳作業を行うプログラムを「コンパイラ」と呼びます。

機械語も一種類ではありません。
プログラムを動作させる環境のOSやCPUによって、コンピュータが理解できる機械語は異なります。
そのため、Windows用にコンパイルした機械語とMac用にコンパイルした機械語は、同じソースコードからコンパイルした機械語であっても互換性はありません。

コンパイルには、２つの種類があります。
事前コンパイラ方式とインタープリタ方式です。

:::note info
注釈
事前コンパイラ方式は、「コンパイラ方式」とも呼ばれます。
接頭の「事前」は、後述する「実行時コンパイラ方式」と区別するための呼び方かと思われます。
:::

### 2\. 事前コンパイラ方式
ソースコードをあらかじめコンパイルしてからプログラムを実行する方式のことです。
CやC++などで採用されています。
長所は、あらかじめ機械語に翻訳されているため高速にプログラムを実行できること。
短所は、機械語の互換性がないため、対象のOS以外ではプログラムを実行できないこと。

### 3\. インタープリタ方式
「インタープリタ」と呼ばれる専用のアプリケーションを使い、プログラム実行時に、ソースコードをコンパイルする方式です。
PHPやJavaScriptなどで採用されています。
長所は、事前にコンパイルしておく必要がないため、OSごとのインタープリタを用意すれば、様々なOSでプログラムを実行できること。
短所は、ソースコードを１行ずつコンパイルするため、事前コンパイラ式を比べて実行速度が遅くなってしまうこと。

### 4\. Javaのコンパイルの流れ
Javaは、この２つの良いとこどりの方式を採用しました。
それが、実行時コンパイラ方式です。

実行時コンパイラ方式は、機械語への翻訳作業を２回に分けていることが特徴です。
１回目がソースコードから中間コードへの翻訳、２回目が中間コードから機械語への翻訳です。

１回目の翻訳では、Javaコンパイラが、ソースコードを中間コードに翻訳します。
中間コードは、ソースファイル（sample.java）をコンパイルして生成されるクラスファイル（sample.class）のことで、以下の２点の利点があります。
- 翻訳効率が良い２進数のバイトコードで記述されていること
- まだOS固有のコードに変換されていないため、様々なOSで利用することができること

２回目の翻訳では、Java仮想マシン（JVM ：Java Virtual Machine）プログラムが、中間コードを実行時に機械語へ翻訳します。
すでに翻訳効率の良い中間コードに変換されているため、他のインタープリタ方式言語よりもプログラムの実行速度が優れていることが特徴です。

Javaは、翻訳作業を２回に分けることによって、様々なOSで利用できるというインタープリタ方式の利点を持ちながら、実行速度を高めることに成功したのです。

最後までお読みいただき、ありがとうございます。:laughing:


## 参考文献
- [徹底攻略 Java SE Bronze 問題集]
- [スッキリわかるJava入門 第４版]
- [改訂３版 これから始めるプログラミング基礎の基礎]
- [プログラムはなぜ動くのか 第３版]
Vue tach Vue3 Composition

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/fd2713e1-f1fa-a3d7-f09b-fec31025d2f5.png)

# はじめに

先日、仕事で初めての React を 1 カ月ほど頑張りました。まだ、フロント系を勉強してみたいので、Vue.js を初めてみます。
先輩から、「Vue をやるなら Composition!」と言われているので、いつも通りに `Hello World` から始めてみたいと思います。

# 開発環境

- OS : Windows 11 Pro
- Cursor(IDE) : 0.42.3

# vue のインストール

`veu3` のインストール

`> npm install -g @vue/cli` 

## vue2 のアンインストール

`> npm ls` or `> npm ls -g` で、`vue2` がインストールされているか確認。もし、インストールされていればアンインストールする。
`> npm uninstall -g vue-cli`

# プロジェクトの作成

まずは、helloworld のプロジェクトを作成する。
`> vue create vue_helloworld`

## プロジェクトの選択

```
Vue CLI v5.0.8
? Please pick a preset: Default ([Vue 3] babel, eslint)
? Pick the package manager to use when installing dependencies: NPM
```

### What is babel?

ざっくり言うと、「ES6等の新しい文法をES5に変換してくれるコンパイラ」

### What is eslint?

ざっくり言うと、「JavaScriptの記述スタイルチェックツール」


# おわりに

まずは、簡単な `Hello World` からなのでシンプルですね。
今後は React と比較しながら勉強していきたいとおもい

---

**参考（感謝）**

- [Vue.js入門(Vue.jsの初心者は必ず読め‼︎](https://qiita.com/Hashimoto-Noriaki/items/ea60d5932f13a9cd5707)
- [今、ゼロから Vue を学び始めるならこうやるといいんじゃないか (2024) ](https://zenn.dev/comm_vue_nuxt/articles/start-to-learn-vue-2024#%F0%9F%A4%94-vue.js-%E3%81%A3%E3%81%A6%E4%BD%95%E3%81%8B%E3%82%89%E5%8B%89%E5%BC%B7%E3%81%99%E3%82%8C%E3%81%B0%E8%89%AF%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F)
- [Vue.js 3 入門 「Vue CLI のセットアップ」](https://qiita.com/yagi405/items/4e498ef424b92d9d38d0)
- [Babelとはいったいなんなのか](https://www.hanachiru-blog.com/entry/2019/10/22/204440)
- [【Vue CLI】ファイル構成 :main.js, vueファイル編](https://qiita.com/Quest_love33/items/620b395fe1c4e50664c2)
-
未経験エンジニアが実務についていくためにしたこと

こんにちは！
2025年1月からTypescript、goなどを使用したスタートアップ企業のプロジェクトに参画しています。
参画できた経緯は幸運なことに、友人からの紹介でした。（友人には本当に感謝しています。🙇）

#### 仕事内容
- 勤務内容：土日フルリモート
- 稼働時間：月40時間ほど　（実際には業務についていくために80時間ほど費やしていました）
- 担当業務内容：開発業務、エラー改善、リファクタリングなど

今回は実務未経験のエンジニアが開発業務についていくためにしたことを挙げていきます。


# 1.自分が担当しているコードで分からないところが無いようにする
自分はgoやnext.jsが分からないところから参画したこともあり、実務のコードで分からないことがたくさんありました。これではベテランエンジニアさんとプロジェクトについて会話することもままならないため、業務時間外の平日２～３時間を担当コードの学習にあてました。これにより、２週間後に担当部分については、ベテランエンジニアさんとも会話ができるようになり、業務効率が向上したと感じました。

# 2.早い段階で進捗を共有する
新人が自分が思った通りに仕事を進めて、結果はダメダメでした。だと、時間を大幅にロスしてしまうので、質の低い制作物でもできるだけ早い段階で共有することで正しい方向に修正することを心掛けていました。

# 3.ディレクトリ構造やファイル、関数の依存関係を把握しておく。
aiでコードを生成する上で、生成されたもののファイルや関数の依存関係が分かってないとスパゲッティコードになりかねないことを存分に思い知りました。ディレクトリ構造やファイル、関数の依存関係についても担当周りは全て把握できるように平日にキャッチアップしました。

# 4.できるだけオフライン作業する
現場ではリーダーが土日でも質問に対応できる環境を整えてくれていたため、フルリモート勤務でも比較的スムーズに業務を進めることができました。しかし、フルリモート勤務はコミュニケーションが極端に減るため、実務未経験の段階では成長という観点から良くないと感じました。そのため、ベテランエンジニアの方がよく利用するコメダで一緒に作業をさせてもらい、環境構築などで行き詰まった際にはお世話になりました。
PHPerKaigi 2025 に参加してきました！

## はじめに

3/22・23の2日間、PHPerKaigi 2025に参加してきました。

自分が聴いた中で特に印象に残ったセッションについて、まとめていきます。
※自分なりの解釈もあるため、うまく理解・咀嚼できていないところがあります。また公開されている資料を添付しております。

---

# セッション

## **PHPによる"非"構造化プログラミング入門 -本当に熱いスパゲティコードを求めて-**

構造として、MVC2型・構造化（手続型）・非構造型を分かりやすく伝えているセッションでした。

非構造型は、わずか2ファイルという構造から見るとシンプルで個人的にはスッキリしていていいなと感じました。肝心の中のコードはスパゲッティコードと言われるコードで、特にgoto 文を使って、**プログラムの実行フロー（処理の流れ）をラベルにジャンプして制御する**書き方のことは知らなかったので、こういう書き方があるんだと勉強になりました。

身近なところで言うとcomposerの中にgotoがあるのに驚きました。

印象的な言葉は「人間が考えていく範囲は変化していく」という言葉。何年も前と同じでいいのかは自分の頭で考えていかないといけないと感じました。

資料：https://speakerdeck.com/o0h/phperkaigi-2025

## **PHPでお金を扱う時、終わりのない謎の1円調査の旅にでなくて済む方法**

PHPで数字を扱う時にどういうところに気をつけた方が良いのか、またこうしたら良さそうと言う内容を分かりやすくまとめられているセッションでした。

基本的に数字は、文字列で扱いBCMath系関数で計算した方が良い。文字列にできない場合はintで丸めの処理が起きないようにfloatは使用しない方向にする。

初めて知ったのですが、ValueObjectとして意味のある値に振る舞い（ロジック）を持たせたクラスを作って、値に関するロジックを集約して、このクラスの中以外で定義したりしないようにする。例えば消費税の計算をする際は、このValueObjectに合計金額を定義していて、このオブジェクトに対して消費税をかけることによって、もし消費税率が変化しても、ValueObject自体はそのままで良いなど

PHPで数字を扱うときに「どこに注意すべきか」「どう扱うとよさそうか」が分かりやすく解説されていたセッションでした。

基本的には「数字は文字列として扱って、BCMath系の関数で計算する」のが安心。floatは誤差が出るのでなるべく使わない方がよくて、どうしても数値として使うならintにして対応する。

特に面白かったのが、ValueObjectの活用。

たとえば「合計金額」みたいな意味のある値に専用クラスを作って、そこにロジック（例：消費税の計算）をまとめる。こうしておくと、たとえば消費税率が変わっても、そのクラスの中だけ直せばOKで、他のコードに影響しにくいところがなるほど！と面白かったです。

お金の計算に関わらず数値系、例えばポイントなどにも活用できそうです。

資料：https://speakerdeck.com/nakka/phpdeojin-woxi-ushi-zhong-warinonai-mi-no1yuan-diao-cha-nolu-nidenakuteji-mufang-fa

## **私の愛したLaravel 〜レールを越えたその先へ〜**

なぜ中規模のアプリケーションで破綻させてしまうのかについて分析されて、まとめられてた内容のセッションでした。博士の愛した数式という本に沿ってストリー性もあって最後まで面白かったです。個人的に「うるさくて汚くて癇に触るコード」が刺さりすぎて、痛かったです。

柔軟で拡張性のあるLaravelをどう破綻させないように設計をするのか、について言語化していただいて、スッキリした部分もあり、今後の業務にまで落とし込めるには、まだまだ不足しているなと感じました。ドキュメントに未記入＝対応されていない機能と思っていたので、そこの勘違いをなくして、スライドのリスクを最小限にするにはの内容をしっかり理解して、活かしていきたいと思います。

資料：https://speakerdeck.com/kentaroutakeda/si-noai-sitalaravel-reruwochao-etasonoxian-he

## **アーキテクトと美学：美しさがシステムにもたらす秩序と未来**

アーキテクトとはをアートを用いて表現されており、終始面白く分かりやすい内容のセッションでした。三角形の構図の話を聞いてから、アートを見ると無意識に構造を探してしまいそうです。

印象に残ったのは「アーキテクトには“価値を維持する”役目がある」という言葉。美しく価値あるものを作り続けるためには、その価値を守る意識が必要であり、それを養う手段のひとつとして“アートに触れる”という提案があったのがすごく良いなと思いました。

特に共感したのは「人は言葉でしか思いを伝えられない」という話。感じたことや考えたことを相手に伝えるには“言語化”が不可欠。でも、それはただ単に言葉にするだけじゃなく、背景にある知識や体験があってこそ伝わるものなので、この“言語化力”って、仕事でもプライベートでもすごく大事。どれだけAIが発達しても、自分の思いをどう伝えるかは自分にしかできないことだからこそ、この言語化力を養っていきたいと思いました。

資料：https://speakerdeck.com/nrslib/architecture-and-aesthetics

# 企画

PHPerKaigi 2025の中では、セッションだけではなく、スタンプラリーやコードバトル、ランチマッチング企画など、そのほかの企画も盛りだくさんで、今年は企画にも参加しました。

スタンプラリー（写真撮り忘れました。）は全部制覇して12回まわしましたが、全部白（ハズレ）と12回回せば1回当たる確率なのに、当たらなかったので逆に面白かったです。

参加賞でキーホルダーいただきました。今回参加できなかったメンバーへのお土産ができてよかったです。

ランチマッチング企画では、たまたま登壇者の方と一緒になったので、感想お伝えしたり、その他の方々とも交流できて、参加してよかったです。

# まとめ

こちらに書いていないセッションも含め、時間の都合で見れなかったセッションなど、後からみて勉強したいなと思っています。

去年参加した時は全くわからない・・・初めて聞くの状態からは、今年は「あ、なんとなく知っている。聴いたことある」など一部感じたところがあったので、少しは成長しているのかなと自分なりに感じれたところもあって、この1年間は無駄ではなかったなと感じました。

早速、帰りの飛行機まつ時間で先輩方々がこうしようかな、こうしたらいいよねって検討されていたので、自分なりに今回学んだところをどう業務に落とし込むと良さそうかを考えて、今後の業務に取り組みたいと思います。

貴重な経験させていただいた弊社、スピーカーのみなさま、参加者のみなさま、PHPerkaigiを開催・運営していただいたスタッフのみなさまに感謝いたします。ありがとうございました！
【Google Chat】メールアドレスの一覧から、Botで個人宛にメンションするためのユーザーIDを一度に取得する方法

## はじめに

Google Chat の Bot から個人宛にメンションを送るには、ユーザーIDを指定する必要があります。
しかし、このユーザーIDはGoogle ChatのUI上では確認できず、取得するにはAPIを利用する必要があり、簡単には確認できません。
本記事では、Google Workspace の Admin SDK Directory API を活用して、Google スプレッドシート上のメールアドレス一覧を基にユーザーIDを一度に取得する方法を解説します。

### この記事でわかる・できること

- Admin SDK Directory API を使ったユーザーIDの取得方法がわかる
- ユーザーIDを一度に複数取得できる 

### この記事の対象者

- Google Chat の Bot を開発している人
- Bot から個人宛にメンションを送りたい人

### 動作環境・使用するツールや言語

- Google スプレッドシート
- Google Apps Script (GAS)
- Google Workspace Admin SDK Directory API

## 1. Google Chat のユーザーIDとは？

Google Chat の Bot から個人宛にメンションを送るには、送信メッセージに `<users/{userId}>` のような文字列を含める必要があります。

例）`<users/123456789012345678901>` 

このIDはGoogle ChatのUI上では確認できず、APIを利用して取得する必要があります。

## 2. Admin SDK Directory API を使ったユーザーIDの取得方法

ユーザーIDの取得方法は、こちらのサイトを参考にさせていただきました。

https://qiita.com/takatama/items/9029ceef857516363c32#admin-sdk-api--apps-script%E3%82%92%E4%BD%BF%E3%81%86

## 3. メールアドレスの一覧からユーザーIDを一度に取得する方法

### 3.1 Google スプレッドシート上にメールアドレス一覧を用意する

Google スプレッドシート上に以下のような形式のメールアドレス一覧を作成してください。

|   | A | B |
| - | - | - |
| 1 | メールアドレス | ユーザーID |
| 2 | suguru@example.com |  |
| 3 | mayumi@example.com |  |
| 4 | tatsunori@example.com |  |

### 3.2 Google スプレッドシートからGoogle Apps Script (GAS)を作成する

メールアドレスのスプレッドシートのメニューから「拡張機能 > App Script」を開いた後、コードエディタに下記のコードを入力してください。
※`{メールアドレス一覧のシート名}`の部分は、作成したシート名に変更すること。

```javascript
function getUserId() {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName('{メールアドレス一覧のシート名}');

  // 1行目は表見出しなので、2行目から処理対象とする
  for (let i = 2; i <= sheet.getLastRow(); i++) {
    let userId = sheet.getRange(i, 2).getValue() // B列のユーザーIDを取得

    // 既にユーザーIDが入力されていた場合は、ユーザーIDを取得しない
    if (!userId) {
      let email = sheet.getRange(i, 1).getValue(); // A列のメールアドレスを取得
      userId = AdminDirectory.Users.get(email, { viewType: 'domain_public' }).id;
      sheet.getRange(i, 2).setValue(userId); // 取得したユーザーIDでB列を更新
    }
  }
}
```

### 3.3 サービスにAdminDirectoryを追加する

以下の手順で、GASのサービスにAdminDirectoryを追加してください。

①GASのコードエディタの左側にあるメニューの「サービス」の「＋」ボタンを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473622/033f2608-5142-473b-9106-20639a2a5f50.png)

➁ダイアログが表示されるので、「Admin SDK API」を選択して、「追加」ボタンを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473622/48c92cb4-fabf-48b6-9ca3-84c9dd989288.png)

③サービスに「AdminDirectory」が表示されて、利用可能になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473622/6603e737-3afa-4d36-8a7c-46a8bb69a239.png)

### 3.4 GASを実行してユーザーIDを取得する

エディタ上の実行ボタンを押すと、取得したユーザーIDがメールアドレス一覧のB列に表示されます。

|   | A | B |
| - | - | - |
| 1 | メールアドレス | ユーザーID |
| 2 | suguru@example.com | 123456789012345678901 |
| 3 | mayumi@example.com | 123456789012345678902 |
| 4 | tatsunori@example.com | 123456789012345678903 |

## おわりに

Google Chat のユーザーIDは UI では確認できず、API を使って取得する必要があります。
本記事では Admin SDK Directory API を用いて、メールアドレスの一覧からユーザーIDをまとめて一度に取得する方法を解説しました。
Bot の開発やユーザー管理に活用してください！
microsoft playwright-mcp 構築手順


#### 1. 前提条件の確認
- **Node.jsのインストール**: Playwright-MCPはNode.jsを使用するため、最新のLTSバージョンをインストールしてください（例: v18.xまたはv20.x）。
  - 確認方法: ターミナルで `node -v` を実行し、バージョンが表示されるか確認。
  - 未インストールの場合は、[公式サイト](https://nodejs.org/)からダウンロードしてインストール。
- **Gitのインストール**: GitHubからリポジトリをクローンするために必要です。
  - 確認方法: `git --version`
  - 未インストールの場合は、[公式サイト](https://git-scm.com/)からインストール。
- **OS**: Windows、macOS、またはLinuxがサポートされています。

#### 2. リポジトリのクローン
1. ターミナル（またはコマンドプロンプト）を開きます。
2. 以下のコマンドを実行して、リポジトリをPCにクローンします:
   ```bash
   git clone https://github.com/microsoft/playwright-mcp.git
   ```
3. クローンしたディレクトリに移動します:
   ```bash
   cd playwright-mcp
   ```

#### 3. 依存関係のインストール
1. プロジェクトの依存関係をインストールします:
   ```bash
   npm install
   ```
   - これにより、Playwrightやその他の必要なパッケージがインストールされます。
2. Playwrightのブラウザをインストールします（初回のみ必要）:
   ```bash
   npx playwright install
   ```
   - Chromium、Firefox、WebKitがダウンロードされます。

#### 4. MCPサーバーの起動
1. サーバーを起動する基本コマンドを実行します:
   ```bash
   npx @playwright/mcp@latest --headless
   ```
   - `--headless`: ブラウザをヘッドレスモード（画面表示なし）で起動。
   - ヘッド付きモード（ブラウザ画面を表示）で試したい場合は、`--headless`を省略するか、`--headed`を指定。

2. 起動すると、MCPサーバーが立ち上がり、ブラウザ自動化のためのツールが利用可能になります。

#### 5. 設定の調整（必要に応じて）
- **構成ファイル**: MCPサーバーの動作をカスタマイズしたい場合、`claude_desktop_config.json`などの設定ファイルを編集します（Claude Desktopなどと連携する場合）。
  - 例（macOSの場合の設定ファイルパス）:
    ```
    ~/Library/Application\ Support/Claude/claude_desktop_config.json
    ```
  - 設定例:
    ```json
    {
      "mcpServers": {
        "playwright": {
【クラウドアーキテクトとしてDXを支える】柔軟な働き方と挑戦できる環境とは？



最近、クラウドアーキテクチャの設計や運用において、「設計自由度」と「働き方の柔軟性」を両立できる環境って本当に少ないと感じませんか？

本記事では、現在私たちが携わっているインフラ事業の立ち上げ〜拡大フェーズにおける課題と、現場で得られるリアルな成長体験をご紹介します。

---

## 🔧 どんなプロジェクトに関われるのか？

私たちのチームはこれまでアプリケーション開発を中心に様々な業務システムやWebシステムを構築してきました。

しかし、顧客のDXニーズに対応する中で「アプリだけではなく、クラウドインフラ全体から最適化したい」という声が増えてきたのです。

そこで、新たにインフラチームを組織し、クラウドアーキテクトとして活躍できるエンジニアを募集中です。

---

## ✅ 求められるスキル・経験

- AWS / Azure 等を活用したクラウドインフラ設計・構築・運用
- クラウド特性を活かした方式設計（可用性・セキュリティ・パフォーマンス考慮）
- クライアントとの対話による要件整理・提案
- チームリード・設計の上流工程への関与

「ただ構築するだけではなく、顧客課題に寄り添った設計提案がしたい」  
そんな方にピッタリなポジションです。

---

## 💼 働き方の柔軟性

- フレックスタイム制（コアタイム：10:00〜15:00）
- リモートワークOK（約7割の社員がリモート勤務中）
- 東京・大阪どちらのオフィスも利用可能
- 年間休日120日以上
- 各種休暇制度（育児・介護・パートナーシップ等）あり

---

## 🎯 キャリアと成長の機会

- プライム案件90％：顧客と近い距離で仕事ができる
- バルゼミやUdemyでの社内研修あり（26,000以上の講座）
- チームリーダーやマネージャーへのキャリアパスも◎
- 評価制度：技術力＋行動評価のハイブリッド

---

## 👀 最後に

クラウドアーキテクトとして「設計にも提案にも関わりたい」「裁量を持って仕事したい」と考えている方、  
私たちのチームでその思いを実現してみませんか？

**📩 興味のある方はお気軽にDMください！**  
まずはカジュアル面談からでもOKです ☕
WindowsTerminalを使って簡単にEC2へSSHをする

# なぜやったか なぜ書いたか
勉強で進めていた"Amazon Web Services基礎からのネットワーク&サーバー構築"の中でEC2インスタンスに対してSSHする項目があり、本書ではRloginを使用していたが新しくインストールするのは面倒なので、既に使用しているWindowsTerminalで進めることは出来ないか調べた。
WindowsTerminalは雰囲気で使っていたが、今回のEC2インスタンスへのsshをやってみたら思っていた以上に便利じゃんとなったので備忘録として記述。
便宜上、鍵ファイルをhogehoge.pemとして記述します。

# 方法
## EC2インスタンス作成からインスタンスにssh接続するまで
EC2インスタンスを作成し、作成したインスタンスを選択した状態で右上の「接続」をクリックする。
![ec2_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529999/a01611a3-9913-4990-8626-69565cf6e743.png)
「インスタンスに接続」ページに移るので、「SSHクライアント」タブをクリック。
インスタンスにsshする方法が記述してあるが（下記画像）、画像の項目3にある`chmod 400 "hogehoge.pem"`はWindows環境では出来ません。
![ev24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529999/babc6c74-716e-4fd6-983e-b5b6fd8ab5b7.png)
なので下記コマンドを実行して秘密鍵ファイルの読み取り権限を修正します
```
    # hogehoge.pemの権限をリセット
    icacls.exe <hogehoge.pemのフルパス> /reset
    # 操作しているユーザーに読み取り権限を付与
    icacls.exe <hogehoge.pemのフルパス> /GRANT:R "$($env:USERNAME):(R)"
    # 親フォルダーから継承されたアクセス権限の削除
    icacls.exe <hogehoge.pemのフルパス> /inheritance:r
```
コマンド入力後、hogehoge.pemが存在するディレクトリに移動してWindowsTerminalを開き、上記画像最下部にあるsshコマンドを叩く。EC2インスタンスに登録できることを確認する。
![ex23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529999/b29507bd-c25a-4cf4-81d8-0383bc081d05.png)

## WindowsTerminalからsshするｍ
WindowsTerminalを開いて、タブエリアのプルダウンから設定を開く。
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529999/31f0fcc2-1c2c-4237-8633-fb4ece906e2a.png)
設定からJsonファイルを開き、"profiles"の"list"に下記を追加する。commandline項目の内容は適宜エスケープして下さい。
```
    "list": 
        [
        ~~~~~~~~~略~~~~~~~~~
            {
                "commandline": "<ec2インスタンスへのsshコマンド(hogehoge.pemはフルパスで記述)>",
                "hidden": false,
                "name": "sample-aws"
            }
        ~~~~~~~~~略~~~~~~~~~
```
WindowsTerminalのタブエリアのプルダウンから選べるようになっていることと、実際にEC2インスタンスにsshできることを確認する。
![ec2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529999/93e3c9a1-866c-4034-a0a4-2d8fc1a7243e.png)
便利だ！
TypeScriptの型ガイド

TypeScriptはJavaScriptに型の概念を導入したスーパーセットの言語です。型を活用することで、バグの予防やコード補完の強化ができ、より安全で保守しやすいコードが書けるようになります。ここでは、TypeScriptでよく使う型や便利な型について簡潔にまとめます。

---

## ✨ 基本の型（プリミティブ型）

| 型名       | 説明                 | 例               |
|------------|----------------------|------------------|
| `string`   | 文字列               | `"hello"`       |
| `number`   | 数値（整数・小数）   | `42`, `3.14`     |
| `boolean`  | 真偽値               | `true`, `false`  |
| `null`     | null値               | `null`           |
| `undefined`| 未定義値             | `undefined`      |
| `bigint`   | 大きな整数           | `1234567890n`    |
| `symbol`   | 一意の識別子         | `Symbol("id")`  |

---

## ▶️ 配列とオブジェクトの型

```ts
let names: string[] = ["Alice", "Bob"];

interface User {
  name: string;
  age: number;
}

const user: User = { name: "Taro", age: 25 };
```

---

## 🎉 ユニオン型

複数の型のうちのどれかを許容する型。

```ts
let value: string | number;
value = "hello"; // OK
value = 42;       // OK
```

```ts
type OperationType = "CREATE" | "UPDATE" | "DELETE";
```

---

## 🌓 リテラル型

特定の値のみを許容する型。

```ts
let status: "success" | "error";
```

---

## 📄 型エイリアス（type）とインターフェース（interface）

```ts
type ID = string | number;
interface Product {
  id: ID;
  name: string;
}
```

---

## 🧱 Enum（列挙型）

あらかじめ決められた定数のセットを表現する型。

```ts
enum Status {
  SUCCESS = "SUCCESS",
  ERROR = "ERROR",
  PENDING = "PENDING"
}

const current: Status = Status.SUCCESS;
```

- JavaやC言語にもある「列挙型」と似た構文。
- 実行時にもオブジェクトとして保持される（逆引きも可能）。
- ただし、バンドルサイズや柔軟性の面では `as const` + union 型が使われることも多い。

---

## 💡 Record<K, V>

オブジェクトのキーと値の型を指定するユーティリティ型。

```ts
type QueueType = "EMAIL" | "SMS" | "PUSH";
const queueUrls: Record<QueueType, string> = {
  EMAIL: "https://...",
  SMS: "https://...",
  PUSH: "https://...",
};
```

---

## 💡 よく使うユーティリティ型

| 型名         | 説明                               |
|--------------|------------------------------------|
| `Partial<T>` | 全てのプロパティを任意にする       |
| `Required<T>`| 全てのプロパティを必須にする       |
| `Readonly<T>`| 全てのプロパティを読み取り専用にする |
| `Pick<T, K>` | 特定のプロパティだけを取り出す     |
| `Omit<T, K>` | 特定のプロパティを除外する         |

---

## 🤓 keyof typeof と as const

```ts
const Operation = {
  PARSE: "PARSE",
  EDIT: "EDIT",
  EMBED_PDF: "EMBED_PDF",
} as const;

// "PARSE" | "EDIT" | "EMBED_PDF"
type OperationType = keyof typeof Operation;
```

- `as const` を使うことで、オブジェクトの値がリテラル型（固定された文字列）になる
- `keyof typeof` は、そのオブジェクトのキー名を文字列リテラルのUnion型として抽出

---

## 🔍 まとめ

TypeScriptの型を使いこなすことで、より安全で自動補完の効いた開発ができるようになります。
特に、ユニオン型・リテラル型・`Record`・`keyof typeof`・`enum` などは実践で頻出なので、積極的に使っていきましょう！
JavaScriptで「数値を指数形式で文字列に変換する(toExponential)」の動作を確認してみた。

# 概要

JavaScriptで「数値を指数形式で文字列に変換する(toExponential)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/javascript/number/index3.html

# 実装

以下の通り実行できました。

![Screenshot from 2025-03-25 18-22-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/fe91df59-c7e9-431a-a449-7eb0aebf9d8a.png)

# まとめ

何かの役に立てばと。
ER図（実体関連図）について

## はじめに
　ER図（実体関連図）についてまとめてみました。

## ER図（実体関連図）
　リレーショナルデータベースを表す図として最も一般的なのは、**ER図**（**実体関連図**）である。テーブルは四角形、関連（リレーションシップ）は四角形を結びつける線で表される。線の端にある記号は、関連の多重度を表す。

### ER図の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/543028e6-cafc-47f3-9882-6647331ede65.png)


## おわりに
ここまで読んでいただきありがとうございます！

## 参考文献
・SQLアンチパターン 大型本 – 2013/1/26
Bill Karwin (著), 和田 卓人 (監修), 和田 省二 (監修),
p.xx-xxi
EC2でフロント構築　500番エラー　

# 環境
- **Java**: 21.0.6 (2025-01-21 LTS)  
  - Java(TM) SE Runtime Environment (build 21.0.6+8-LTS-188)  
  - Java HotSpot(TM) 64-Bit Server VM (build 21.0.6+8-LTS-188, mixed mode, sharing)
- **Node.js**: v22.13.1
- **MySQL**: 8.x 系

# 1. エラー内容　
![500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014626/e7e252b7-688b-4ab8-8056-3080a60c2b79.png)

* ブラウザでアクセスをしたらこんなエラーが
* Jarファイルが起動されていなかったので実行する。

# 2. DBの作成（初歩的すぎた。。。）

```2025-03-25T07:19:48.731Z ERROR 4996 --- [todo-backend] [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : Access denied for user 'root'@'localhost
```

* 認証がうまくできていなかったのでrootユーザにapplication.propertiesで設定したユーザ情報を与える

``` 2025-03-25T07:35:13.595Z ERROR 5326 --- [todo-backend] [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : Unknown database 'todo'
```

* DBがないだと...?
* GPTに聞いたらDBを自分で作れと言われたので自分で作成し、実行

``` 
~/todo/backend/target$ ps aux | grep java
ubuntu      5418  5.1 20.7 2368084 203712 pts/0  Sl   16:54   0:11 java -jar todo-backend-0.0.1-SNAPSHOT.jar
```

* プロセスが存在することを確認
* しかし、Curlを叩いても５００番エラーであるのでNginxの再設定を行う

# 3. Nginxの設定変更

```
:/etc/nginx/sites-available$ ls -l /etc/nginx/sites-enabled/
total 0
lrwxrwxrwx 1 root root 34 Mar 24 17:46 default -> /etc/nginx/sites-available/default
lrwxrwxrwx 1 root root 35 Mar 25 10:14 todo-app -> /etc/nginx/sites-available/todo-app
```
* 設定ファイルが競合している？とりあえずdefaultを削除
* しかし、治らず。。。
```
ubuntu@ip-:/etc/nginx/sites-available$ sudo tail -n 50 /var/log/nginx/error.log
```
* ログを吐き出すと、Permission　denied と権限不足

```
sudo chmod -R o+rX /home/ubuntu/todo/frontend/dist
sudo chmod o+x /home/ubuntu
sudo chmod o+x /home/ubuntu/todo
sudo chmod o+x /home/ubuntu/todo/frontend
```
* -R: 再帰的に
* o+rX: 「他人（others）」にも読み取り(r)・実行権（X＝ディレクトリ＆実行可能なファイルのみ）を付ける

# エラー解消
![スクリーンショット 2025-03-25 180611.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014626/15bf5c76-face-43de-baa6-4ba841909f46.png)

* 無事表示される。
* 権限エラーとDB作成という初歩的なエラーでしたね。
    * ログを出力して原因特定することが重要でした。
九九表をJavaScriptで出力せよ！

JavaScript で九九表を出力する問題に挑戦！シンプルな問題かと思いきや、出力のズレで撃沈…。でも `process.stdout.write() `を使えばスッキリ解決！

## <br>問題概要

自然数 `N` を入力し、N × N の九九表を出力する。

✅ 条件:

各行の `i` 行 `j`列目 は`i * j` の計算結果

数値の間は半角スペース区切り

各行の末尾は改行（最後の数値の後にはスペースを入れない）


<br>📌 入力例:
```
3
```
📌 出力例:
```
1 2 3
2 4 6
3 6 9
```

## <br>OKコード

`console.log()` では改行を制御しにくいので、
`process.stdout.write()` を使って行の最後の処理を分ける。

📌 コード:
```js
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });

rl.on('line', (input) => {
    const N = Number(input);
    for(let i = 1; i <= N; i++){
        for(let j = 1; j <= N; j++){
            if(j === N){
                process.stdout.write(i * j + "\n");
            } else {
                process.stdout.write(i * j + " ");
            }
        }
    }
    rl.close();
});
```
<br>✅ ここがポイント

`process.stdout.write()` を使う → 改行を自由に制御！

`if (j === N)`で分岐 → 最後の数値の後ろにスペースを入れない！

<br>[🔗 僕の失敗談と解決話！](https://paizabeginner.wordpress.com/2025/03/25/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a%e4%b9%9d%e4%b9%9d%e8%a1%a8%e3%82%92javascript%e3%81%a7%e5%87%ba%e5%8a%9b%e3%81%9b%e3%82%88%ef%bc%81/)



### <br>おまけ：基本の九九表（9×9バージョン）

九九表の基本形（`N=9`）なら、以下のコードでもOK。
```js
for(let i = 1; i <= 9; i++){
    for(let k = 1; k <= 9; k++){
        if(k === 9){
            process.stdout.write(i * k + "\n");
        } else {
            process.stdout.write(i * k + " ");
        }
    }
}
```
📌 出力:
```
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
```
【初心者向け】Gemini Roboticsとは？5分でわかるロボット開発の最前線

今、世界中のテクノロジー業界が注目している企業があります。

その名は Gemini Robotics（ジェミニ・ロボティクス）。

彼らが開発しているのは、単なる機械ではありません。人間のように考え、動き、そして学ぶ“次世代型ロボット”です。

たとえば、ロボットが人と会話をしながら荷物を運んだり、家庭内で家事をサポートしたりする。
そんな、かつてはSF映画の中だけの存在だった未来が、現実のものになろうとしています。

本記事では、Gemini Roboticsとはどのような企業なのか、彼らが開発するロボットの特徴や技術、そして私たちの暮らしにどのような変化をもたらすのかを、わかりやすく解説していきます。

技術の進化によって、私たちは“ロボットと共に暮らす社会”を、夢ではなく現実として迎えようとしています。

無料版のAIを使用したい方は、下記のサイトを参考にしてください。


https://ai.tencho-ex.com/



# 1. Gemini Roboticsとは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4028918/582e7e2d-52b4-4d94-beb2-c8f8037a21b6.png)

Gemini Roboticsは、人間のように動き、感じ、そして学ぶことができる「汎用型ロボット（General-Purpose Robot）」の開発を目指す次世代テック企業です。創業当初から、「人とロボットの共生」をビジョンに掲げ、家庭、医療、工場などあらゆる場面で役立つロボットを開発しています。

この企業の最大の特徴は、「人間の身体と知能を持つロボット」を本気で実現しようとしている点です。単なる作業ロボットではなく、感情理解・対話・複雑な作業対応といった、これまで機械には難しかった領域に挑んでいます。

現在、Gemini 1およびGemini 1.5という2つの人型ロボットプロトタイプを開発中です。

# 2. 何をつくっているの？
Gemini Roboticsが開発しているのは、AIによって動作・判断する**人型ロボット（Humanoid Robot）**です。以下に、その特徴を詳しく紹介します。

## ▶ Gemini 1：基礎動作を重視したモデル
二足歩行が可能で、人と同じ空間を自然に移動
音声で指示を受け、簡単なタスクを遂行
内蔵のカメラとセンサーで、周囲の状況を把握可能
## ▶ Gemini 1.5：進化版
手先の器用さが大きく向上（ボールをつかむ、ペンで文字を書くなど）
マルチモーダルAIを搭載（視覚＋音声＋触覚など複数の感覚を組み合わせて判断）

複雑な作業に対しても、逐次的にステップを考えて対応可能

さらに今後、感情表現機能やジェスチャーによる自然なインタラクションも追加される予定です。

# 3. どんな技術が使われているの？
Gemini Roboticsでは、複数の最先端技術が統合的に使われています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4028918/7373e784-7f98-41e4-8ff7-4e2b6a4d7d60.png)
とくに注目されているのが、**大規模言語モデル（LLM）**を搭載している点です。これはChatGPTのようなAIで、文脈を理解して会話できるため、人との自然なやりとりが可能です。

# 4. 他の企業とのちがいは？
ロボット開発といえば、Boston DynamicsやTesla Optimusなどが有名ですが、Gemini Roboticsは明確に「人とのインタラクション重視」という点で差別化しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4028918/d9c23eac-df26-41e9-8251-eda29208221e.png)
# 5. 私たちの生活にどう関わるの？
Gemini Roboticsのロボットは、日常生活のあらゆる場面で活躍する可能性を秘めています。

## ✅ 家庭向けサービス
高齢者や子どもの見守り
荷物運びや掃除の手伝い
AIコンシェルジュとしての役割
## ✅ 医療・介護の現場
認知症ケアのサポート
軽度の移動補助・声かけ
リハビリの相手としての利用
## ✅ 災害や危険作業の現場
火災現場・被災地での捜索活動
有害ガスや放射線のある環境での作業代行
# 6. 話題になったポイントは？
2025年初頭、Gemini Roboticsが公開したデモ動画がSNSで100万回以上再生され、大きな注目を集めました。
動画では、Gemini 1.5が以下のような高度な動作を行っていました：

人の声を理解して返事をする
小さな部品を手で正確に扱う
相手の表情を見て、言葉を選ぶ
また、Google DeepMindやOpenAIなどと技術連携があることが報じられ、「AIとロボティクスの融合」に期待が高まっています。

# 7. 今後の展望と課題
Gemini Roboticsが描く未来は、「ロボットが当たり前に隣にいる社会」です。今後、以下のような方向に展開が期待されます。

## ▶ 展望
商業化・量産化による価格の低下
各家庭に1台のロボットがある社会
多言語・多文化対応のロボット進化
## ▶ 課題
プライバシーの保護（家庭内カメラの扱いなど）
AIの暴走リスク（意図しない行動を防ぐ仕組み）
法整備の遅れ（ロボットが人を傷つけた場合の責任など）
# ✅ まとめ
Gemini Roboticsは、単なる「便利な機械」ではなく、「人に寄り添うパートナー」を目指しています。
これからの社会では、ロボットが私たちの生活の一部として溶け込んでいく未来が待っているのかもしれません。

# 「今無料」おすすめの生成AIツール

https://ai.tencho-ex.com/
Googleドライブ接続確認

Googleドライブが導入されて
自分のパソコンが壊れても
他のパソコンでアクセス出来ると
喜んでいたのですが

今の環境だと
デスクトップ画面が出てから
３分程、経過しないと
Googleドライブが使えません

そこで
Gemini 先生や Copilot 先生に
教えを請いながら
Googleドライブの
接続が確立された事を確認する
バッチを作成しました
ANSI【Sjis】で保存して下さい

PowerShell の Get-WmiObject で
未接続 ⇒ Null が 返ってくる
接続済 ⇒ D: 等 の ドライブレター が 返ってくる
で判断しています

スタートアップに入れて
接続確認をするとか
タスクバーにGoogleドライブの
アイコンを出したくない場合に
単品で使用して確認するなどが
主な使用目的です

接続が確立された事を利用して
そのままGoogleドライブにある
アプリ等の立ち上げも可能になります

```bat:Googleドライブ接続確認.cmd
@echo off
Title %~n0 %time:~0,-3%  開始

rem /;
rem /; ★ Googleドライブ接続確認
rem /;
rem /;    explorer shell:Startup を ファイル名を指定して実行に貼り付けて [ Enter ] 後
rem /;    開かれた スタートアップ フォルダ に Googleドライブ接続確認.cmd を コピー する
rem /;
rem /;    バッチの最終行にある rem を 消すと
rem /;    rem /; explorer      "%Google_Drive_Letter%"
rem /;    ↓
rem /;    explorer      "%Google_Drive_Letter%"
rem /;
rem /;    接続が完了してから エクスプローラー で Googleドライブ を 開きます
rem /;

echo;
echo; Googleドライブ接続を待機中..
echo;

set            "Google_Drive_Letter="

  :Wait_Connect_Google_Drive

for /f "delims=" %%0 in ('PowerShell -command "(Get-WmiObject -Class Win32_LogicalDisk | Where-Object { $_.VolumeName -eq """Google Drive""" }).DeviceID"') do set "Google_Drive_Letter=%%0"

if  not DEFINED Google_Drive_Letter ping -n 30 localhost >NUL & for /f "tokens=1-6 delims=/:-" %%1 in ('Powershell -command Get-Date -Format "yyyy/MM/dd-HH:mm:ss"') do @echo; %%1/%%2/%%3 %%4:%%5:%%6 現在、接続待機中 & goto :Wait_Connect_Google_Drive

echo;
echo; Googleドライブ接続されました
echo;
echo; このウインドウは 60 秒後 に 閉じられます
ping -n                60 localhost >NUL

rem /; explorer      "%Google_Drive_Letter%"
```
EventBridgeのcron式で曜日を指定する

土日休みなので、休日や夜間は検証EC2や検証RDSは停止してランニングコストを抑えよう！
EventBridgeでのcron式での曜日指定ってあんまりやったことなかったので、備忘として記載しておきます。

例）月曜日から金曜日までの6:55を指定する例

```
55 6 ? * MON-FRI *
```
ポイントは「日」項目が「？」であることと、「曜日」項目が「数字ではなく英語短縮３文字」が使えるということ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021557/282081c6-8d8b-4bde-87cb-c35c553d845a.png)

曜日は「数字」での指定もできるが、わかりにくいのでこっちの方がいいかも？

参考URL
https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-scheduled-rule-pattern.html
查看物料在哪个保管场所_MM03 or MARDテーブル

查看物料在哪个保管场所
方法1.在MARD表（品目保管场所数据）里输入品目，然后查找
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/fefe9fe0-b4d4-453e-8a8a-ad580b160a1a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/ca5ba345-ce8b-49ae-8fe7-39a5bc4405e4.png)


方法2.MM03进入后查找
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/9583addf-b5f5-4c68-9f07-42050f25894e.png)
输入所在工厂代码，点击保管场所就会自动显示出来。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/8ef46b91-ce09-46a3-a4b2-8fc6e6e4cb1e.png)
🧠 Chiral: AIは人間の思考に基づいた新時代へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/a2952697-78b9-4806-9539-861b1d4d8d81.png)
2025年、AI開発は新たな潜圧を迎えました。NVIDIA GTC 2025で発表された「**Chiral**」は、人間の思考、そのものをデータとして訓練された世界初のAIモデルです。通俗的な文字や画像に基づくものではなく、**脳波、自分の思考の雰囲気**を直接学習し、人間の意図を読み取ることが可能な、新型AIです。

---

## ☕ 科学技術的能力とChiralの構造

Chiralは、科学技術的に見て、常識はずれの仕組みを持っています。通常のLLMは「言葉」や「テキスト」を計算データとして利用しますが、Chiralは「**脳波のパターン**」をもとに、人間の意思、行動意図を、データストリームとして入力にしています。

### 使用されるデバイス

- **Stentrode** ：脳内に持続的に埋め込むことで、効率的に脳波データを通信。
- フィールドは主に「モーターコーテックス」を記録し、ゆく用されるインターフェースや操作の記録を訓練データに使用します

### モデル構造

GPTやBERTと同じTransformerに基づく構造を持っていると思われ、自分の思考の流れを「次の脳波を予測」するような、実行性の高いAIとして評価されています。

---

## ⚖️ Chiralの訓練手段

### 脳波データの収集

Synchron社は、人間の脳波を素のまま通信で読み取り、それに対応するアクションをデータにしていました。

- 現実の試行では、Apple Vision Proの系で眺めることで、ユーザーが操作を意図するだけで家電を操作できました

### シミュレーションの活用

- 実際のシノビオームを用いて人間が操作する形をシミュレート。
- ブラインシミュレータで視覚を削減させないまま脳波を発火させる技術

---

## ⛔️ 主要な他機能と合わせる利点

- 音声認識モジュールとの合製
- VR/実体インタラクティブシステムとの統合
- 情報感覚付きデバイスとの連携

---

## ❓ 値値される道徳的問題

### 脳内情報のプライバシー

- 思考の継続的な読み取りは、当事者の同意の充切な験明が必要
- 脳内の個人情報を商用に活用する場合、保護法的技術が要求

### 高度な情報解析による中毒性

- 脳波を通じて、感情や意思を命令として読み取ることの危険
- 通信のハッキングや情報の改ざんに対する抽象的リスク

---

## ユーケース & 実践

### 使用例

- 幸福支援デバイス
- 工場内ロボットの操作
- 効率の高いオフィス操作
- 認知疾患の補俑支援
- 高齢者アシスティブシステム

---

## これからの視野

Chiralは、AIが「言葉」ではなく、「思考」そのものを計算する新時代の開開を告げています。

人間の内面を知るAIは、利用法によっては削るような利点と問題を両立させます。

今後、Chiralが「人間の思考を手にするAI」として継続的に発展するためには、利用者の議論と社会的同意が必須です。

---

今回は「Chiral」に関する技術的な解析から道徳的論点まで、詳細にみてきました。
もっと知りたい主題があれば、次回以降でもご紹介します🚀
rbenvをインストールしてRubyを管理する

## homebrewでrbenvをインストール
```
$ brew install rbenv
```
brewが入っていること前提で上記を実行する。

```
$ rbenv --version
rbenv 1.3.2
```
rbenvのバージョンが表示されればインストール完了

## インストール可能なRubyバージョンを確認する
```
$ rbenv install --list
3.1.6
3.2.7
3.3.7
3.4.2
jruby-9.4.12.0
mruby-3.3.0
picoruby-3.0.0
truffleruby-24.2.0
truffleruby+graalvm-24.2.0

Only latest stable releases for each Ruby implementation are shown.
Use `rbenv install --list-all' to show all local versions.
```
インストール可能なRubyのバージョンが表示される。ここから使用したいRubyのバージョンを選択してインストールをする。

## Rubyをインストールする
Rubyの安定版を確認する。
https://www.ruby-lang.org/ja/downloads/
また、フレームワークを使用している場合のRubyバージョンとの互換性も確認しておく。

```
$ rbenv install 3.4.2
ruby-build: using openssl@3 from homebrew
==> Downloading ruby-3.4.2.tar.gz...
-> curl -q -fL -o ruby-3.4.2.tar.gz https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.2.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 22.1M  100 22.1M    0     0  10.8M      0  0:00:02  0:00:02 --:--:-- 10.8M
==> Installing ruby-3.4.2...
ruby-build: using libyaml from homebrew
ruby-build: using gmp from homebrew
-> ./configure "--prefix=$HOME/.rbenv/versions/3.4.2" --with-openssl-dir=/opt/homebrew/opt/openssl@3 --enable-shared --with-libyaml-dir=/opt/homebrew/opt/libyaml --with-gmp-dir=/opt/homebrew/opt/gmp --with-ext=openssl,psych,+
-> make -j 10
-> make install
==> Installed ruby-3.4.2 to /Users/********/.rbenv/versions/3.4.2
```
最新の安定版をインストールしておく。これでRubyのインストールが完了しているはず。

### rbenvでインストールしたRubyバージョンの一覧を確認
```
$ rbenv versions
  system
  2.3.1
  2.5.0
  2.5.1
  2.5.7
  2.5.8
  2.6.3
  2.6.5
  2.6.6
  2.7.0
  2.7.1
* 2.7.2 (set by /Users/******/Study/app/.ruby-version)
  3.0.0
  3.0.2
  3.0.7
  3.2.5
  3.4.2
  ```
こんな感じでいっぱい出てくる。*がついているところが今使用されているRubyのバージョン。

   ```
   $ ruby -v
   ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [arm64-darwin22]
   ```
ruby -vとすると、ruby2.7.2が使用されていることが確認できる。使用したいバージョンは3.4.2なので、Rubyのバージョンを切り替えよう。

   
## 使用したいRubyのバージョンに切り替える
```
$ rbenv local 3.4.2
```
これでRubyのバージョンが切り替わったはず。確認してみよう。
```
$ rbenv versions
  system
  2.3.1
  2.5.0
  2.5.1
  2.5.7
  2.5.8
  2.6.3
  2.6.5
  2.6.6
  2.7.0
  2.7.1
  2.7.2
  3.0.0
  3.0.2
  3.0.7
  3.2.5
* 3.4.2 (set by /Users/******/Study/app/.ruby-version)
```
3.4.2に切り替わったことが確認できた。

## まとめ
がんばろうぜ。

## 参考記事
https://formulae.brew.sh/formula/rbenv

https://github.com/rbenv/rbenv
AIのコンテキストウィンドウについて調べてみた

# はじめに
AIの記事を読んでいた際にコンテキストウィンドウというワードを見つけた。
ザックリとは概要が理解できたが深い理解に落とし込めていないのでいくつかの情報をまとめて理解を深める。

# 概要
コンテキストウィンドウとは
以下それぞれのサイトより説明文を記載します。

AWSにおいては
> LLM の使用可能な短期メモリまたは一時的なストレージと考えてください。これは、モデルが返答を生成する際に一度に考慮できるテキストの最大量 (トークンで測定される) です。

IBMにおいては
> The context window (or “context length”) of a large language model (LLM) is the amount of text, in tokens, that the model can consider or “remember” at any one time. 
訳:大規模言語モデル (LLM) のコンテキスト ウィンドウ (または「コンテキストの長さ」) は、モデルが一度に考慮または「記憶」できるトークン単位のテキストの量です。

Googleにおいては
> Context windows are the amount of information a gen AI model can recall during a session, measured in tokens — the smallest building blocks a model can process, such as a part of word, image, or video. 
訳:コンテキスト ウィンドウとは、セッション中に gen AI モデルが呼び出すことができる情報の量であり、トークン (単語、画像、ビデオの一部など、モデルが処理できる最小の構成要素) で測定されます。

TechTargetにおいては
> A context window is a textual range around a target token that a large language model (LLM) can process at the time the information is generated. Typically, the LLM manages the context window of a textual sequence, analyzing the passage and interdependence of its words, as well as encoding text as relevant responses. This process of cataloging pieces of a textual sequence is called tokenization.

訳:コンテキスト ウィンドウとは、大規模言語モデル (LLM) が情報の生成時に処理できる、ターゲット トークンの周囲のテキスト範囲です。通常、LLM はテキスト シーケンスのコンテキスト ウィンドウを管理し、単語の通過と相互依存性を分析し、テキストを関連する応答としてエンコードします。テキスト シーケンスの一部をカタログ化するこのプロセスは、トークン化と呼ばれます。

引用URL

https://aws.amazon.com/jp/blogs/news/context-window-overflow-breaking-the-barrier/

https://www.ibm.com/think/topics/context-window

https://cloud.google.com/transform/the-prompt-what-are-long-context-windows-and-why-do-they-matter?hl=en

https://www.techtarget.com/whatis/definition/context-window

# 要点
コンテキストウィンドウとはAIが生成時に記憶し処理できる容量のことを指す。
この容量以内の指示を出すことでAIは適切に生成を行える。
トークンをどれだけ詰め込めるのかを示す指標としての意味も持つ。

# 今後は？
@zacky1972 さんと議論をした際にしばらくはこの容量にキチンと収まる指示の出し方ができる能力が重要なのでは？という見解を頂いた。
普段ChatGPTやGeminiだけを使っているとピンと来づらいがAIはテキストベースだけでなく画像データや音声データも処理できるようになっている。
それらの組み合わせを最適に行うことで想定した生成物を出力させることができる。
そういった最適な出力結果を得られるための聞き方やデータの決定を適切に行える能力が重宝するのではないかという見解だった。

# 私見
上記の見解は的を射ていると感じました。
何もかもを情報として入力するのは手間ですし、限られたトークン処理能力を超えてしまっては最適な生成物を出力できません。
そのためこういった何を質問として詰め込むのかという観点はこれから重要になってくると感じました。
また議論には出ませんでしたが過学習のように情報が多すぎた結果、生成物がズレるというパターンもでるのではないかと筆者は考えています。
つまり人間でも情報が必要以上に多いと却って判断を誤るように不適切な情報を入れないという観点も出てくるのではないか？という観点です。
これがどこまで的を得ているのかが不明ですが、AI=完全無欠ではないのではないかと感じます。
結局はAIもツールであり万能の魔法でなく常に使い手に委ねられているということなのかもしれません。
どのツールにおいてもlinuxのsudoコマンドの以下が成り立つのかもしれません。

> あなたはシステム管理者から通常の講習を受けたはずです。
これは通常、以下の3点に要約されます:
    #1) 他人のプライバシーを尊重すること。
    #2) タイプする前に考えること。
    #3) 大いなる力には大いなる責任が伴うこと。
salesforce側から操作して、MC経由でお客さまへ送信します

salesforce側から操作して、MC経由でお客さまへ送信します

0.送信対象を事前にMCに登録する

1.DE準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491095/bc04cdda-61f8-43de-849f-87ad2553fd27.png)

２．journeyの内容
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491095/4bdd0ce6-f32e-4c7f-b170-6a9217c95c76.png)

３．salesforce側のAPI request code		
		
		String clientId = 'xxx';
		        String clientSecret = 'xxx';
		        String tokenUrl = 'https://xxxx.auth.marketingcloudapis.com/v2/token';
		        
		        HttpRequest req = new HttpRequest();
		        req.setEndpoint(tokenUrl);
		        req.setMethod('POST');
		        req.setHeader('Content-Type', 'application/json');
		        
		        String body = '{"grant_type":"client_credentials","client_id":"' + clientId + '","client_secret":"' + clientSecret + '"}';
		        req.setBody(body);
		        
		        Http http = new Http();
		        HttpResponse res = http.send(req);
		        
		
		            Map<String, Object> responseMap = (Map<String, Object>) JSON.deserializeUntyped(res.getBody());
		
		
		
		Object accessToken =responseMap.get('access_token');
		system.debug(accessToken);
		// リクエストJSON
		        String smsReqJson = '{"ContactKey": "xxxx",'
		                          + '"EventDefinitionKey":"xxxx",'
		                          + '"Data": {'
		                          + '         "contactkey":"xxxx",'
		                          + '         "sentdate":"' + String.ValueofGmt(Datetime.now()) + '",'
		                          + '         "country":"JP",'
		                          + '         "phone":"xxxx",'
		                          + '         "name":"xxxx"'
		                          + '}}';  
		 
		        // エンドポイント
		        String endpoint2 = 'https://xxxx.rest.marketingcloudapis.com/interaction/v1/events';
		        // HTTPリクエスト
		        HttpRequest req2 = new HttpRequest();
		        req2.setEndpoint(endpoint2);
		        req2.setMethod('POST');
		        req2.setHeader('Content-Type', 'application/json');
		        req2.setHeader('Authorization', 'Bearer ' + String.valueof(accessToken));
		        req2.setBody(smsReqJson);
		
		
		Http http2 = new Http();
		        HttpResponse res2 = http2.send(req2);
		        
		        System.debug(res.getBody());
【C++】GoogleTestのアサーション備忘録

## 1. GoogleTestとは
GoogleTestとはGoogleが提供しているC++用の単体試験フレームワークです。
アサーションセットが豊富で、簡単に導入できます。

## 2. 使い方

### 2.1 導入
Visual Studio Installerを起動します。
「C++によるデスクトップ開発」を選択し、インストールします。
![スクリーンショット 2025-03-19 160841.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809388/1d8b9078-c3f4-4cce-8403-e338e24f2e66.png)

上記ツールセットの中にGoogleTestも入っているので、これで準備完了です。
![スクリーンショット 2025-03-19 161016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809388/a156866d-65ca-42b2-a9fd-57b9a3c8c684.png)

### 2.2 GoogleTestの追加
Visual Studioでテストしたいソリューションを起動します。
ソリューション上を右クリック、追加、新しいプロジェクトを選択。
![スクリーンショット 2025-03-19 163155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809388/839459f0-95e4-4d0b-9b8c-7b91845bcfb4.png)
GoogleTestを選択し、適当な名前を付けて作成します。
この時、テストしたいプロジェクトを選択しておきましょう。
![スクリーンショット 2025-03-19 163433.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809388/8263d2be-a9c8-4e46-be32-f5b83ef71b6e.png)


## 3. アサーション一覧
ASSERT_*から始まる場合、失敗したら中断し、EXPECT_*から始まる場合は、失敗しても続行します。


### 4.1 True or False
|Assert|Expect|説明|
|:---:|:---:|:---:|
|ASSERT_TRUE(data)|EXPECT_TRUE(data)|dataがTrueであるか|
|ASSERT_FALSE(data)|EXPECT_FALSE(data)|dataがFalseであるか|

### 4.2 2値の比較
|Assert|Expect|説明|
|:---:|:---:|:---:|
|ASSERT_EQ(val1, val2)|EXPECT_EQ(val1, val2)|val1 == val2|
|ASSERT_NE(val1, val2)|EXPECT_NE(val1, val2)|val1 != val2|
|ASSERT_LT(val1, val2)|EXPECT_LT(val1, val2)|val1 < val2|
|ASSERT_LE(val1, val2)|EXPECT_LE(val1, val2)|val1 <= val2|
|ASSERT_GT(val1, val2)|EXPECT_GT(val1, val2)|val1 > val2|
|ASSERT_GE(val1, val2)|EXPECT_GE(val1, val2)|val1 >= val2|

EQとかNEとかの正式名称を載せておきます。

EQ: Equal
NE: Not Equal
LT: Less than
LE: Less than or Equal to
GT: Greater than
GE: Greater than or Equal to

### 4.3 文字列の比較
|Assert|Expect|説明|
|:---:|:---:|:---:|
|ASSERT_STREQ(str1, str2)|EXPECT_STREQ(str1, str2)|str1 = str2|
|ASSERT_STRNE(str1, str2)|EXPECT_STRNE(val1, val2)|str1 != str2|
|ASSERT_STRCASEEQ(str1, str2);|EXPECT_STRCASEEQ(val1, val2)|str1 == str2<br>(大文字小文字を無視)|
|ASSERT_STRCASENE(str1, str2);|EXPECT_STRCASENE(val1, val2)|str1 "= str2<br>(大文字小文字を無視)|

これらのアサーションはwchar_t*型の文字列比較に使います。
C++でよく使うstring型はEXPECT_EQで比較します。

## 5. 使用例

今回は以下のような、入力値を2倍するだけの関数をテストしてみます。

```c++
int Twice(int val) {
	return val * 2;
}
```

テストコードを記述します。
TEST()マクロ内にテストコードを記述し、テストを実行します。
TEST(hoge, failed)は値が一致してないので失敗します。
```c++
TEST(hoge, success) {
	EXPECT_EQ(Twice(2), 4);
	EXPECT_EQ(Twice(INT_MAX), 4294967294);
}
TEST(hoge, failed) {
    EXPECT_EQ(Twice(2), 2);
}
```

テストエクスプローラーを表示し、実行します。
![スクリーンショット 2025-03-25 170009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809388/f54a1058-aaf6-4447-b84b-abe9d0bbff6e.png)


1つでもアサーションが失敗した場合、全体のテスト結果が失敗となるので、留意しておきましょう。