OmniAICreator/Qiita-1.07M huggingface dataset:
中心極限定理とは何か

## 1. 中心極限定理の基本概念

### 中心極限定理とは？

**中心極限定理**（Central Limit Theorem, CLT）は、確率論と統計学における重要な定理で、ランダムな現象を理解する上で不可欠な概念です。中心極限定理は、**どのような分布を持つデータであっても、その和や平均がサンプルサイズが十分に大きいときに正規分布に近づく**というものです。

簡単に言えば、多くの独立したランダムな要因が合わさると、その結果として生じる分布が正規分布（ガウス分布）に近づく、ということです。

### 定理の形式的な説明

中心極限定理をもう少し数学的に表現すると、次のようになります：

- ある母集団から得られた独立で同一の確率分布に従うランダム変数 \( X_1, X_2, \dots, X_n \) があるとします。
- 各変数の期待値（平均値）を μ、分散を σの2乗 とします。
- これらの変数の標本平均を 
$$
\( \overline{X}_n \)
$$としたとき、標本平均
$$
\( \overline{X}_n \)
$$
は n が大きくなるにつれて、平均 μ、分散
$$
\( \frac{\sigma^2}{n} \)
$$
の正規分布に近づきます。

つまり、どのような母集団からサンプルを取っても、標本平均の分布はサンプルサイズが大きくなると正規分布に近似されるということです。

$$
\
\frac{\overline{X}_n - \mu}{\sigma / \sqrt{n}} \xrightarrow{n \to \infty} N(0, 1)
\
$$

ここで
$$
\ N(0, 1) \
$$
は平均0、分散1の標準正規分布を意味します。

## 2. 中心極限定理の直感的理解

中心極限定理を直感的に理解するためには、次のような例を考えると分かりやすいです。

### サイコロの例

サイコロを1回振ると、出る目は1から6のいずれかで、これは一様分布に従います。このとき、サイコロを1回だけ振った結果が正規分布に従うわけではありません。

しかし、サイコロを何回も振って、その結果の平均を取るとどうなるでしょうか？サイコロを何度も振ってその結果の平均を求めたものをサンプルとして集めていくと、その平均値の分布は、サイコロを振る回数が多くなるにつれて正規分布に近づいていきます。

これが中心極限定理の基本的な考え方です。多くの独立したランダムな出来事が集まると、その平均は正規分布に従うようになるのです。

### 実生活での例

例えば、ある街での1日の平均気温や、工場で製造される製品の重さのばらつきなど、様々な要因が組み合わさって決まる現象においても、中心極限定理が適用されます。これにより、複雑な要因が絡み合う結果として、観測されたデータの平均が正規分布に従うことが多くなります。

## 3. 中心極限定理の重要性

### 統計学での応用

中心極限定理は、統計学において非常に重要な役割を果たします。例えば、標本平均が正規分布に従うという性質は、統計的推測の基礎となります。具体的には、**信頼区間**や**仮説検定**など、多くの統計手法がこの定理に依存しています。

- **信頼区間**：サンプル平均が正規分布に従うため、母集団の平均値の推定に対して信頼区間を設定することが可能です。
- **仮説検定**：観測データがある仮説にどれだけ一致しているかを検定する際、標本平均の分布が正規分布に近いことを前提にして計算が行われます。

### 他の分布への適用

中心極限定理は、正規分布に限らず、多くの統計的分布にも応用されます。例えば、二項分布やポアソン分布のような離散的な分布でも、サンプルサイズが十分に大きければその平均が正規分布に近づきます。これにより、複雑な分布を正規分布という単純な形で近似することができるのです。

## 4. 中心極限定理の条件と限界

### 条件

中心極限定理が成立するためには、いくつかの条件があります。

- **独立性**：データは互いに独立である必要があります。つまり、あるデータが他のデータに影響を与えないことが重要です。
- **同一分布**：各データが同じ確率分布に従っていることが前提です。
- **サンプルサイズ**：サンプルサイズが十分に大きいことが必要です。一般に、サンプルサイズが大きいほど、正規分布への近似が良くなります。

### 限界

- **小サンプルサイズ**：サンプルサイズが小さい場合、中心極限定理が適用できないことがあります。この場合、標本平均の分布が正規分布に従わない可能性があります。
- **強い依存関係**：データ間に強い依存関係がある場合、中心極限定理が成り立たないことがあります。例えば、時系列データや空間的に依存するデータなどがその例です。

## 5. まとめ

中心極限定理は、統計学や確率論において非常に強力で重要な定理です。どのような分布から得られたデータであっても、その平均がサンプルサイズの増加に伴い正規分布に近づくという性質は、実世界の多くの現象を理解する上で役立ちます。この定理は、統計的推測の基礎となり、多くの応用が可能です。ただし、適用には条件があり、サンプルサイズやデータの独立性などの要因に注意する必要があります。
最大エントロピー原理とは何か：基本概念と応用

## 1. 最大エントロピー原理の基本概念

### エントロピーとは？

エントロピーは、元々は熱力学や情報理論で用いられる概念で、システムの無秩序さや不確実性の度合いを測る指標です。情報理論におけるエントロピーは、情報の不確実性を表します。具体的には、ある確率分布がどれだけ無作為で予測不可能であるかを示す尺度です。

例えば、完全にランダムなコイントスの結果は高いエントロピーを持ちますが、全ての結果が同じであるような場合（例えば、全てが表の場合）はエントロピーがゼロになります。

### 最大エントロピー原理とは？

**最大エントロピー原理**（Maximum Entropy Principle）は、**利用可能な情報に基づいて最も無作為な（不確実性の高い）分布を選ぶ**という原則です。この原理は、制約条件を満たす中で、エントロピーが最大となる確率分布を選ぶことで、最もバイアスのない予測や推定を行うために用いられます。

- **制約条件**：特定の期待値や平均値、分散などの制約を課した上で、その制約を満たす中でエントロピーを最大化する確率分布を求めます。

- **最もバイアスのない分布**：最大エントロピー原理によって得られる分布は、与えられた情報だけを反映し、その他の無関係な仮定やバイアスを排除したものです。

## 2. 最大エントロピー原理の数学的表現

### エントロピーの定義

確率分布 p(x) のエントロピー H は、次のように定義されます：

$$
\
H(p) = -\sum_x p(x) \log p(x)
\
$$

ここで、p(x) は x という結果が起こる確率です。この式は、分布がどれだけ分散しているか（つまり、無作為であるか）を測る尺度となります。

### 最大エントロピー分布の導出

最大エントロピー原理を使って確率分布を導く際には、次のような手順を取ります：

1. **制約条件の設定**：期待値や分散といった制約条件を設定します。例えば、確率分布の期待値
$$
\ E[X] = \mu \
$$
が既知である場合、この情報を制約として使用します。

2. **エントロピーの最大化**：エントロピーを最大化するような分布 p(x) を見つけます。これにはラグランジュの未定乗数法がよく用いられます。

3. **最適な分布の決定**：得られた分布は、制約条件の下で最も無作為な（バイアスのない）分布であるとされます。

#### 例：正規分布の導出

例えば、平均 μ と分散 σの2乗 が与えられた場合、最大エントロピー原理を適用すると、正規分布が導かれます。これは、正規分布が指定された平均と分散を持つ中で、最も無作為な分布であることを意味します。

## 3. 最大エントロピー原理の応用

### 統計学と機械学習

最大エントロピー原理は、統計学や機械学習のさまざまな分野で応用されています。特に、事前情報が限られている状況で最も合理的な推定を行うために利用されます。

- **ロジスティック回帰**：最大エントロピー原理に基づく手法であり、2クラスの分類問題において、与えられたデータから最も無作為な（バイアスの少ない）分類モデルを構築します。
  
- **自然言語処理**：単語や文の出現確率を推定する際に、最大エントロピー原理を用いて、与えられた条件に最も適合するモデルを構築します。

### 情報理論

情報理論では、最大エントロピー原理が通信や暗号、データ圧縮などの分野で応用されます。情報源のモデル化において、既知の情報を反映しつつ、余分な仮定を排除した効率的な符号化が可能になります。

### ベイズ推定との関係

最大エントロピー原理は、ベイズ推定の枠組みの中でも重要な役割を果たします。ベイズ推定では、事前分布を設定する際に、最大エントロピー原理を使って最も無作為な事前分布を選択することがよくあります。

## 4. 最大エントロピー原理の限界と注意点

### 制約の選定

最大エントロピー原理の結果は、設定する制約条件に強く依存します。適切な制約を選ばないと、得られる分布が現実の状況を正しく反映しない可能性があります。そのため、制約条件を慎重に設定する必要があります。

### 適用範囲

最大エントロピー原理は、あくまで情報が不確実である状況で最も合理的な推定を行うための手法です。しかし、すべての問題に適用できるわけではなく、特定の状況や仮定が適用される場合に有効です。

## 5. まとめ

最大エントロピー原理は、限られた情報をもとに最も無作為な確率分布を選ぶ強力な手法です。この原理は、統計学、機械学習、情報理論など幅広い分野で応用され、合理的でバイアスの少ないモデル構築を可能にします。ただし、制約条件の設定には注意が必要であり、適用範囲も慎重に考える必要があります。最大エントロピー原理を理解し、適切に利用することで、データ解析や推定の精度を高めることができます。
3D スキャナーを操作するにはどのくらいの経験が必要ですか?

3D スキャナーの操作に必要な経験は、特定の使用シナリオ、機器の種類、および個々の専門的背景によって異なります。 3D スキャナーを効果的に操作するにはどのくらいの経験が必要かを理解するのに役立つ重要な要素と提案をいくつか紹介します。

基礎知識
1. 設備の種類
さまざまなタイプの 3D スキャナ (レーザー スキャナ、構造化光スキャナ、写真測量など) には、操作スキルに対する要件も異なります。エントリーレベルのスキャナには簡単なトレーニングのみが必要ですが、プロレベルの機器にはより深い技術知識が必要です。
![433bf0b03707a145ddd3c508f7d04aa3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/d4bf208e-3964-b97e-7144-1a5609979131.png)
https://www.revopoint3d.jp/products/standalone-3d-scanner-miraco

2. パソコンスキル
コンピュータのスキルは基本的な要件です。 3D スキャン ソフトウェアの操作、スキャン データの処理、ポスト編集にはすべて、特定のコンピューター スキルが必要です。

3. 業界の背景
一部の業界では、関連する背景知識 (エンジニアリング、設計、考古学など) を持っていると、スキャンのニーズとデータ アプリケーションをより深く理解するのに役立ちます。

学習曲線
1. トレーニングと学習
初心者向けトレーニング: メーカーまたはサードパーティが提供するトレーニング コースに参加すると、すぐに使い始めることができます。
オンライン リソース: チュートリアルとビデオを使用して独習し、実践を通じて徐々にスキルを向上させます。
2. 実務経験
3Dスキャンをマスターするには、繰り返し練習して経験を積むことが鍵となります。スキャン プロジェクトが異なれば、さまざまな課題が生じるため、運用エクスペリエンスが充実します。

アプリケーションシナリオ
1. 簡単なアプリケーション
小さなオブジェクトのスキャンなどの単純なアプリケーション シナリオの場合は、基本操作とスキャン ソフトウェアをマスターするだけで済みます。

2. 複雑なプロジェクト
複雑な形状や大きなオブジェクトをスキャンする場合、データを処理するにはより多くの経験とスキルが必要です。より高い精度と技術が要求される建築測量や地図作成、産業用リバースエンジニアリングなど。

継続的な学習
3D スキャン技術は常に発展しており、新しい機器や新しい技術が次々と登場しています。新しいスキルとテクノロジーを継続的に学習することが、競争力を維持する鍵となります。
正規分布と標準偏差に関する考察

## 1. 正規分布のもとになる微分方程式について
### 微分方程式の幾何学的意味
$$
\ f'(x) = -\frac{x - \mu}{\sigma^2} f(x) \
$$

この微分方程式は、正規分布の確率密度関数 f(x) がどのように変化するかを記述しています。具体的には、データ点 x が平均 μ からどれだけ離れているかに応じて、確率密度 f(x) の変化率が決定されます。この方程式が示しているのは、正規分布の曲線が平均値に向かって左右対称に変化する様子です。

- **左右対称性**: 方程式の構造により、曲線は平均 μ を中心に左右対称な「ベル型」の形状を持ちます。
- **変化の割合**: 曲線の傾き（勾配）は、データ点が平均からどれだけ離れているかに比例し、平均値から遠ざかるほど急激に変化します。

## 2. なぜ標準偏差が選ばれるのか

### 絶対偏差との比較

絶対偏差は偏差の絶対値の平均であり、外れ値の影響を抑えた評価を行うことができますが、解析的に扱いにくい点があります。絶対値を使った関数では、偏差が正か負かによって勾配が異なり、特定の点（例：平均値）では微分が不連続になるため、数学的解析が難しくなります。

#### 絶対値関数の微分

絶対値関数 |x - μ| を微分すると、次のようになります：

$$
\
\frac{d}{dx}|x - \mu| = \begin{cases} 
1 & \text{if } x > \mu \\
-1 & \text{if } x < \mu \\
\text{undefined} & \text{if } x = \mu 
\end{cases}
\
$$

このように、勾配が正負で不連続に変化し、ある点で微分が定義されない問題が生じます。

### 標準偏差の利点

標準偏差は、偏差の二乗の平均の平方根として定義されます。この計算方法により、全域で連続的で滑らかな関数が得られます。具体的には、次のように微分可能です：

$$
\
f(x) = (x - \mu)^2
\
$$

この関数を微分すると：
$$
\
f'(x) = 2(x - \mu)
\
$$

この場合、勾配は全域で連続的に変化し、微分可能です。標準偏差に基づく関数は、数学的に扱いやすく、特に統計解析や確率密度関数の解析において便利です。

### 標準偏差が選ばれる理由

標準偏差が選ばれる理由は、以下の点に集約されます：

- **微分可能性**: 標準偏差に基づく関数は、全域で滑らかであり、微分可能です。これにより、数学的解析が容易になります。
- **対称性の維持**: 標準偏差は正負の偏差を等しく扱い、正規分布の左右対称性を正確に反映します。
- **解析的便利さ**: 標準偏差は、分布のばらつきを測定する際に最適な指標であり、統計学的に多くの利点を提供します。

## 3. まとめ

標準偏差は、正規分布をはじめとする多くの確率分布の数学的特性を正確に反映するために選ばれています。絶対偏差も有用な指標ではありますが、数学的な解析においては標準偏差の方が便利であり、解析がしやすいため広く用いられています。特に、正規分布の解析では、標準偏差がデータのばらつきを最適に表現する指標であるため、この微分方程式にも採用されています。
正規分布と標準偏差：その関係と理由

## 1. 正規分布と標準偏差の関係

### 正規分布とは

正規分布（ガウス分布）は、確率論や統計学で非常に重要な分布で、次のような確率密度関数で表されます。

$$
f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x - \mu)^2}{2\sigma^2}\right)
\
$$

ここで、μ は平均値、σ は標準偏差です。標準偏差 σ は、データが平均値 の周りにどれだけ集中しているか、つまり分布の広がりを示します。

### 標準偏差が正規分布に適している理由

#### 1. 正規分布の対称性

正規分布は左右対称な形をしており、平均値を中心に分布が広がっています。標準偏差はこの広がりを測る指標であり、対称な分布においては偏差（データ点が平均からどれだけ離れているか）を正確に測定することができます。

#### 2. 偏差の二乗

標準偏差は、偏差の二乗の平均（分散）の平方根として定義されます。偏差を二乗することで、正負の偏差が打ち消し合わず、ばらつきの大きさを適切に反映できます。正規分布では、正負の偏差が等しく扱われるため、標準偏差がその特性を正確に表現します。

#### 3. 最尤推定

正規分布に従うデータセットに対して、最尤推定を行うと、標準偏差 σ が最も尤もらしいばらつきの尺度として選ばれます。これは、データの分布全体の形状を最もよく表していることを意味し、統計解析において標準偏差が非常に重要である理由です。

## 2. 正規分布の式の導出

正規分布の式は、以下のようにして導出されます。

### 1. 背景：中心極限定理

中心極限定理によれば、どのような分布であっても、独立した同一分布のデータの和や平均が集まると、全体として正規分布に近づきます。これが正規分布の普遍性を支える理論的背景です。

### 2. 微分方程式からの導出

正規分布の確率密度関数 f(x) は、次の微分方程式を満たします：

$$
\
f'(x) = -\frac{x - \mu}{\sigma^2} f(x)
\
$$


この微分方程式を解くことで、正規分布の確率密度関数が得られます。この式が示すのは、正規分布の曲線が平均値 μ の周りでどのように傾き、広がるかということです。

### 3. 確率密度関数の決定

正規分布の確率密度関数を次のように仮定します：

$$
\
f(x) = A e^{B(x - \mu)^2}
\
$$

この形状から、適切な A と B の値を決定することで、最終的な確率密度関数が得られます。

### 4. 完成した確率密度関数

導出の結果、正規分布の確率密度関数は次のようになります：

$$
\
f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x - \mu)^2}{2\sigma^2}\right)
\
$$

## 3. 微分方程式の幾何学的意味

微分方程式 
$$
\ f'(x) = -\frac{x - \mu}{\sigma^2} f(x) \ 
$$
は、正規分布の曲線がどのように傾き、広がるかを表しています。この式は、正規分布の特性を数学的に表現し、曲線の形状がどのように決定されるかを示しています。

- **傾きの符号:** この式によれば、x が平均 μ より小さいとき、傾きは正の値を取り、平均値に向かって上昇します。逆に、x が平均より大きいとき、傾きは負になり、平均値に向かって下降します。
- **対称性:** この微分方程式の構造により、正規分布の対称性が保たれます。左右対称な曲線は、平均値 μ を境に同じ形を持ちます。

## 4. なぜ物事は正規分布するのか

多くの自然現象や社会現象が正規分布に従う理由には、以下のような統計的・数学的な背景があります。

### 1. 中心極限定理

中心極限定理により、多くの独立した要因が足し合わされると、その結果が正規分布に従うことが示されます。これが、自然界で正規分布が頻繁に現れる理由の一つです。

https://qiita.com/KM9973/items/cec85dfa4ed4b4ceaf49

### 2. 最大エントロピー原理

最大エントロピー原理によれば、特定の制約（平均と分散など）を満たす中で最も「無作為な」分布が正規分布です。これにより、正規分布は自然界における「最も自然な分布」として現れやすくなります。

https://qiita.com/KM9973/items/d793ebed37adf1879a0c


## 5. なぜ正規分布には標準偏差が用いられるのか

https://qiita.com/KM9973/items/82d8f5b1224744e62b6d
## まとめ

正規分布は、多くの自然現象や社会現象において非常に重要な分布です。その理由は、中心極限定理や最大エントロピー原理といった統計学の基本原理に基づいています。また、標準偏差は正規分布の特性を正確に反映するため、ばらつきを測るための最適な指標となります。

## その他参考
https://qiita.com/KM9973/items/ce260baff7f98e33ef43

https://qiita.com/KM9973/items/6ec904bfae038bbac45c
[AWS]EC2ステータスチェックに新しい項目が追加されました



以下の記事、気になったので少し調べてみます。


「Amazon EC2 ステータスチェックが、接続された EBS ボリュームの到達可能性の健全性をサポートするようになりました（直訳）」

https://aws.amazon.com/about-aws/whats-new/2024/08/amazon-ec2-status-checks-reachability-health-ebs-volume/

情報公開日:2024年8月27日


# ■要約


インスタンスからEBSボリュームに対して、到達できているかどうかを確認できるようになったとの事ですね。
EC2コンソールやAPIから確認、取得できるみたいです。

> 要約：
> 本日より、Amazon EC2 ステータスチェックで、インスタンスにアタッチされた EBS ボリュームが正> 常にアクセス可能かどうかを直接監視できるようになりました。
> これにより、アプリケーションのパフォーマンスに影響を与える問題を素早く検出でき、Auto Scaling グループと統合することで、高可用性と信頼性を確保できます。
> 従来はCloudWatchメトリクスの設定が必要でしたが、今後は追加設定なしでEC2コンソールやAPIから直接状態を確認できます。
> この機能は、すべてのEC2 Nitroインスタンスで利用可能です。

# ■ステータスチェック項目が「3/3 のチェックに合格しました」

:::note info
EC2のコンソール画面をよく見る方にはお馴染みのステータスチェック
「2/2 のチェックに合格しました」ですが、ステータスチェックが増えた事で
「3/3 のチェックに合格しました」になっていました。
:::

（補足：インスタンスを選択し、`ステータスチェック` タブを選択すると確認できます。）

![ステータスチェック1_20240830103634.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/b53801d6-4d98-6e6f-461f-b7bda220fc7c.png)


チェックの詳細を見てみると以下のような項目が追加されています

「アタッチ済み EBS のステータスチェックの失敗」

![ステータスチェック2_20240830104034.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/c8af2e4a-856d-046a-4dfe-0aca35d011d8.png)


# ■どんなメトリクスが増えたのか

「StatusCheckFailed_AttachedEBS」のメトリクスが追加設定なしで確認できるようになったようです。

詳しい事は以下のリンクから確認できました。

Amazon EC2 インスタンスのステータスチェック
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html

# ■監視について

インスタンスステータスチェックをCloudWatchを利用して現在監視していれば、そのまま恩恵を受ける事ができそうですね。

ステータスチェックのメトリクスは通常0で推移しています。
異常があれば、1か2の値になるわけですが、これで3という値を示す可能性が出てくるという事です。

# ■「2/2 のチェックに合格しました」と「3/3 のチェックに合格しました」が混在している

一つ注意点です。
どうやらこの項目追加は「すべての EC2 Nitro インスタンスでサポートされている」との事なので、旧インスタンス？は2/2のままとなっているようです。

![ステータスチェック3_20240830111850.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/52fdf0f0-cf4d-f061-1807-3b70a0540fc4.png)

# ■AWS CLIの利用

また、AWS CLI を使用する場合は、以下のコマンドを実行することで EBS ボリュームのステータスを確認できます。

```sh
aws ec2 describe-instance-status --instance-ids <インスタンスID>
```

# ■終わりに

何にせよトラブルシューティング時の切り分けを助けてくれそうな項目追加で嬉しいですね。

以上です！
postMessageを使ってクロスオリジンなiframeからデータを受け取る


## はじめに

こんにちは。HRBrainでオウンドメディアやランディングページの開発を担当している渡邉です。

SalesforceなどのMAツール製のiframeフォームをウェブサイトに埋め込むことがあります。

この記事では、ウェブサイトとiframeが異なるドメインの場合に、iframeからウェブサイトにデータを受け渡す方法について解説しています。

▼ [HRBrainサービスサイト](https://www.hrbrain.jp/)におけるiframeフォームの事例

![iframe_form.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681000/acd843cf-63ce-53b2-d9f2-daddb30efa19.png)

## クロスオリジンでのiframe操作の制限

iframeとウェブサイトが異なるドメインに存在している場合、ウェブサイトからiframe内の要素に直接アクセスすることができません。

- ウェブサイトのURL： `example.com` 
- iframeのURL： `example.net`

これは、「同一オリジンポリシー」により、セキュリティの観点から、オリジンが異なるページへのアクセスは制限を受けるためです。（クロスオリジン）

https://developer.mozilla.org/ja/docs/Web/Security/Same-origin_policy

たとえば、iframe内のボタンをウェブサイトから操作しようとすると、以下のようなエラーが発生します。

```javascript:ウェブサイト側：example.com
const iframe = document.getElementById('myIframe');

// iframe内のbutton要素にはウェブサイトからアクセスが許可されない
iframe.contentWindow.document.getElementById('myButton'); // error

// Error: 
// Failed to read a named property 'document' from 'Window': 
// Blocked a frame with origin "http://example.com" from accessing a cross-origin frame.
```

このエラーは、iframeがクロスオリジンのため、ウェブサイトからiframe内のDOMにアクセスできないことを示しています。

## postMessageメソッドについて

クロスオリジンでデータを送信するには、postMessageメソッドを使用します。

このメソッドは、異なるドメイン間で安全にデータをやり取りするための手段です。

https://developer.mozilla.org/ja/docs/Web/API/Window/postMessage

### postMessageメソッドの使い方

postMessageメソッドの第1引数にはウェブサイト側に渡すデータを、第2引数にはターゲットオリジン（メッセージを受け取るドメイン）を渡します。

```javascript:iframe側：example.net
window.parent.postMessage('Hello from iframe!', 'example.com');
```
```javascript:ウェブサイト側：example.com
window.addEventListener('message', (event) => {
  console.log(event.data); // 'Hello from iframe!' が出力される
});
```

### ターゲットオリジンの指定
postMessageメソッドでは、メッセージを送信するターゲットオリジンを第2引数に指定できます。

- `*`：すべてのドメインを許可しますが、セキュリティリスクがあるため、特定のオリジンを指定することを推奨します。

- `https://example.com`：特定のドメインを指定することで、信頼できるドメインだけがメッセージを受信できようになります。

### iframeから受け取ったデータをGTMに渡す事例

ウェブサイトでは、`message` イベントリスナーを使用して、iframeから送信されたデータを受け取ります。

さらに、iframeから受け取ったデータをdataLayerを使ってGTMに渡すことで、マーケティング施策の幅が広がります。

```javascript:iframe側：example.net
const form = document.getElementById('myForm');

form.addEventListener('submit', (event) => {
  // フォームから入力された値を取得してオブジェクトにまとめる
  const formData = {
    name: document.getElementById('name').value, // ユーザー名
    email: document.getElementById('email').value, // メールアドレス
  };

  // ウェブサイトにデータを送信
  window.parent.postMessage({ formData }, 'https://example.com');
});
```
```javascript:ウェブサイト側：example.com
window.addEventListener('message', (event) => {
  // 送信元のオリジンを確認
  if (event.origin !== 'https://example.net') return; // 信頼できるオリジンのみ処理する

  const formData = event.data.formData;

  // 必要に応じて、GTMにデータを送信
  dataLayer.push({
    event: 'formSubmit',
    formData: formData,
  });
});
```

## まとめ

この記事では、postMessageメソッドを使って、クロスオリジンのiframeからウェブサイトにデータを送信する方法を解説しました。

postMessageメソッドを活用すれば、異なるドメイン間でも安全にデータをやり取りすることが可能です。

## PR

HRBrainではフロントエンドエンジニア（コミュニケーションデザイン）の採用も行なっているので、ぜひ！

https://hrmos.co/pages/hrbrain/jobs/2110310

https://www.hrbrain.co.jp/recruit
【LT大会】はじめて司会進行を務めて感じたこと

# はじめに
先日、パブリックに開かれるエンジニア系オンライン LT 大会の司会進行を務めました。

司会進行はもちろん外部での登壇自体も人生ではじめてのことだったので、しっかり準備して行こうと思いネットでいろいろ調べていました。
しかし発表者向けの情報ばかりで、司会進行向けの情報は意外と見つかりませんでした。

今回は、はじめてパブリックな場で司会進行を務めた経験を踏まえて、準備しておいたほうが良いことを自分なりにまとめてみました。
　

# 実施しておくべき事前準備
そんなの当たり前だろ！という基本的な部分から書いていきますのでご容赦ください！


### 登壇者の名前を再確認しておく
平気だと思っていてもいざ当日になると「山崎」さんが「やまさき」なのか「やまざき」なのか...うろたえてしまうなんてことが起こりえるかもしれません。
パブリックな会だとなおさら間違えることはできないため、忘れないように確認しておきます。
　

### タイムアップ時の対処
LT は時間が 1 人 5 分など決まっていることがほとんどです。
制限時間は事前にお伝えしているとは思いますが、いざ制限時間を超えた場合の対処を考えておきましょう。強制で終了させるのか、発表後の質疑応答で時間を調節するのか、強制終了するなら口頭で伝えるのか、タイマー音のようなものを鳴らすのか、選択肢が多く考えられるため整理しておきます。
　
 
### 利用ツールの操作方法確認
司会進行と発表者ともに、本番時に使うツールで正常に画面共有できるか、操作方法を含めて確認しておきます。配信系のツールだと利用したこともない人が多いためリハーサルを実施して実際に操作しておくことをおすすめします。また、これを LT イベント直前に実施することでネットワークの正常性確認もできます。
　

### 発表者のネットワークエラー時の対処
事前に発表者のネットワーク正常性確認を実施して、少しでも通信状況が怪しいと感じた発表者がいたら事前に資料を共有してもらうなどして備えましょう。音声さえ発してもらえれば、資料共有は別の人から LT を継続するなど緊急で対応が可能です。
　

### PC & モニターの画面レイアウト
司会進行は、LT イベント中さまざまな情報を見ておく必要があります。
登壇者の発表を聴きながら、当日のスケジュール表を確認しながらタイムマネジメントをして、コメント欄や X のハッシュタグ付き投稿をみてコメントを拾いながら...いくら画面が合っても足りなさそうな感じがします。
オープニングやクロージングでは司会進行がスライドを投影するケースもあるため、PC モニターにおける画面配置はあらかじめ考えておき、当日慌てずに対処できるようにしましょう。
　

### 司会進行 & 発表者の裏チャットグループ
緊急時に発表者に連絡をする手段がないと困るケースも考えられるため、事前にチャットグループ等は作成しておいてよいと思います。
　

### 発表後コメントや質問の準備
これは当日司会から何か質問しなければならない場合で、当日思いつくのであれば特に準備不要ですが、司会進行しつつ発表もしっかり聞いて質問することはなかなか難しいと思います。自分がまったく知らない技術に関する LT の可能性もありますし、事前に発表資料や発表テーマからある程度知識をインプットしておくことは悪くないことだと思います。


# おわりに
以上、はじめて司会進行を務めた所感をまとめました。
これからも外部でのアウトプット活動は積極的に実施していきたく、また感じたことがあれば備忘録として追記していこうと思います。
VertiTab - サイドパネルの縦型タブ v2.6.0


皆さんこんにちは、VertiTabがv2.6.0に更新されました
Chromeブラウザに最適なサイドバータブ管理拡張機能へようこそ
インストールアドレスはここにあります:
[https://chrome.google.com/webstore/detail/chejfhdknideagdnddjpgamkchefjhoi]()

### 追加
- **タブメニューズーム**: タブメニューにズーム機能を追加し、ズームレベルを1%から1000%まで自由に調整可能。
- **アップロード背景画像**: ローカルデバイスから画像をアップロードして背景として使用可能。
- **カスタム背景色**: カスタム背景色をサポートし、美しいグラデーションを生成する色を選択可能。
- **ページサイドバー**: ブラウザサイドバーを開かずに閲覧中のウェブページにサイドバーを挿入可能。
- **新しいタブメニュー「タブをアクティブに保つ」**: タブが自動的に破棄されないようにアクティブに保つ。

### 変更
- メニュー表示方法の最適化、エラープロンプトの改善。
- クイックアクセスを別のメニュー項目に移動。
- ドラッグアンドドロップの並べ替えの最適化。
- フォントカラーの変更後に一部のエリアが変更されない問題を修正。
- 背景や背景画像の支配的な色に基づいてフォントカラーが自動的に黒または白に変更されるように最適化。
- パフォーマンスの最適化とバンドルサイズの削減。
- クイックアクセスのデータストレージを最適化し、アクセス時間を短縮。

### 修正
- サイドバーを最初にクリックしたときに展開グループボタンが表示されない問題を修正。
- ブラウザを再起動して拡張機能アイコンをクリックすると、ポップアップまたはサイドバーの再選択が必要になる問題を修正。
- アプリケーションを再起動した後に保存された背景画像が失われる問題を修正。
- 同じサイトのすべてのタブをすべてのウィンドウで閉じることができない問題を修正。
- DnDを無効にするとクラッシュする問題を修正。
- 大きすぎる背景画像ファイルをアップロードするとQUOTA_BYTESクォータ超過エラーが発生する問題を修正。
- すべてのウィンドウタブを表示するとエラーが発生し、サイトごとにグループ化できない問題を修正。
- スナップショットのインポートが成功したメッセージ形式を修正。
- 重複インポートが繰り返しクイックアクセスエントリを引き起こす問題を修正。

### 非推奨
- **タブメニューのクイックアクセス**: クイックアクセスが別のメニュー項目に移動され、タブメニューのオプションは非推奨となる予定（機能は同じまま）。
- **リスト背景スタイル**: 各リストの背景スタイルを設定する機能は、カスタム背景色のリリースにより役割を終え、近日中に削除される予定。

### 削除
- サイト設定からズームオプションを削除。メニューでのズーム調整が直感的なプレビューを提供しなかったため、ズーム機能はタブメニューに移動され、リアルタイムプレビューが可能に。
- **フロートボール**を削除。
第七回: CSSの書き方

こんにちは、[株式会社カスタマトリックス](https://www.customatrix.co.jp/)の寺尾です。

こちらは **新卒社員と学ぶWEBプログラミング** 企画になります。
可能な限り毎日更新していくのでご期待ください。

本日は第七回、「**CSSの書き方**」を説明していきます。

前回はこちら
https://qiita.com/r-terao/items/5f63b84fbf4d007ab12f

第一回はこちら
https://qiita.com/r-terao/items/e6237c4dc59db9e96ec6

# CSSの書き方
CSSはスタイルのルールを記述する言語のため、記法にも明確な基準があります。
※サンプルコードは見た目のために`.scss`で記述してますが、最近は`.css`でも入れ子構造に対応しているので同じ書き方で問題ないです。

```構造.scss
body {
    margin: 0;
    padding: 0;
    font-size: 20px;
}

#test-id {
    color: red;
}

.test-class {
    background-color: rgba(100, 100, 100, 0.5);
    a {
        font-size: 16px;
    }
}
```

このように、スタイルを当てる対象に対して括弧で区切って内容を記述します。
括弧を入れ子にする事で「〇〇かつ××」という表現が可能です。

### CSSのセレクタ
CSSで「スタイルを当てる対象」を検索するために「**セレクタ**」というものが存在します。

セレクタは**シンプルセレクタ**と**結合子**、**グループ**、**疑似要素**に分かれています。

シンプルセレクタは6種類存在します。

1. ユニバーサルセレクタ
    全ての要素が対象
    ```universal.css
    * {
        
    }
    ```
1. タイプセレクタ
    指定した要素名の要素が対象
    ```type.css
    h1 {
        
    }
    ```
1. IDセレクタ
    指定したIDを持つ要素が対象
    ```id.css
    #test {
        
    }
    ```
1. 属性セレクタ
    特定の属性、或いは特定の属性の値を持つ要素が対象
    ```attr.css
    [href="https://test.com"] {
        
    }
    ```
1. クラスセレクタ
    指定したクラスを持つ要素が対象
    ```class.css
    .test {
        
    }
    ```
1. 疑似クラス
    特定の状態の要素、或いは特定の順序などにある要素が対象
    ```pseudo-c.css
    :first-of-type {
        
    }
    ```

CSSは「**必ずユニバーサルセレクタかタイプセレクタから書き始める（ただしシンプルセレクタが続く場合ユニバーサルセレクタを省略できる）**」というルールがあります。
そのため、ほぼ必ずシンプルセレクタから書き始めます。

その他のセレクタとして下記が存在します。

1. 結合子
    ある要素に対して親子（入れ子）や兄弟（隣接）にあたる要素が対象
    ```combine.css
    h1 + div {
        
    }
    ```
2. グループ
    別々のセレクタに同じスタイルを適用できる
    ```group.css
    .test, h1 {
        
    }
    ```
3. 疑似要素
    要素全体ではなく、要素の一部や前後を対象にできる
    ```pseudo-e.css
    :after {
        
    }
    ```

### CSSの優先順位
CSSなどのスタイルには優先順位があります。
下記の順で優先されていきます。（同列の場合下のランクのモノを比較する）

1. 設定元
    1. important付ユーザーエージェント（ブラウザごとに定義されているもの）
    1. important付ユーザー（ブラウザにユーザが設定できるもの）
    1. important付製作者（WEBサイトのCSS）
    1. 製作者
    1. ユーザー
    1. ユーザーエージェント
1. CSSの記述元
    1. インライン（HTML要素に直書き）
    1. CSSファイル
1. セレクタの優先順位
    1. IDセレクタ
    1. クラスセレクタ
    1. タイプセレクタ
    1. それ以外
1. セレクタの詳細度
    1桁目を「タイプセレクタの個数」
    2桁目を「クラスセレクタの個数、属性セレクタの個数、疑似クラスの個数」
    3桁目を「IDセレクタの個数」
    上記の3桁からなる数字を比較して数字の高い方が優先


Importantはスタイルの記述の末尾に`!important`と書くもので、優先度を飛躍的に高める事ができます。
```important.css
a {
    color: red !important;
}
```

# まとめ
- CSSはセレクタと括弧を合わせて特定の要素のみにスタイルを指定する事で、複数のデザイン定義を管理している
- セレクタは基本6種類があり、それらを組み合わせて要素を指定する
- 優先度が厳密に設定されている

CSSはややこしいルールが多いですが、基本的にはセレクタさえ覚えておけば問題ないです。
思ったスタイルが当たらない時に優先度を思い出せるようにしておくと良いですね。

次回は未定です。

# おまけ
株式会社カスタマトリックスはエンジニアを募集しています！
完全未経験でも可！

- 新卒の方
https://www.customatrix.co.jp/newgrads/index.html

- 中途の方
https://customatrix.co.jp/career/index.html

https://www.instagram.com/cmx_pr/
【ゼロトラスト大全】ゼロトラストはなぜ難しい？どこから勉強すれば良い？

# 本記事の対象
・ゼロトラストを意味はググったけど、結局なぜ難しいのかという疑問を持つ人

# 本記事の目的
筆者自身が、ゼロトラストについて自分の言葉で説明し、理解を深めることを目的としています。そのために、「ゼロトラスト大全」を読み、得た情報を整理しながら、自分の言葉で解説していきます。

[ランサムウエアに負けない、ゼロトラスト大全](https://amzn.asia/d/0FiEpCk)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768548/f24d83a7-52d0-2cd6-b56e-f0a35d6dd4cd.png" width=50%>

# ゼロトラストとは何か？ 何が難しいのか
ゼロトラストとは、すべてのアクセス元を信頼しないという考え方です。言葉自体は分かりやすいのに、なぜ実現が難しいのか？

その理由は、アプリケーションやデータへのアクセスを、すべてのトランザクション（処理）ごとに検証し、安全性が確認できた場合のみ許可を与える必要があるからです。この仕組みを導入するためには、単一の製品やサービスだけでは対応できず、複数のシステムや技術が必要になる点が、ゼロトラストを難しくしています。

# 業務システム全てをSaaSに移行すれば良いのでは？

確かに、オンプレミスを全廃止し、業務システム・業務アプリ・ファイルサーバーを全てSaaSに移行すれば容易にゼロトラストは実現出来る。実際にそのような事例はある。しかし、現実的には既存のシステムを全てSaaSに移行できない企業が多い。だからゼロトラストを実現するのが難しい。

# ゼロトラスト実装の成熟度が提示されている

ゼロトラストをいきなり完全に実現するのは難しいため、米国のセキュリティ庁は「ゼロトラスト成熟度モデル」を公開しています。このモデルは、ゼロトラストを実装する際に成熟度を判断するための参考になります。日本語に翻訳された無料記事も、以下のサイトで確認できます。
ただし、この成熟度モデルは抽象的で具体例が少ないため、自社がどの段階にいるのかを判断するのは簡単ではありません。ゼロトラストの実現には、ID、デバイス、ネットワーク、アプリケーション、データの５つ視点から取り組むことが求められます。

https://qualias.net/zero-trust-maturity-model/

# まとめ

企業の既存システムをすべてSaaSに移行することは難しいため、ゼロトラストの実現も簡単ではありません。また、ゼロトラスト成熟度モデルの5つの視点（ID、デバイス、ネットワーク、アプリケーション、データ）をすべて同時に取り組むことも困難です。そこで、まずはセキュリティの基本となる「ID」から始めるのが有効です。次回は、IDに関する技術についてまとめます。
[Power BI]別テーブルのカウントを列で表示させる方法

ホーム>データの変換
Power Query画面
ホーム>結合>クエリのマージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3861025/dd6fc07c-c738-8a10-1904-c02baac0bbe6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3861025/5fa2d386-20ae-1487-a955-2253f759f6d6.png)


左：カウントを表示させたいテーブル
右：カウントしたいテーブル
結合の種類：左外部
両テーブルで合致するキーワード列を選択して「OK」


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3861025/279802bb-bcad-e4f1-8057-de5b8a331dd7.png)

展開アイコンクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3861025/3f1e2c50-7dd9-d5bb-b24b-7eee6f0eca06.png)

集計を選択
集計したい列を選択（複数選択可）
「元の列名をプレフィックスとして使用します」のチェックを外す　※外さないと列名が「{元のテーブル名}_.{元の列名}のカウント」になってしまう
「OK」
最小努力と最短時間でAI-900合格記

昨日(DP-900)に引き続きAI-900も無事一回で合格しました。
勉強時間は3時間程度でした。
毎度の如くほぼ前日＆当日の詰め込みショートカット勉強法なので、きちんと正攻法で勉強することをお勧めします。


過去の体験記はこちら：

https://qiita.com/ponponmikankan/items/fd363bb0323569d3676f

https://qiita.com/ponponmikankan/items/77202be0de32cda5893d

https://qiita.com/ponponmikankan/items/4b64124be47a34467019

https://qiita.com/ponponmikankan/items/c27d6db74bac7cb44fef

https://qiita.com/ponponmikankan/items/f25fa53b13f10df574d6

https://qiita.com/ponponmikankan/items/95790b6892a3c6d3e285


## 前提

AI経験（？）としてはCopilot大好きなのとAzure OpenAI APIを業務でちょっと使ったかなくらい。データサイエンスについてはみんなが一度は通るタイタニック号を味見したくらいです。

## 参考にした勉強法

ひたすらLearnを3時間くらい眺めてました。やたらCopilot for Securityの内容だな…と思っていたら途中でコースを脱線していました（たぶん20分くらい脱線…）。AI-900にはCopilot for Securityは含まれません（笑）

## 実際の勉強でやったこと

### Learnを飛ばし読み（2時間半程度）

https://learn.microsoft.com/ja-jp/training/courses/ai-900t00/

10時間以上ありますがデータサイエンスの基礎知識があれば結構読み飛ばせると思います。

### プラクティス評価の実施（3周くらい）

https://learn.microsoft.com/ja-jp/credentials/certifications/azure-ai-fundamentals/practice/assessment?assessment-type=practice&assessmentId=26&practice-assessment-type=certification

直訳の選択肢がわかりづらく、とっつきにくい問題も出ていました。
とりあえず責任あるAIの6原則は絶対出るので覚えたほうがいいです（笑）
https://www.microsoft.com/ja-jp/ai/responsible-ai?msockid=0ba57a4462376e721e256853634d6f53

### 試験の感想

試験時間は1時間で、30分くらいかかりました。（見直し1周）。
ほかの900系同様、択一やドラッグドロップ系なので焦ることはないです。

プラクティス評価まんまの問題は２問くらい出たのと、データ分析の手法や、物体検出・OCRなどのVision系、さきほどの6原則についてはしつこめにでてきます。ちなみにCopilotの話は一切でてこなかった（笑）

…というわけで、今回も超最低限勉強法で無事合格！
次はいよいよ未知のDynamics系を目指そうと思います。Fundamentals制覇まであと２つ…！
"ブランチを切る"のお浚い

## アジェンダ
ブランチを作成する際に発生すること、ブランチを切った後の作成元ブランチとの関係性、そしてブランチを切った後に元のブランチが更新された場合の対処方法について改めてお浚いのため、簡単にまとめます。

## ブランチの作成: `git checkout -b <新しいブランチ名>`

まず、`git checkout -b <新しいブランチ名>` コマンドを実行することで起こることは以下の様になります。

- **新しいブランチが作成される**: 指定した `<新しいブランチ名>` という名前のブランチが、現在のコミットから作成されます。
> -b オプション: このオプションが新しいブランチを作成する部分です。-b は「branch」の略で、新しいブランチを現在のコミットから作成するという意味です。
- **新しいブランチに切り替えられる**: 作成された新しいブランチに自動的に切り替わり、そのブランチ上で作業が行えるようになります。
>git checkout <ブランチ名> コマンド: この部分は指定されたブランチに切り替えるためのコマンドです。git checkout <ブランチ名> は指定されたブランチに移動する機能を持ちます。

まとめると、このコマンドは、ブランチを作成してそのブランチに移動する作業を一度に行う便利な方法です。

## ブランチを切った後の元のブランチとの関係性

ブランチを切った後、新しいブランチと元のブランチとの関係性は以下の様になります。

- **共有の履歴**: 新しいブランチは元のブランチと同じコミット履歴を持っています。これは、ブランチを切った時点までの履歴が完全に一致していることを意味します。
- **独立した作業環境**: ブランチが切られた後、新しいブランチで行う変更は元のブランチには影響しません。逆に、元のブランチで行う変更も新しいブランチには影響を与えません。これにより、別々の機能開発や修正を並行して進めることができます。

まとめると、新しいブランチは元のブランチと同じ履歴を持ちながらも、独立した変更を行える作業環境となります。

## ブランチを切った後の元のブランチの変更を取り込む方法

ブランチを切った後に、元のブランチで新しい変更が行われた場合、その変更を新しいブランチに取り込む方法は以下の通りです。

### `git merge` を使う方法

新しいブランチで元のブランチの変更を取り込みたい場合、以下の手順で行います。

```sh
git checkout <新しいブランチ名>  # 新しいブランチに移動
git merge <元のブランチ名>        # 元のブランチの変更をマージ
```

**結果**: 元のブランチの変更が新しいブランチに取り込まれ、両ブランチの変更が統合されます。もし競合が発生した場合は、それを解決する必要があります。

### `git rebase` を使う方法

`git rebase` を使用すると、元のブランチの最新の変更を新しいブランチの先頭に取り込むことができます。手順は以下の通りです。

```sh
git checkout <新しいブランチ名>  # 新しいブランチに移動
git rebase <元のブランチ名>        # 元のブランチの変更をリベース
```

**結果**: 新しいブランチは元のブランチの最新の変更を基にして、あたかもその変更が最初から含まれていたかのように見えます。これにより、履歴が直線的になり、ブランチのクリーンな状態を保つことができます。ただし、競合が発生する場合は、それを解決する必要があります。

### `git cherry-pick` を使う方法

特定のコミットだけを新しいブランチに取り込みたい場合は、`git cherry-pick` を使用します。

```sh
git checkout <新しいブランチ名>  # 新しいブランチに移動
git cherry-pick <コミットID>    # 取り込みたいコミットを指定
```

**結果**: 指定したコミットの変更だけが新しいブランチに適用されます。
例え話で学ぶ rake dbの覚書 w/chatGPT

# rakeとは
rakeとはRubyにおいて色々やってくれるツールのことです。その中でもsinatraやRails上でデータベースに対して何か操作を行いたいときに行うコマンドが`rake db: hogehoge`です。

本記事ではわかるようでわからないrake dbコマンドをみんな大好きchatGPTくんが家の建築に例えてくれたのでわかりやすい(?)例え話を聞きながら理解していきます。

完全に蛇足ですが例え話をchatGPTにイラストまで生成させたので楽しんでいってください。

# rake db:create

プロジェクトフォルダ内のdatabase.ymlファイルに基づいてデータベースを作成します。

開発の途中で作っていくテーブルを保存する場所です。新しくプロジェクトを作成したらまずこのコマンドを実行してデータベースを作ります。

身近なものに例えると、、、

まず、家を建てるためには土地が必要です。rake db:create は、その「土地を購入する」ことに相当します。これは、データベースを作成して、家を建てるための場所（データベース）が準備されるプロセスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727850/d1198c75-cadf-e638-b49c-d9ed15995dce.png)


# rake db:create_migration NAME=hogehoge


db/migrateフォルダ内にマイグレーションファイルが作成されます。

マグレーションファイルとはテーブルの設計図のようなものでマイグレーションファイルに書かれた情報を元にテーブルを作成、修正します。マイグレーションファイルをどのように記述するかは後述します。（追記する）

身近なものに例えると、、、

次に、どんな家を建てるのか、設計図を描きます。rake db:create_migration NAME=hogehoge は、この「設計図を描く」ステップです。この設計図には、どのような部屋が必要で、どこに配置するのかが記載されています。マイグレーションファイルが設計図に相当し、家の構造（データベースの構造）がここで決まります。

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727850/ad98eafb-e864-ef74-614c-372a7ef73929.png)


# rake db:migrate


作成されたmigrationファイルを実行し、データベースを更新するコマンドです。

身近なものに例えると、、、

設計図ができたら、実際に工事を始めます。rake db:migrate は、この「家を建てる」プロセスです。設計図に基づいて、家の骨組みを立て、壁を作り、屋根を乗せるように、データベースの構造が現実のものになります。

![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727850/0f7db5a4-a036-35b3-07d5-d5c2633b04f3.png)


# その他


## rake db:migration:status

作成されたマイグレーションファイルのどれがデータベースに適用されていて、どれが適用されていないかを確認するためのコマンドです。

身近なものに例えると、、、

工事が進む中で、進捗を確認するのも大切です。rake db:migration:status は、この「工事進捗を確認する」作業です。どの部分が完成していて、どの部分がまだ未完成かをチェックリストで確認するように、どのマイグレーションが適用済みか、どれが未適用かを確認します。

![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727850/6e50fe73-2d54-1d97-d399-5c9ba5485125.png)



## rake db:seed

データベースに初期値をいれるためのコマンドです。

このコマンドを打つことでdb/seeds.rb内に書いてある情報がデータベースに適用されます。

身近なものに例えると、、、

家が完成したら、次は家具やインテリアを配置して住む準備をします。rake db:seed は、この「家具やインテリアを配置する」作業です。データベースに初期データを投入することで、アプリケーションがすぐに使用できる状態に整えます。

![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727850/be76ab20-4de8-d4cf-e0c6-f16ce33da27e.png)


## rake db:reset

データベースをリセットするためのコマンドです。

具体的には一度データベースを削除し、全てのマイグレーションファイルを作成します。

つまり、次のコマンドを順番に打っているのと同じです。

``rake db:drop``
``rake db:create ``
``rake db:migrate``

身近なものに例えると、、、

時には、家の状態をリセットして最初からやり直したいことがあります。rake db:reset は、この「家をリノベーションして最初からやり直す」プロセスです。一度家を壊して新たに建て直し、再び全ての部屋や家具を設置し直します。データベースをリセットして、再度マイグレーションを適用し、初期データを投入するのと同じです。

![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727850/d69b6cad-85c3-28a1-2d10-35ca865629ef.png)


## rake db:drop

現在使用しているデータベースを削除するためのコマンドです。このコマンドによってデータベースが完全に削除されます。

身近なものに例えると、、、

最後に、家や土地が不要になった場合は、完全に手放すこともあります。rake db:drop は、この「家と土地を完全に手放す」ことに相当します。これを実行すると、データベースが完全に削除され、すべてのデータが失われます。

![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727850/687aa733-2ec6-57d9-8a46-17d7cb8c0473.png)
DSからMCへのロボットアップロードが途中でタイムアウトしてしまう時の対処方法

# はじめに
<!-- 発端や概要を記載 -->
DSからMCへ大きなロボットを複数アップロード中、Read timed out（タイムアウトエラー）が発生してしまいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840837/368e566a-8f90-3f28-0821-add113fbd897.png)

このタイムアウトはどこのタイムアウトなのか。ボトルネックは何になるのかを探してみました。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [調査記録](#Chapter1)
1. [redo_log_capacityの拡張](#Chapter2)
1. [追加調査記録](#Chapter3)
1. [HTTP通信のタイムアウト値を延ばす方法](#Chapter4)
1. [おわりに](#Chapter5)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 調査記録

正常にアップロードできた時の各ログと比較してみたところ（※）、HTTP通信の時間が10秒以上かかった時にRead timed outのエラーが発生している・・・？

※Tomcatのアクセスログ（localhost_access_log）から確認しました。　
　例えば以下のログでは12.997秒かかっています。
```ruby:qiita.rb
127.0.0.1 - - [05/Aug/2024:10:18:17 +0900] POST /mc/secure/RepositoryAPI HTTP/1.1 200 264 (12.997)
```

通信に時間がかかる原因を探っていると、MySQLのerrログにinnodb_redo_log_capacityの拡張を促すログが残っていました。
これが原因で、TomcatとMySQLの通信が遅くなっているのかも。
```ruby:qiita.rb
Redo log writer is waiting for a new redo log file. Consider increasing innodb_redo_log_capacity.
```

↓

redo_log_capacityを拡張することで正常にアップロードすることができました。

<a id="#Chapter2"></a>
# redo_log_capacityの拡張方法
my.iniを開き、redo_log_capacityの値を変更後、MySQLを再起動すると反映されます。

※my.iniの場所：
C:\ProgramData\MySQL\MySQL Server ｛バージョン｝

※変更箇所：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840837/9961fe6e-b870-485a-83c5-c7b5a212cc1b.png)

<a id="#Chapter3"></a>
# 追加調査記録
redo_log_capacityのエラーさえなければ、Read timed outのエラーが起こらないのか気になったので追加で検証してみました。

結果としては、以下3パターンでRead timed outエラーが発生してしまいました。
・MySQLのBuffer_Pool_Sizeを小さくする
・MCの画面を開いてDBに負荷をかけながらアップロード作業を行う
・MySQLの端末そのものに高負荷をかけた状態でアップロード作業行う

単純にMySQLのパフォーマンスが落ちているだけでもRead timed outが発生するみたいです。
なので、Buffer_Pool_Sizeはできる限り大きくしておきたいところ。
<br>
・・・とはいっても、Buffer_Pool_Sizeを上げすぎると端末側が高負荷の状態になってしまいます。
<br>
そこで、タイムアウトの秒数の方を変更する方法を探ってみたところ、confファイルに追記するだけで秒数を延ばせるプロパティを発見しました。

これで、Buffer_Pool_Sizeを必要以上に拡張せずとも、正常にアップロードすることができました。

<a id="#Chapter4"></a>
# HTTP通信のタイムアウト値を延ばす方法
「Design Studio.conf」を開き、以下のプロパティを末尾に追記後、DSを再起動。


※「DesignStudio.conf」の場所：
C:\Program Files\BizRobo Basic ｛バージョン｝\bin

※追加するプロパティ（60秒の場合）：
wrapper.java.additional.＜N＞=-Drepository.timeout.millis=60000
↑
＜N＞はファイル内で重複しない数値を設定しました。

<a id="#Chapter5"></a>
# おわりに
これまで大きなロボットを複数台アップロードしたい時には、少しずつ時間をかけてアップロードしていました。
今回発見した方法によって、アップロード作業の時間を大幅に減らすことができました。
『メタプログラミングRuby』138ページのサンプルコードをIRBで実行するとエラーになる

## はじめに

『[メタプログラミングRuby 第2版](https://www.amazon.co.jp/dp/4873117437)』という書籍を読んでいて、混乱した箇所があったため、備忘録としてまとめます。

この記事におけるバージョンは **Ruby 3.3** です。

## 問題

p138では`Module#alias_method`の説明がされています。

`Module#alias_method`は既存のメソッドにエイリアス（別名）をつけるメソッドです。

次のサンプルコードで説明されています。

```ruby:class_definitions/wrapper_around_alias.rb
class String
  alias_method :real_length, :length

  def length
    real_length > 5 ? 'long' : 'short'
  end
end

"War and Peace".length       #=> "long"
"War and Peace".real_length  #=> 13
```

ところがこのサンプルコードをIRBで実行すると次のエラーが発生しました。

```ruby
irb(main):001* class String
irb(main):002*   alias_method :real_length, :length
irb(main):003* 
irb(main):004*   def length
irb(main):005*     real_length > 5 ? 'long' : 'short'
irb(main):006*   end
irb(main):007> end
irb(main):008> 
irb(main):009> "War and Peace".length
irb(main):010> "War and Peace".real_length
An error occurred when inspecting the object: #<TypeError: String can't be coerced into Integer>
Result of Kernel#inspect: #<Integer:0x000000000000001b>
=> 
irb(main):011> 
```

おかしいなと思い、今度はサンプルファイルを次のように修正して、ターミナルからファイルを実行してみます。

```ruby:class_definitions/wrapper_around_alias.rb
class String
  alias_method :real_length, :length

  def length
    real_length > 5 ? 'long' : 'short'
  end
end

# puts で出力する
puts "War and Peace".length
puts "War and Peace".real_length
```

するとこちらは狙い通りの挙動となりました。
```bash
$ ruby class_definitions/wrapper_around_alias.rb
long
13
$ 
```

つまり、IRBで実行するときだけエラーが発生してしまう状況です。

IRBでのみ呼び出されるメソッドに問題があるはずですが、特定に時間がかかりました。

## 理由

IRBでは、結果を表示する際に`Object#inspect`メソッドが自動的に呼び出されます。

このときに`prettyprint`が使用され、出力を整形します。

ですが、今回の例では`String#length`メソッドが上書きされているため、本来`Integer`型を返すべき部分で`String`型が返されている状況です。

その結果、以下の箇所でエラーが発生していました。

```ruby:ruby/lib/prettyprint.rb
  def text(obj, width=obj.length) #　lengthを上書きしているため、width は String　型の値
    if @buffer.empty?
      @output << obj
      @output_width += width  # width は Integer 型を想定しているためエラーが発生
    else
      text = @buffer.last
      unless Text === text
        text = Text.new
        @buffer << text
      end
      text.add(obj, width)
      @buffer_width += width
      break_outmost_groups
    end
  end
```

https://github.com/ruby/ruby/blob/master/lib/prettyprint.rb#L185

上記の`@output_width`はInteger型を想定していますが、`width`にはString型が格納されています。

これにより`TypeError: String can't be coerced into Integer`が発生しました。

なお、この挙動はバグではなく、`String#length`を上書きした結果生じる正常な動作です。

## おわりに

手を動かしながら書籍を読み進めていたため、このエラーに気づきました。

「組み込みクラスのメソッドは安易に上書きすべきではない」というのを身をもって体験できてよかったです。

この記事に誤りがありましたら、コメントにてご指摘いただけますと幸いです。

## 参考資料

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

https://github.com/ruby/ruby/blob/master/lib/prettyprint.rb#L185

https://docs.ruby-lang.org/ja/latest/library/irb.html
Azure上の不明なユーザのオブジェクトIDを特定してロールを削除する

Azure PortalでIAMの画面を開くと、「不明」という名のついたユーザがたまに存在します。

![SnapCrab_No-0000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/1f48d817-1a20-360c-934c-7d4bbd019879.png)


これなんで起きるかって言うと、Azure側のRBACのロールを削除する前にユーザーとかマネージドIDが付与されたリソースを削除しちゃうからなんですよね...

そして「不明」になると、Azure Portalの画面からは誰がいつ作ったユーザーなのかを調べることができません...

RBACのロールを削除してからリソースを削除すればこんなことは起きないのですが、
「不明」なユーザを特定してロール削除する場合の方法が一応ありました。

（私が作り出してしまった不明なユーザを頑張って探したので忘れないうちに備忘録）

## 前提条件
* 探したい不明なユーザの種類によって、探せる時期が異なります。
    * ユーザーID：Entra IDから完全削除されるまで
    * マネージドID：直近（アクティビティログに残る範囲）で何かしらの作業を実施していること

* ロールを削除したいスコープ（サブスクリプション、リソースグループなど)に対して「所有者」権限が付与されている必要があります。
* Entra IDからオブジェクトIDを検索する場合は、Entra IDに対しての参照権限も必要です。

## 1. 不明なユーザのオブジェクトIDを抽出する
とりあえず候補になる容疑者を探します（笑）

1. Azure PortalでCloud Shell を起動する or 端末からPowerShellを起動して以下のコマンドを実行します。

    ```Get-AzRoleAssignment |  Export-Csv -path UserRoleAssignment.csv```

2. CSVファイルが作成されるので開きます。
  (Cloud Shellから実行した場合は、「ダウンロード」をクリックしてファイルをダウンロードします。)
![SnapCrab_No-0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/e09e27a4-2321-5df7-91e3-3ce6fb04da36.png)


3. CSVファイルの ```scope```列を対象範囲に絞り込みます。

    例）
    * 不明なユーザがサブスクリプションに対してRBACを付与されている場合：```/subscriptions/<サブスクリプションID>```
    * リソースグループに対してRBACを付与されている場合：```/subscriptions/<サブスクリプションID>/resourceGroups/<リソースグループ名>/```

4. CSVファイルの```ObjectType```列が```Unknown```になっている行を抽出し、Object IDをメモします。

   ![SnapCrab_No-0003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/c4b82f82-f2ce-2756-90aa-21cb235a4e2e.png)


## 2．オブジェクトIDから対象ユーザを探す
容疑者は絞りこめたので、犯人を特定します（笑）

### 探したい不明なユーザがユーザIDの場合
Entra IDの画面から探します。
Entra IDに一度作成したユーザは削除後も30日間は「削除済みのユーザー」画面に残ります。

なので、削除したかったユーザとオブジェクトIDが一致すれば、そのオブジェクトIDが削除対象です。

![SnapCrab_No-0004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/5dcfe3f6-9d96-587d-880d-18ca5eede7b5.png)


### 探したい不明なユーザがマネージドIDの場合
こちらはリソースに付与されるIDなので、Entra IDには残りません。

なので、アクティビティログから対象リソースの直近の挙動を検索しました。
オブジェクトIDで検索して、該当する挙動を直近で行っていたオブジェクトIDが削除対象です。

![SnapCrab_No-0005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/370510ff-5e4e-5133-0e60-ec3f2ecc317c.png)


## 3. 特定した不明なユーザ（オブジェクトID）からロールを削除する
犯人（削除対象の不明なユーザ）が特定できたとしても、Azure PortalからではオブジェクトIDは特定できません。

そのため、Cloud Shell or PowerShellから以下コマンドで削除します。

```PS C:\> Remove-AzRoleAssignment -ObjectId <削除対象のオブジェクトID> -RoleDefinitionId <ロールのID> -Scope <ロールが付与されているスコープ>```

```ObjectId```も```RoleDefinitionId```も```Scope```も最初に出力したCSVに記載されているので、コピペすれば良いです。

コマンド実行後、削除できたか気になる場合は、もう一度CSVを出力してみて、削除したオブジェクトIDが存在してなければOKです。


***
以上です。

不明なユーザ全部消そうかと思ったけど、無事特定できました。

（実は残りの不明なユーザを私が知らない間に作ってしまったのかもしれない...w）
C#で行と列をフリーズまたはフリーズ解除する

大きなExcelワークブックを操作する際、特定の行や列を固定したままデータをスクロールするために、ワークシート内のペインをフリーズする必要がある場合があります。ペインをフリーズすることで、複雑なデータセットをより簡単にナビゲートできるようになります。逆に、ペインの凍結を解除すると、より包括的なビューが得られます。

この記事では、無料の.NETライブラリを使用して、**C#でExcelの行や列をフリーズまたはフリーズ解除する方法**を紹介します。

## 無料の.NET Excelライブラリ
このタスクには、Excelドキュメントに対する様々な操作をサポートする無償ライブラリ[**Free Spire.XLS for .NET**](https://www.e-iceblue.com/Introduce/free-xls-component.html)が必要です。
Nuget経由で直接インストールするか、[このリンクからダウンロード](https://www.e-iceblue.com/Download/download-excel-for-net-free.html)してDllを手動で参照してください。
> PM> Install-Package FreeSpire.XLS


## C#でExcelの行と列をフリーズする  
Free Spire.XLS for .NET ライブラリは、Excel の行と列を凍結する **`Worksheet.FreezePanes(int rowIndex, int columnIndex)`** メソッドを提供します。2つのパラメータは次のとおりです：
* `rowIndex`: 行のインデックスを示します（インデックスは1から始まります）。その行より上のすべての行が凍結される。
* `columnIndex`: 列のインデックスを示す（インデックスは1から始まる）。その列の左側にあるすべての列が凍結される。

したがって、最初の行を凍結するには、**`FreezePanes(2, 1)`** メソッドを使用します； 
最初の列を凍結するには、**`FreezePanes(1, 2)`** メソッドを使用します； 
最初の行と最初の列の両方をフリーズするには、**`FreezePanes(2, 2)`** メソッドを使用します。

> 以下はExcelの行や列をフリーズさせるC#のサンプルコードです：
```c#
using Spire.Xls;
 
namespace FreezeTopRow
{
    class Program
    {
        static void Main(string[] args)
        {
            // Excel文書を読み込む
            Workbook workbook = new Workbook();
            workbook.LoadFromFile(@"C:\Users\Administrator\Desktop\Test.xlsx");
 
            //最初のワークシートを取得する
            Worksheet sheet = workbook.Worksheets[0];
 
            //最初の行を凍結する
            sheet.FreezePanes(2, 1);
 
            //最初の列を凍結
            //sheet.FreezePanes(1, 2);
 
            //最初の行と最初の列をフリーズさせる
           //sheet.FreezePanes(2, 2);
 
            //最初の3列を凍らせる
            //sheet.FreezePanes(4, 1);
 
            //ドキュメントを保存する
            workbook.SaveToFile("FreezeExcelRowsColumns.xlsx", ExcelVersion.Version2016);
        }
    }
}
```


## C#でExcelの行と列の凍結を解除する
フリーズを解除するには、**`Worksheet.RemovePanes()`** メソッドを直接使用します。以下はそのサンプル・コードです：
```c#
using Spire.Xls;
namespace UnfreezeExcelPane
{
    class Program
    {
 
        static void Main(string[] args)
        {
            // Excel文書を読み込む
            Workbook workbook = new Workbook();
            workbook.LoadFromFile("FreezeExcelRowsColumns.xlsx");
 
            //最初のワークシートを取得する
            Worksheet sheet = workbook.Worksheets[0];
 
            //ワークシートの行または列の凍結を解除する
            sheet.RemovePanes();
 
            //ドキュメントを保存する
            workbook.SaveToFile("UnfreezeRowsColumns.xlsx", ExcelVersion.Version2016);
 
        }
    }
}
```

***APIリファレンス：***

https://www.e-iceblue.com/apireference/net/Spire.XLS/html/N_Spire_Xls.htm
白地図の上に路面表示乗せてみた

# 白地図の上に路面表示
上司に、「白地図の上に路面表示とか乗ったやつ作れる？」と言われて色々調べてみたのでここにまとめておきます。
# 白地図とは
陸地・島などの輪郭だけを線で表して、あとは白いままにしてある地図。学習や分布図作成などに用いる。白図。しろちず。
引用：[goo辞書](https://dictionary.goo.ne.jp/word/%E7%99%BD%E5%9C%B0%E5%9B%B3/)

読んで字の如く白い地図。
こんな地図（会社周辺の交差点）
![スクリーンショット 2024-08-30 16.07.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813229/b1b78137-bb1d-7be2-d801-f6bec4632035.png)

[国土交通省　国土地理院　地理院地図Vector](https://maps.gsi.go.jp/vector/#4/35.730489/139.065456/&ls=vblank&disp=1&d=l "地理院地図Vector")

この白地図、見てわかるように輪郭しかないので、これに横断歩道などの路面表示を乗せていこうというわけです。

# どうやって？
既存のものがないか調べたところ、ツールはあるものの、航空写真などを重ねて自力でトレースしていくらしい。
都市部の交差点はテンプレがあるとか（地方も欲しい！！）
自力か。。。

# AIにやらせてみたらええやん！
ということで、航空写真の画像を生成AIになげたらうまいことしてくれるんじゃね？と思ったのでChatGPTにお願いしてみた。

プロンプトに白地図と同じ場所の航空写真とともに
![スクリーンショット 2024-08-30 12.07.04（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813229/5f479ad2-2aac-a44f-ff59-261b57f5be9d.png)
[Google Map](https://www.google.com/maps)

- 横断歩道や車線のマーキングをもとに道路の部分だけを抜き出してください

と入力すると真っ白な画像が、ガーン
どうやら画像内のどこに道があるのかわからないようでした、、

そこから格闘すること10分

![black_lines_on_white.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813229/93788641-0917-ec9a-1646-098e6b6059f3.png)

こんな感じに仕上がりました。
どうしても道の部分がわからないようなのでグレースケールにして、二値化して白黒反転させて、、
というふうにしてようやくいい感じに仕上がりました。（普通に画像処理すればいいやんとか言わないで）

あとは出来上がった物を白地図に重ねてあげると。

![スクリーンショット 2024-08-30 16.54.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813229/debc5bbd-d633-5186-98a6-d68d2ba5689d.png)


うーん。まあ、まあ、、なんとか形にはなりました。
航空写真と正確な地図とでは若干ずれがあるようですね。

# 他の方法
二値化の方法が微妙だったので、エッジ抽出を試してみてみました。
別の交差点の白地図を用意。

![スクリーンショット 2024-08-30 17.01.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813229/5c1a247a-5f3f-c4db-d6a2-dfe710365762.png)

![スクリーンショット 2024-08-30 14.46.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813229/3daa026c-70de-104f-8802-02b2ea6cfe5d.png)


同じように航空写真を用意して、今度はエッジ抽出するよう指示を出すと

![スクリーンショット 2024-08-30 17.01.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813229/07b88115-368c-b900-5302-2da1ff160e84.png)

先ほどよりも車線などがきれいに取れている感じがします。
ですが、まだまだ改善は必要そうですね。

# おわりに
今回は白地図の上に路面表示を重ねる、というお仕事を生成AIにお願いしてみましたが、できないことはないって感じでしたね。
今回の方法だと、Pythonなどで画像処理をするという方法もありますが、逆にプログラミングができなくても、画像処理ができるという学びになりました。


みなさんも上司に「白地図の上に路面表示とか乗ったやつ作れる？」と言われる機会があれば、是非参考にしてみてください。

それでは、次回の【生成AIにお願いしてみた】シリーズでお会いしましょう！！

# 参考文献
goo辞書, 白地図, https://dictionary.goo.ne.jp/word/%E7%99%BD%E5%9C%B0%E5%9B%B3/ ,(参照日2024-8-30)

国土交通省, 国土地理院, 地理院地図Vector, https://maps.gsi.go.jp/vector/#4/35.730489/139.065456/&ls=vblank&disp=1&d=l ,(参照日2024-8-30)
Googte, GoogleMap , https://www.google.com/maps ,(参照日2024-8-30)
【UiPath】レシートの読み取りテスト

# はじめに

- 本記事は、[レシートの読み取り記事](https://qiita.com/Kajiita/items/3dfc8367d3a7aeabf6cb)の続きです。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
- 製品仕様や参考画像は 24.10 バージョンのもので構成しています。

# 抽出編

まず、[先回の確認結果](https://qiita.com/Kajiita/items/3dfc8367d3a7aeabf6cb)からOCRでデジタル化する部分では十分な精度が出ることはわかっています。
今回は、抽出をどのアクティビティ（またはソリューション）でやっていくのがよいのか確認していきます。

（今回もロピアのレシートを例にみていきます）
![ropia_receipt.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/91f628f1-cf2a-7b07-2878-f6200cb6e325.jpeg)


抽出器毎の考察：
1. フォーム抽出器　→　×　（レシート自体が性質上定型でないため）
1. マシンラーニング抽出器（特化型モデル抽出）　→　△　（後段に書きますが、いまいま用意されている***事前学習済みモデルだと明細は抽出しますが、標準フィールドは電話番号しか抽出されなかった。*** つまり、どのくらい改善するか不明ですがモデルのトレーニングが必須です。）
1. 生成AI抽出器　→　○　（そもそも非定型用の抽出器なので相性が良く、簡単なプロンプト指示だけで欲しい情報が取得できた。）

## 特化型モデル（事前学習済みモデル）による予測結果

![特化型モデルでは明細は取得できたが標準フィールドは電話番号のみ抽出.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/8f2509af-8c1d-c200-6822-1784f8bd72c6.jpeg)

明細情報と電話番号のみ抽出できています。明細の品名については、存在しないはずの縦罫線でもあるのか？、品名の文字列の途中までしか抽出されません。

## 生成AI抽出による予測結果

![生成AIは軒並み取得可能.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/fc8af5c7-b403-638f-3638-3b6ae859d402.jpeg)

抽出対象に設定したフィールドのうち、実際に存在しないものを除いてすべて抽出できています！品名も正確に抽出できています。

# 生成AI抽出器で実装してみた↓↓

今回は次の項目を抽出してみます。
- レシートの発行者
- 支払金額
- 税額
- 明細

まずは標準フィールドを「生成AI抽出器」で取得してみます。

![生成AI抽出1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/aa6b9367-bd6b-91a8-1a47-f8156368a9da.jpeg)
（プロンプトの設定）
![生成AI抽出2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/7ed3276e-221e-b276-dee6-11711d7102b2.jpeg)
（実行結果）
![生成AI抽出3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/4463342c-6e4c-b1d7-dd8d-6548fc5e2e76.jpeg)

::: note
レシート上、税率8％と10％で税額は2行になっているのですが、税額として***足し合わせた数字***を抽出してくれました！
:::

次に明細フィールドを「GenAI」の「コンテンツ生成」アクティビティで抽出します。
※「生成AI抽出器」は表データのプロンプト設定ができないためです。

![コンテンツ生成.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/2e2ce466-6268-3d89-5ac8-69d68e0cedef.jpeg)
（プロンプトの設定）
![生成AI抽出5-0.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/fea4ecd6-003e-8869-4022-15f6d64c7c66.jpeg)
（実行結果）
![生成AI抽出5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/eff4caf9-ae38-fa94-3be3-5b79e280cfa9.jpeg)

最初の説明文が不要なのと、ヘッダーがないとわかりづらいため、次の様にプロンプトを修正します。
```
"次のレシートのテキストデータの中から、明細データをカンマ区切りで出力してください。出力はヘッダーと明細データのみでお願いします。→"+ドキュメントテキスト
```
（再実行結果）
![生成AI抽出5-2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/761c3a25-89c8-9920-102c-434c1dfd67e5.jpeg)

バッチリですね！！

# さいごに
いかがでしたでしょうか。
生成AI抽出をもちいることで、デジタル化＞コンテンツ生成の2つのアクティビティだけで値抽出を実現できます！
レシートに限らず様々なドキュメントで簡単に応用できるとおもいますので、興味が沸いた方は是非是非お試しください。
最後までお読みいただきありがとうございます(・ω・)ノ
記事には新規性がなければならないか？

# はじめに

> おそらく NO  
> 研究分野のように必ずしも世界で最初の記事である必要はない  
> 新規性があるかどうかは読者によって変わる

書いた記事の数も２桁に乗ったということで、ポエムでも書いてみようと思います。

## 背景

この話題は知人との雑談が基になっています。勉強を兼ねて自分が記事を書こうとなったときに、新規性のない記事を書いてもいいのだろうかと疑問に思ったことがあります。いわゆる質の低い記事を書くのは望ましいものではなく、検索の一番上に出てくる内容をわざわざネットで公開する必要はありません。

一方で記事を書くこと自体に意味はあります。「勉強を兼ねて」と前置きした通り、自身の知識や学んだことを言語化したり、裏付けや出典をつける作業は意外と大変で、そこで初めて得られる知識もたまにあります。

知人の指摘は冒頭のとおりです。「新規性があるかどうかは読者によって変わる」というのが目から鱗でした。熟練プログラマにとっては価値が低くても、初心者プログラマにとって価値があれば、その記事に価値が生まれます。

付け加えて、ある技術に関して短く簡潔にまとまっていたり、関連性のある機能を包括的に取り上げてあったり、歴史的な経緯を説明していたり、**面白おかしく**書いてあれば、その記事には価値があると思います。

## 記事を書く目的


- アウトプットの練習

[インプットを太く､アウトプットも太く](https://www.youtube.com/watch?v=ckXWpIC0Xzg) という話があります。これはエンジニア全般に当てはまるような気がして、最新の技術を追いかける・他の人に教えることは重要だと考えます。  
教えるのは難しくて、わかりやすく伝えるには自身が十分に理解していて、かつ教える準備ができている必要があります。技術系の記事を書くのはここを鍛えられそうです。

- 学びのモチベーションを高める

自分の場合、つい興味関心のあることだけを追いかけがちです。記事のネタを探し回るようになれば、今まであまり興味がなかった分野もある程度積極的に見るようになるかもしれません。  
記事にする以上ある程度正しいことを書かなければならないので、例えばコードを記事にする場合は細部の確認や検証をしたり、うろ覚えだったところを明確にする必要もあります。こういうところは面倒ですが大事なので、モチベを高めたいところです。

- 記事を蓄積する

達成感や満足感を得ることは重要です。記事を書き溜めればいいことがあるでしょう。ある技術を説明するときにこの記事を読んでと自分の記事を紹介できればドヤれそうです。  
個人的に密かな野望として、**技術系の同人誌**を発行できればいいな、と考えています。

逆に記事を書く上で避けたいこともあります。  
いいね等の他者からの評価はあまり目的にしないほうがいい気がします。複アカでの自演やバズリを狙った記事等のチートに繋がるでしょう。何より楽しくありません。多分。  
とはいえ、いいねがモチベーションになるのは確かですし、需要のある記事を目指すこと大事です。

## 自分の路線を確立する

漠然と記事を書いても仕方がないので、独自の強みを見つけたいものです。  
自分が意識しているのは**テスト**と**パフォーマンス比較**です。

テストをつけておけばある程度コードの正しさを検証できますし、記事で間違ったコードを紹介してしまうようなミスを減らせそうです。テストの参考になるかもしれません。

パフォーマンス比較は、コードは実際に計測してみないとわからないことが結構あるため載せています。パフォーマンス比較は面倒な作業なので、自分自身の備忘録として残している側面もあります。  

## おわりに

背表紙にタイトルをかけるくらいの厚みの本が出せるよう、気長に記事を書こうと思います。
FizzBuzz、ズンドコ に続くの考えた! Bling-Bang-Bang-Born!!

# 最近のわかものは…

ひょっとして ズンドコキヨシ わからないのでは？？
と思ったので新しいネタ考えてました

# 流行りにのってこれ! Bling-Bang-Bang-Born!!

```python
import random

# Bling-Bang-Bang
# Bling-Bang-Bang
# Bling-Bang-Bang-Born

bb = ['Bling','Bang']
correct = ['Bling','Bang','Bang','Bling','Bang','Bang','Bling','Bang','Bang']

count = 0

history = [''] * 9

for i in range(1000):
    for j in range(0,8):
        history[j] = history[j+1]

    x = random.randint(0,1)
    history[8] = bb[x]

    print(history)
    if history == correct:
        print('Born!!')
        break

print(i)
```

結果はこう。

```text
  :
  :
['Bling', 'Bang', 'Bang', 'Bling', 'Bang', 'Bang', 'Bling', 'Bang', 'Bang']
Born!!
```