OmniAICreator/Qiita-1.07M huggingface dataset:
学習日記アプリ作成（データベース設計編）

## 1\.要件定義

  * そもそも、学習日記とは
  
  https://daigaku-juken-hacker.net/column/study-diary
  
  >簡単に言うと、“セルフタイムマネジメントの基礎”となるものであり、勉強をする前と後に、勉強した「時間」・「内容」・「達成度」などについて記入するだけの記録ノートです。

  >最低限書く必要があるのは、以下の3点です。

  >・学習前
  >　　1週間の目標
  >・学習直後
  >　　1日ごとの進捗状況。日時、勉強した内容、理解度
  >・週末など
  >　　1週間のまとめ、振り返り

  1週間の目標の部分では、Todoリストを準備することが重要らしい。
  学習直後の進捗記録はなるべく具体的に書くことが望ましいとのこと。
  週末の振り返りは、達成できたこと、できなかったこと、次にやるべきこと、いつかやるべきことなどをリストアップするとGood

  以上を踏まえて、ざっと必要なものは
  
  * ユーザー情報（名前・メールアドレス・パスワード）
  * 今週の目標
  * 毎日の記録（日時、勉強した内容、理解度）
  * 週末の振り返り（達成できたこと、できなかったこと）

 もっと充実させることはできるのですが、今回は短時間で環境構築からフロント・バック・デプロイの流れを確認するためのプロジェクトなので、いったんはシンプルな実装としておきます。

## 2\. エンティティ（テーブル）とカラム定義
要件定義をもとに必要なテーブルとカラムを定義します。

#### テーブル名:Users
ユーザー情報を管理するためのテーブル
| columnName | description |
|:-|:-|
|id(PK)| 自動生成される一意の識別子 |
|user_id(FK) | ユーザーの識別子  |
|  password |  ユーザーのパスワード |
| email  | ユーザーのメールアドレス  |


#### テーブル名: Goals
目標を管理するためのテーブル。
| columnName | description |
|:-|:-|
|  id (PK) | 自動生成される一意の識別子  |
| user_id (FK)  | ユーザーの識別子  |
| title  | 目標のタイトル |
| description  | 目標の詳細  |
| due_date  | 締切日（任意）  |
|  status | 状態（例: "未達成", "達成済み"）  |
|created_at   |  レコードの作成日時 |
| updated_at  | レコードの更新日時  |


#### テーブル名: DailyRecords
毎日の学習記録テーブル。
| columnName | description |
|:-|:-|
|  id (PK) | 自動生成される一意の識別子  |
|user_id (FK)| ユーザーの識別子|
|date|記録の日付|
|content|学習内容や進捗|
|created_at|レコードの作成日時|
|updated_at|レコードの更新日時|

#### テーブル名: WeeklyReviews
毎週末の振り返りのテーブル。
| columnName | description |
|:-|:-|
|  id (PK) | 自動生成される一意の識別子  |
|user_id (FK)|ユーザーの識別子|
|week_start_date|振り返り開始日|
|week_end_date|振り返りの終了日|
|summary|一週間の学習総括や感想|
|challenges|課題や改善点|
|achievements|達成したこと|
|created_at|レコードの作成日時|
|updated_at|レコードの更新日時|

テーブル名：
GoalsテーブルのStatusマスタテーブル
| columnName | description |
|:-|:-|
|  id (PK) | 自動生成される一意の識別子  |
|status_id(FK)|ステータスID|
|label|ステータス名|
国内企業で導入をおすすめできるセキュリティソリューションをまとめてみた

## エンドポイント
### yarai
https://www.ffri.jp/products/products_yarai

### TX One
https://www.txone.com/ja/

### APPGUARD
https://www.blueplanet-works.com/solution/appguard.html

## ネットワーク/メール/クラウド

### Zscaler
https://www.zscaler.com/jp

### Proofpoint
https://www.nri-secure.co.jp/service/solution/proofpoint

### Prisma Cloud
https://www.hitachi-solutions.co.jp/paloalto/products/cloud/p-cloud.html

### Netskope
https://www.nri-secure.co.jp/service/solution/netskope

### Prisma Access
https://www.iwi.co.jp/products/security/prisma-access.html

## 脆弱性診断ツール

### Vex
https://www.ubsecure.jp/vex

## 脅威インテリジェンス
### Recorded Future
https://www.iwi.co.jp/products/security/recorded-future.html

## 内部不正対策
### SKYSEA
https://www.skyseaclientview.net/

### Lanscope
https://www.lanscope.jp/
AWS Certified AI Practitioner（AIF）対策：解釈可能性・説明可能性

# 解釈可能性

- モデルの内部構造や予測結果が直感的に理解しやすいことを意味します。
- 主にシンプルなモデルに適用される概念です
- どの特徴量が予測に影響を与えるのかをスコアにして表示します。

# 説明可能性

- - **複雑なブラックボックスモデル**において、**出力結果に理由を説明できる**ことを
- モデルの透明性を高めるために事後的な説明手法が利用される
PythonでGUIデザインツールまとめ

# 初めに
PythonのGUIライブラリの比較って結構あるけど、GUIデザインツールについてまとまってるページが無かったので、まずはまとめてみた。

そのうち比較したいとおもうけど、GUIライブラリの使い方の違いもあるので、純粋にツールとしての使いやすさだけにとどまらないし、比較方法が難しいかもしれませんな。

これからPythonでGUI作りたいけど、ライブラリが多くて何がいいかわからない、という人はツールの使いやすさで選ぶというのもアリなのかも。

## 発見したもの

- QT Designer (for PyQt, PySide)
https://doc.qt.io/qt-6/qtdesigner-manual.html

- PAGE （for Tkinter）
https://sourceforge.net/projects/page/

- kivyk-designer (for Kivy)
https://github.com/kivy/kivy-designer

- wxFormBuilder (for wxPython)
https://github.com/wxFormBuilder/wxFormBuilder

## 教えていただいたもの
- wxGlade (for wxPython)
https://wxglade.sourceforge.net/


## 見つけてないもの
あったら教えてください。

- PySimpleGUI
- Pygame
- Flet
- PyGUI
- Flexx
PythonでExcelの行、列、セルをロックする

Excelドキュメントを操作していると、特定のデータが誤って変更されないようにする必要が出てくることがあります。そこで、Excelのセルをロックする機能が特に重要になります。この記事では、Pythonを使ってExcelのセルをロックし、データをより適切に管理・保護する方法を紹介する。
* [Pythonで指定したセルをロックする](#pythonで指定したセルをロックする)
* [Pythonで指定した行をロックする](#pythonで指定した行をロックする)
* [Pythonで指定した列をロックする]()

## Python Excelライブラリ
Excelファイルを処理するために、[**Spire.XLS for Python**](https://www.e-iceblue.com/Introduce/xls-for-python.html)ライブラリを使用する必要があります。以下のpipコマンドで直接インストールできます：
> pip install Spire.XLS


## Pythonで指定したセルをロックする
Spire.XLS for Pythonを使用すると、まず **`Worksheet.Range[]`** プロパティで指定したセルやセル範囲を取得し、**`CellRange.Style.Locked`**  プロパティを 「**True**」に設定してセルをロックすることができます。

> Pythonコード:
```python
from spire.xls import *
from spire.xls.common import *

# Excelファイルを読み込む
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")

# 最初のワークシートを取得する
sheet = workbook.Worksheets[0]

# ワークシートの使用範囲のすべてのセルのロックを解除する
sheet.Range.Style.Locked = False

#  ワークシート内の特定のセルまたはセル範囲をロックする
sheet.Range["A1"].Style.Locked = True
sheet.Range["C2:F6"].Style.Locked = True

# ワークシートをパスワードで保護する
sheet.Protect("123456", SheetProtectionType.All)

# 結果ファイルの保存
workbook.SaveToFile("LockExcelCells.xlsx", ExcelVersion.Version2013)
workbook.Dispose()
```

## Pythonで指定した行をロックする  
**`Worksheet.Rows[]`** メソッドでワークシートの指定行を取得し、その行をロックすることもできます。

> Pythonコード:
```python
from spire.xls import *
from spire.xls.common import *

# Excelファイルを読み込む
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")

# 最初のワークシートを取得する
sheet = workbook.Worksheets[0]

# ワークシートの使用範囲のすべてのセルのロックを解除する
sheet.Range.Style.Locked = False

#  ワークシートの2行目をロックする
sheet.Rows[1].Style.Locked = True

# ワークシートをパスワードで保護する
sheet.Protect("123456", SheetProtectionType.All)

# 結果ファイルの保存
workbook.SaveToFile("LockExcelRow.xlsx", ExcelVersion.Version2013)
workbook.Dispose()
```


## Pythonで指定した列をロックする
指定した列は **`Worksheet.Columns[0]`** プロパティで取得でき、その列をロックすることができます。

> Pythonコード:
```python
from spire.xls import *
from spire.xls.common import *

# Excelファイルを読み込む
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")

# 最初のワークシートを取得する
sheet = workbook.Worksheets[0]

# ワークシートの使用範囲のすべてのセルのロックを解除する
sheet.Range.Style.Locked = False

#  ワークシートの最初の列をロックする
sheet.Columns[0].Style.Locked = True

# ワークシートをパスワードで保護する
sheet.Protect("123456", SheetProtectionType.All)

# 結果ファイルの保存
workbook.SaveToFile("LockExcelColumn.xlsx", ExcelVersion.Version2013)
workbook.Dispose()
```

:::note warn
注: デフォルトでは、ワークシート内のすべてのセルに対してロック・オプションが有効になっています。したがって、特定のセルをロックする前に、すべてのセルのロックを解除する必要があります。セルのロックは、ワークシートが暗号化されるまで有効になりませんのでご注意ください。
:::

* * *

上記の3つのコード例を通して、Pythonを使ってExcelの指定したセル、行、列をロックすることができます。エクセルの文書処理機能については、こちらをご覧ください：

https://www.e-iceblue.com/Tutorials/Python/Spire.XLS-for-Python/Program-Guide/Spire.XLS-for-Python-Program-Guide-Content.html
OMCB029B(281)

https://onlinemathcontest.com/contests/omcb029/tasks/8132

![OMCB029B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543462/b78fcbc2-e77d-1f75-435a-04b3c1a1d25a.png)

上図のように
$D$を通り$AC$と平行な直線と$AB$の交点を$E$とします。

問題文の条件より$∠BAD+2∠DAC=180°$であることから$AC$は$△ABD$の$A$の外角の二等分線です。
同じ角度の所に$●$を記していくと、$△ADE$は二等辺三角形であることがわかり、$BE=2,EA=8$となります。

$△BDE∽△BCA$なので、$BD:DC=BE:EA$です。
したがって、
$CD=\frac{BD×EA}{BE}$
$=\frac{3×8}{2}$
$=12$
並列Prolog

# ヒント
分散並列の機能を追加して、さてこれでラズパイ・クラスタマシンを作る・・・という段になって問題に気が付きました。製作コストです。いくらラズパイが安いとはいえラズパイ４は1万円くらいします。これを30台となる電源やハブなどいれたら50万円くらいにはなりそうです。さて、どうしたものか？

reddit/prolog英語版に投稿しておいたらコメントをいただきました。各マシンのコアを活かす方法です。ラズパイといえども4コアをもったARMアーキテクチャーが搭載されています。インテルやAMDのデスクトップなら最低でも6コアは積んでいます。マルチスレッドあるいはマルチプロセスにすればこれらを活かすことができます。

# 実績
マルチスレッド、マルチプロセスについては既に拙作のEasy-ISLispで実装済です。なかなかに苦労したのですが、そのときの経験を活かすことができます。N-Prologも基本的にはEasy-ISLispと作りは似ています。応用できるはずです。マルチスレッドでスレッドセーフにすることと、L3キャッシュでうまくヒットするようにコンパイルコードを工夫することがミソです。

# イメージ図
分散並列、マルチスレッド、マルチプロセスをフルに駆使すれば次のようなネットワークがわりと安価に可能になります。

![para.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/520a9627-c7ce-1bed-cd71-c183652909e8.png)


# 富豪的プログラミング
1980年代、ICOTが活躍していた時代において並列マシンは高価でした。そのためかCSPにより並列機能を有効にしようとAND並列、OR並列に苦心していたようです。

![csp1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/b7470ffe-b07d-2f69-2cd4-502790933a0b.png)

![csp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/826a7120-210f-d780-010a-4baad98be94b.png)


一方で現在では汎用PCの性能は当時の専用マシンを軽く凌駕しています。それらを手あたり次第にネットワーク接続すればかなりの並列性能を出せるはずです。Prologの基本構文を維持したシンプルな並列機能を持たせます。バックトラックも有効に使えます。これで何か新しい発見がないかとワクワクしております。

https://github.com/sasagawa888/nprolog
ジッターとは何ですか? ジッター バッファーを使用してジッターを削減するにはどうすればよいですか?

ビデオ通話やライブ配信中に不安定、バッファリング、画質の低下、音声と映像の同期ずれなどのフラストレーションを感じたことはありませんか？

ページを何度もリフレッシュしたり、アプリケーションを終了したくなるのは理解できます。これらの問題は、ネットワークジッタによって引き起こされることがあります。

プロの音声・映像開発者として、ジッタの原因を理解し、解決策を見つけることは、ユーザーに高品質な音声・映像通話サービスやライブ配信体験を提供するために重要です。

## ジッタとは

まず、データパケットとは何かを理解しましょう。音声・映像データをキャプチャした後、送信者はこのデータを一連の小さなデータパケットにエンコードし、ネットワークを介して受信者に送信します。受信者がデータパケットを受け取ると、アンパックやデコードなどの操作を行い、最終的に処理された音声データをプレイヤーに渡して再生します。

リアルタイムの音声・映像伝送では、ネットワーク遅延、パケットロス、帯域幅の制限などの要因により、データパケットの伝送速度が変動することがあります。これにより、受信者側でパケットの到着時間が不安定になり、ジッタが発生します。

## ジッタの原因

ジッタは通常、ネットワーク伝送や再生プロセスの不安定さに関連しています。以下はジッタの可能な原因です：

- **ネットワーク遅延**：リアルタイムの音声・映像伝送中に、データパケットがネットワークを通じて異なる程度の遅延に遭遇することがあります。これにより、パケットの到着時間が不安定になり、ジッタが発生します。
- **パケットロス**：ネットワーク環境でのパケットロスは、特定のビデオフレームが受信者に届かない原因となり、フレームスキップやフリーズなどのジッタ現象を引き起こします。
- **帯域幅の制限**：ネットワーク帯域幅が高品質なデータ伝送をサポートするのに不十分な場合、データパケットの伝送速度が不安定になり、ジッタが発生します。
- **コーデックの性能**：コーデックの性能もジッタに影響を与えることがあります。コーデックの処理速度がデータパケットの伝送速度に追いつかない場合、スタッタリングやフレームスキップ現象が発生します。
- **プレイヤーの問題**：プレイヤーがビデオフレームを処理する際に安定した再生速度を維持できない場合、ビデオジッタが発生することがあります。

![jitter buffer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957687/a530fdc9-7ece-d920-959a-bf0f832ce3a9.png)

## ジッタの測定

ネットワークジッタの測定は、主にパケット到着時間の変動の程度を計算することに関わります。以下はジッタを測定するための一般的な方法です：

- **平均ジッタ**：連続するパケットの到着時間の差を計算し、これらの時間差の平均を求めます。平均ジッタはネットワーク遅延の全体的な変動を反映しますが、瞬間的なジッタ現象を正確に説明することはできません。
- **ジッタ分散**：連続するパケットの到着時間の差を計算し、これらの時間差の分散を求めます。ジッタ分散はネットワーク遅延の変動の程度を反映し、値が大きいほどジッタが深刻であることを示します。
- **最大ジッタ**：連続するパケットの到着時間の差を計算し、最大の時間差を特定します。最大ジッタはネットワーク遅延の最大変動を反映しますが、極端な値に影響されることがあります。
- **パーセンタイルジッタ**：連続するパケットの到着時間の差を計算し、これらの時間差の特定のパーセンタイル値（例：95パーセンタイル）を求めます。パーセンタイルジッタは極端な値の影響を減らしながらネットワーク遅延の変動を反映します。
- **エンドツーエンド遅延**：送信者と受信者の間の総遅延を計算します。この指標はネットワーク遅延、処理遅延などのさまざまな要因を含み、通信品質に対するジッタの影響を包括的に反映します。

実際のアプリケーションでは、特定のシナリオや要件に基づいて適切な方法を選択してジッタを測定することが可能です。また、パケットロス率、帯域幅などの他のネットワーク指標と組み合わせて、ネットワーク状態や通信品質を評価することも可能です。

## ジッタを減らす方法

音声と映像のリアルタイム性と時間的性質のため、ジッタは音声と映像の品質に大きな影響を与えます。ジッタを減らすためには、以下の技術手段と戦略を採用することができます：

- **フレームドロップ戦略**：ネットワーク条件が悪い場合、非キーフレームを選択的に破棄することで、品質を下げつつもスムーズさを維持することができます。
- **フレーム同期アルゴリズム**：アルゴリズムを使用してデータフレームの到着時間を予測し、再生中の安定した間隔を維持します。
- **適応ビットレート調整**：ネットワーク条件に基づいてビデオビットレートを動的に調整し、異なる帯域幅環境に適応してジッタの発生を減らします。
- **ジッタバッファ**：受信側にジッタバッファを設定し、受信したデータパケットの順序を調整して再生中のジッタを減らします。
- **コーデック性能の最適化**：高性能のコーデックを選択するか、既存のコーデックの性能を最適化して処理速度を向上させ、スタッタリングやフレームスキップを減らします。
- **ネットワークの最適化**：より良い伝送プロトコルを選択し、ネットワークルーティングを最適化するなどのネットワークレベルでの対策を実施して、ネットワーク遅延やパケットロスを減らし、データ伝送の安定性を向上させます。
- **プレイヤーバッファリング**：プレイヤー側にバッファを設定して受信したデータをキャッシュし、再生時間に余裕を持たせてジッタを減らします。
- **プレイヤー性能の最適化**：プレイヤーの内部処理フローを最適化して、データフレームを安定した速度で再生できるようにし、ジッタを減らします。

## ジッタバッファ

ジッタバッファは、リアルタイムの音声・映像伝送においてジッタを減らすための技術です。受信側にバッファを設定し、受信したデータパケットの順序を調整して再生中のジッタを減らします。

簡単に言えば、ジッタバッファはネットワークからの不均一なデータパケットをバッファリングし、それを均等にデコーダに渡してデコードするための貯水池のようなものです。
（JUCE）自作 VST/AU プラグインの動作確認方法 ～ アルゴリズム検証は MATLAB で

[<B>MATLAB/Simulink Advent Calendar 2024</B>](https://qiita.com/advent-calendar/2024/matlab)、[<B>JUCE Advent Calendar 2024</B>](https://qiita.com/advent-calendar/2024/juce)に参加しました。

・使用ツール
<dt>　MATLAB、JUCE、Visual Studio</dt>
<br>

<H4><a href="https://note.com/leftbank/n/n71c38017acfc"</a> [<B>note</B>]にUpしました。</H4>
shared exampleをネストする

# メタデータを使ってできるそうだができなかった。
## Sharing metadata automatically includes shared example groups
>Given a file named “sharedexamplemetadata_spec.rb” with:
```rb
RSpec.shared_examples "shared stuff", :a => :b do
  it 'runs wherever the metadata is shared' do
  end
end

RSpec.describe String, :a => :b do
end
```
>When I run rspec shared_example_metadata_spec.rb
>
>Then the output should contain:
```
1 example, 0 failures
```
と書いてあったが
```
0 examples, 0 failures, 0 passed
```
となり、例さえも見つけることができなかった。

# クラス内のメソッドのように使える
### Shared examples are nestable by context
>Given a file named “contextspecificexamples_spec.rb” with:
```rb
RSpec.describe "shared examples" do
  context "per context" do

    shared_examples "shared examples are nestable" do
      specify { expect(true).to eq true }
    end

    it_behaves_like "shared examples are nestable"
  end
end
```
>When I run rspec context_specific_examples_spec.rb
>
>Then the output should contain:
```
1 example, 0 failures
```
https://rspec.info/features/3-13/rspec-core/example-groups/shared-examples/#:~:text=behavior%3A%20sortability%0A%20%20%20%20responds%20to%20%3C%3D%3E-,Sharing%20metadata%20automatically%20includes%20shared%20example%20groups,1%20example%2C%200%20failures,-Shared%20examples%20are%20accessible
新人プログラマーが大きなプロジェクトに巻き込まれた話

# 前提
当時はまだプログラマーの地位が低く、とてもソフトウェアでは食っていけない時代
私も仕事がなく周りの人に「こんなことできますよ」と宣伝するぐらいだった

しかたなく市販のセンサーを表示したり計測したりするのを作って売って生活をしていた

# 予兆
知人からちょっと相談に乗って欲しいぐらいの感覚で呼ばれて行ってみたらソースコードを印刷した紙が大量に用意されていた
「これって理解出来たりする？」
と言われてしまう

人が作ったプログラム、しかも結構大きいものなので普通なら断るだろう
しかし実はこれまでに百数十人のプログラムをその場で解析、修正するということをやっていたのでプログラムがその場で読めてしまった

「こことここに表示関係のバグがありますね」
「あとこの条件文はちょっと間違ってますね」

ぐらいの事を言ってその日は終わった

# 数日後
今度は会議に出席してくれという
場所と日時だけ伝えられて、準備も不要とのことなので何も持たずに向かった

会場に着いてみると会議室は広く、部屋の隅を囲むような形でテーブルが並んでいてみんなが中央を向く形だった
一番下座？が指定されていたのでそこで座ったが会議を仕切っている人はかなり遠く、発言もマイクかなにかを使っていた
「聞いているだけで良い」
と言われたとおり本当に聞いていただけだった

会議が終わりその会議への出席を依頼してきた人との懇親会が始まる
そして1時間は呑んでいただろうか？
それまでまったく会議の事に触れることがなかったのに急に
「あの仕事うちで担当することになったからよろしく」
との無茶ぶりだった
終電が近かったこともあり中途半端な受け答えをして帰宅したが
次の日にはFAXで仕様書と、どういうものを組むのかが書かれたものが送られて来た

どうやらこっちとしても仕事を受けたことになっていたらしい
FAXで送ることができる量の仕様書であることと
以前紙で確認したプログラムに追加するだけで良いということだったので受けることにした

これが後にどんでもなく大きなプロジェクトだったことに気づかされる

# 荷物が届く
ある日　荷物が届いた
・開発環境付きの実機一式
・相手側の機械
・2台を結ぶ通信基盤
・仕様書
・実機にダミーでデータを送る機械

これで開発を依頼ということだった

## 納期
受け取ったのが9月で最終納期は2月末

仕様書の量と納期から余裕と思っていた

# トラブルその1
機械同士を接続しても通信できない
それも完全にだめというわけでなく2台ならできて3台からは繋がらない
しかたがなく解析するソフトを作って解析するとデータの先頭が欠落していた
どうやら基板のI/Oが悪さをしているらしい
仕方が無いのでボードを追加しリレーで擬似的に2台ずつの通信に見せかけることになる
そしてもう10月

# トラブルその2
仕様書通りにプログラムを組むことができたが3箇所だけ質問しないと進まないところが出てきた
といっても止めることができないのでダミーのデータにしてさらにそのデータを簡単に外部から書き換えるようにした
そしてその質問の答えは年内に返ってこなかった

# トラブルその3
ダミーでデータを送る機械が壊れた
時間がなかったせいだが今思うとダミーデータを送るのも作っておくべきだった
データを送ることができないと何にも始まらないので完全停止

想像だけでプログラムを組まざるを得なかった

# 進捗発表会
会議室ではなく実際に機械が置いてある場所で進捗兼接続テストが開始されるとのこと

行ってみると都会のど真ん中の検知器中のビルの上層階
いわゆるお偉いさんは居なかったが大企業の人とそこから受注したソフト会社の人数人が集まっていた

さっそく接続テストが行われダミーデータを送ると第一階層まではデータが届くことが確認された
このときどれだけ安堵したか想像して欲しい

# 問題発生
第一階層までデータが届いたがそこから第二階層までデータが送られるはずだった
それは私には関係ない部分ではある
第一階層を解析したメーカーから
「ここに指定先コードが入ってないですね、0だと第二階層に送れませんよ」
そんなことを言われてしまう

ここで全体招集がかかる

なぜ動作しないのか？
このときの立場として自分が一番下だ
有名メーカーとその下請けと思われる技術者から無理難題を言われる

# そこで私が言ったこと
理不尽な状態だったがそれは心の奥にしまって置いて現実的な話として説明した
「制作中に仕様書に不明な点があったので去年のうちに質問しましたがまだ返答がないためダミーのデータが入っています」
この言葉に有名メーカーの立場のある人が反応して下請けを問いただすとたしかに質問は来ていたが返していなかったことが明らかになる

# なんかしちゃいました？
メーカーから席を外して欲しいと言われたのでその場を離れたがドアの向こうで怒号が聞こえていたので何かあったのだろう

しばらくして戻っていくと　ふんぞり返っていた下請けメーカーが萎縮していた

さらに有名メーカーの人から直接
「仕様書が届いていなかったのは申し訳ない」「そこを埋めた状態で再度試験をしたいと思うので協力して欲しい」
なにがおきたのかわからなかったがメーカーの人は信頼されたようだったので
「その部分は気になっていたので簡単に修正出来るようにしています」
「なんなら今、この場ですぐ修正出来ますよ」
というとまた下請けの方にその話を持っていった

遠かったので聞こえなかったが、その下請けはさらに別の所に仕事をさせていたので自分では直せないし直せる目処もたたないらしい

結局もう一度試験を行い問題ないことを確認した
前回は出なかった弁当（かなり豪華な内容）も出たし評価されたのだろう

# 後日談
ポエムだが一応後日談
ようやく先日、担当から外れることができた
ただあのときの仕様は互換性のため今でも使われているらしい
停止し続けたり誤動作するとちょっとしたニュースになりそうな機器を新人プログラマーが組んだなと思うところはある

似たような境遇になった人のために教訓を書いておきます

# 教訓
・質問して返事が無いのでプロジェクトが停止していることはもっと上の人に言った方が良い
・借りている機械は壊れると進まないのですぐにその機械のダミーを作った方が良い
・仕様の不明なところは臨機応変に対応出来るようにしておいた方が良い
【Rustのまほう2】#11 ステート

私がBevy Engineでかなり重要だと思っている『ステート』について解説していきます。

# ステート

Bevyにおける**ステート**(State)とは、ざっくりいうと「ゲームがいまどの画面を開いているか」、つまり最初のタイトル画面なのか、ゲーム本編が始まっているのか、コンフィグ画面なのか、などを表すものです。

たとえば、タイトル画面でスペースキーを押したらゲーム本編に進むという仕組みだったとしましょう。それでゲーム本編に入ったとき、もう一度スペースキーを押したらまたゲーム本編の初期化の処理が実行されてしまうことになります。頑張ってフラグで切り替えてゲーム本編ではそのシステムが動作しないようにしたとしても、システム自体は動作しているのでクエリが実行されてしまい、ゲーム本編には不要な処理が何度も走ってしまう可能性があります。

ここでステートを使うと、特定の画面でのみ動作するシステムを定義できます。


# ステートの定義

次は実際に私が書いたステートの定義です。

```rust
#[derive(States, Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum GameState {
    #[default]
    Setup,

    /// タイトル画面
    MainMenu,

    /// 通常のプレイ画面
    InGame,

    /// ワープ中を表すステート
    Warp,

    // 名前入力画面
    NameInput,
}
```

ゲームを起動すると、最初はデフォルトの`Setup`ステートになります。`Setup`では画像などの読み込みを行い、読み込みが完了すると`MainMenu`ステートに遷移するようになっています。そしてタイトル画面で画面をクリックするとゲーム本編の`InGame`ステートに遷移します。

なお、グローバルな状態を管理する機能という意味では、ステートと似たようなものに『リソース』という機能もあります。リソースとステートの違いは、ステートはシステムの切り替えに使うもので、リソースはそれ以外の汎用的なグローバル状態だということです。



# システムの実行条件

先ほど定義したステートを使ってシステムの実行条件をしてするには、`run_if`と`in_state`を使います。

```rust
app.add_systems(
    FixedUpdate,
    update_camera.run_if(in_state(GameState::InGame))
);
```

こうすると、`update_camera`システムは、ゲームが`InGame`ステートにあるときだけ実行されるようになります。実際の開発を始めると、`add_systems`のほとんどでこの`run_if`でステートを指定することになります。このようにステートは実はゲーム全体に影響しますので、なるべく開発の初期に定義しておいたほうがいいと思います。



# ステートの切り替え

ステートを切り替えるには、Bevy組み込みの`NextState`リソースを参照します(リソースについてはこのシリーズでまだちゃんと説明していませんが、汎用のグローバルな状態のことです)。次のように`ResMut`システムパラメータを使ってリソースを取り出し、`set`で次のステートを指定します。

```
fn on_click(
    ...
    mut next_state: ResMut<NextState<GameState>>,
) {
    ...

    next_state.set(GameState::InGame);

    ...
}
```

これで、この次のフレームからは`GameState::InGame`のステートになります。た`StateScoped`が動作して、不要になったエンティティが自動的に削除されます。



# `StateScoped`

ステートのもうひとつ重要な機能に、`StateScoped`があります。これはコンポーネントの一種なのですが、別のステートに切り替わったときに自動的にそのエンティティ全体をワールドから削除することができます。たとえば、私のゲームではプレイヤーキャラクターに次のように`StateScoped`コンポーネントを追加しています。

```rust
commands.spawn((
    StateScoped(GameState::InGame),
    ...
});
```

これで、タイトル画面に戻ったときにはプレイヤーキャラクターのエンティティは自動的に削除されます。手動でエンティティを削除するのはかなり面倒ですし、うっかり削除し損ねるとタイトル画面に戻ったのにプレイヤーキャラクターのスプライトが画面に残ったりします。そのため実際にはほとんどすべてのエンティティにこの`StateScoped`を追加することになります。この意味でもステートは最初に定義しておいたほうがいいということです。
State of AI Report 2024: Introduction

### State of AI Report 2024(Benaich, 2024)

https://www.stateof.ai/


#### Introductionの概要
#### 
1. AIの進化と影響:
AI技術は急速に進化しており、さまざまな分野での応用が拡大しています。特に、生成AIや大規模言語モデル（LLM）の発展が注目されています。これにより、AIが人間の作業を補完し、効率を向上させる可能性が高まっています。

2. 研究と産業の交差点:
AIの研究は、産業界との連携が強化されており、実用的なアプリケーションが増加しています。企業はAIを活用して新しい製品やサービスを開発し、競争力を高めています。

3. 倫理と安全性の課題:
AIの進展に伴い、倫理的な問題や安全性の懸念も浮上しています。特に、AIの決定が人間社会に与える影響や、バイアスの問題、プライバシーの保護などが重要なテーマとして取り上げられています。

4. 未来の展望:
今後のAIの発展においては、技術的な進歩だけでなく、社会的な受容や規制の整備も重要です。AIが持つ潜在能力を最大限に引き出すためには、これらの要素がバランスよく進められる必要があります。

5. レポートの構成:
このレポートは、AIの研究、産業、政策、安全性、予測などのさまざまな側面を網羅しており、各セクションで最新の情報と分析が提供されることが示されています。


#### キーワードの定義
###
- 人工知能 (AI):
AIは、知的な機械を作成することを目指す科学と工学の多分野にわたる領域です。AIは、データを処理し、学習し、意思決定を行う能力を持つシステムを指します。
###
- 人工一般知能 (AGI):
AGIは、将来的に人間の認知能力を全ての経済的に価値のあるタスクにおいて超えることができる機械を指します。これは、特定のタスクに特化したAIとは異なり、幅広い知識と能力を持つことを意味します。
###
- AIエージェント:
AIエージェントは、環境内で行動を取ることができるAIシステムを指します。例えば、特定のタスクを達成するために、利用可能なツールの中からどれを使用するかを決定する大規模言語モデル（LLM）が該当します。
###
- AI安全性:
AI安全性は、将来のAIシステムが人類に対して引き起こす可能性のあるリスク（軽微なものから壊滅的なものまで）を研究し、軽減することを目的とした分野です。AIの進化に伴い、これらのリスクを管理することが重要視されています。
###
- コンピュータビジョン (CV):
CVは、プログラムが画像や動画を分析し、理解する能力を指します。これは、AIが視覚情報を処理するための重要な技術です。
###
- 深層学習 (DL):
DLは、脳内のニューロンがデータの複雑なパターンを認識する方法に触発されたAIのアプローチです。「深層」という用語は、今日のモデルにおける多層のニューロンを指し、データの豊かな表現を学習することで性能向上を図ります。
###
- 拡散 (Diffusion):
拡散は、人工的に破損した信号を反復的にデノイズして新しい高品質の出力を生成するアルゴリズムです。最近では、画像生成やタンパク質設計の最前線で使用されています。
###
- 生成AI:
生成AIは、テキスト、画像、音声、3Dアセットなどの新しいコンテンツを「プロンプト」に基づいて生成することができるAIシステムのファミリーを指します。
###
- グラフィックス処理ユニット (GPU):
GPUは、大量の計算を並行して実行することを可能にする半導体処理ユニットです。歴史的にはコンピュータグラフィックスのレンダリングに必要でしたが、2012年以降は深層学習モデルのトレーニングにも適応されています。

###
- 大規模言語モデル (LLM):
LLMは、大量のテキストデータを基にトレーニングされた言語モデルであり、自然言語の生成や理解を行う能力を持っています。これらのモデルは、文脈を理解し、関連する情報を生成するために、トランスフォーマーアーキテクチャを使用することが一般的です。
###
- 機械学習 (Machine Learning, ML):
機械学習は、AIの一分野であり、データから学習し、明示的なプログラミングなしに予測や判断を行う能力を持つアルゴリズムを開発することを目的としています。MLは、データを用いてモデルをトレーニングし、そのモデルが新しいデータに対しても適切に機能するようにします。
###
- 自然言語処理 (Natural Language Processing, NLP):
自然言語処理は、コンピュータが人間の言語を理解し、生成する能力を持つ技術です。NLPは、テキストの解析、感情分析、機械翻訳など、さまざまなアプリケーションに利用されます。
###
- プロンプト
多くの場合、自然言語で書かれたユーザ入力であり、LLMに何かを生成したりアクションを起こすように指示するために使われる
###
- 強化学習 (Reinforcement Learning):
強化学習は、エージェントが環境内で行動を選択し、その結果に基づいて報酬を受け取ることで学習する手法です。エージェントは、報酬を最大化するための最適な行動戦略を学びます。このアプローチは、ゲームプレイやロボティクスなどの分野で広く利用されています。
###
- 自己教師あり学習 (Self-supervised Learning, SSL):
自己教師あり学習は、ラベル付けされたデータを必要とせず、未ラベルのデータから学習する手法です。データを自動的に変換して人工的なラベルを生成し、そのラベルを用いてモデルをトレーニングします。例えば、文中の単語をマスクして、その単語を予測するタスクがSSLの一例です。
###
- モデル (Model):
モデルは、特定のタスクを実行するためにトレーニングされた機械学習アルゴリズムを指します。モデルは、データを入力として受け取り、予測や分類を行います。
###
- トランスフォーマー (Transformer):
トランスフォーマーは、自然言語処理（NLP）や他のタスクにおいて広く使用される深層学習モデルのアーキテクチャです。自己注意機構を利用して、入力データの異なる部分間の関係を効率的に学習します。これにより、文脈を考慮した情報処理が可能になります。
Markdown AIにMermaid登場！最新アップデートで図解を簡単に

![Mermaid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921729/ad02c972-20d2-25ae-6df4-eccd63c14f93.png)
# Markdown AIにMermaidが追加！
2024年12月9日、Markdown AIに新たな機能として **「Mermaid記法」** が追加されました！これにより、 **簡単にグラフやチャート、シーケンス図などを作成・共有できるようになりました。** 

## Mermaid記法とは？
Mermaid記法は、フローチャート、ガントチャート、シーケンス図、パイチャートなどをテキストベースで簡単に作成できる記法です。
これを使えば、PowerPointなどのツールを使用しなくても文言だけで簡単に図などを制作できます。

例えば、

````
```mermaid
pie
    title Resource Allocation
    "Development": 40
    "Marketing": 25
    "Operations": 20
    "Management": 15
```
````

上記をMarkdown AIに記述すると、以下のようなグラフが生成されます。

```mermaid
pie
    title Resource Allocation
    "Development": 40
    "Marketing": 25
    "Operations": 20
    "Management": 15
```

このように、簡単な記述で視覚的にわかりやすい資料を作ることができます！

## Mermaidの簡単なルール

**ルール１：
頭に バッククオート（\`）３つとmermaidと記述、終わりにバッククオート（`）３つ**
````
```mermaid
<ここに内容を書く>
```
````

**ルール2：何の図を書くかを最初に書く**
フローチャート → graph
シーケンス図 → sequenceDiagram
ガントチャート → gantt
パイチャート → pie

**ルール3：箱（ノード）を作る**
四角い箱: A[これが四角い箱表記]
ダイヤモンド（条件分岐）: B{ここで分岐}

**ルール4：箱と箱をつなぐ矢印を書く**
矢印を書くときは、--> を使う。
例： A --> B

**ルール5：説明を足す**
矢印に「はい」や「いいえ」をつけたいとき：
A -- はい --> B

Mermaidの基本的な使い方は以上になります！
より詳しい使い方を学びたい場合は、下記の記事が参考になるので、読んでみて下さい。
執筆者：@opengl-8080さん

https://qiita.com/opengl-8080/items/a275119c5ff3012ff23a

# Mermaidで作成できる図の種類
Mermaid記法を使うと、さまざまな図が作成できます！

## フローチャート（Flowchart）

```mermaid
graph TD;
    A[開始] --> B{条件};
    B -- はい --> C[処理1];
    B -- いいえ --> D[処理2];
    C --> E[終了];
    D --> E[終了];
```
**用途:**
プロセスやワークフロー、条件分岐の流れを視覚化するのに使用します。
※graphの後の「TD」は（Top to Down）の略で、上から下へ」の流れ（縦向き）を意味します。

````
```mermaid
graph TD;
    A[開始] --> B{条件};
    B -- はい --> C[処理1];
    B -- いいえ --> D[処理2];
    C --> E[終了];
    D --> E[終了];
```
````

## 2. シーケンス図（Sequence Diagram）

```mermaid
sequenceDiagram
    participant A as ユーザー
    participant B as サーバー
    A->>B: データをリクエスト
    B-->>A: データを返す
```
**用途:**
システム間や参加者間のやり取り（メッセージの流れ）を表現します。APIの通信やユーザーとサーバーのやり取りを説明するのに便利です。
````
```mermaid
sequenceDiagram
    participant A as ユーザー
    participant B as サーバー
    A->>B: データをリクエスト
    B-->>A: データを返す
```
````

## ガントチャート（Gantt Chart）

```mermaid
gantt
    title プロジェクト計画
    section 準備
    設計: done, des1, 2024-01-01, 3d
    開発: active, dev1, after des1, 10d
    テスト: test1, after dev1, 5d
```
**用途:**
プロジェクト計画やタスクスケジュールを視覚的に管理します。
````
```mermaid
gantt
    title プロジェクト計画
    section 準備
    設計: done, des1, 2024-01-01, 3d
    開発: active, dev1, after des1, 10d
    テスト: test1, after dev1, 5d
```
````
## パイチャート（Pie Chart）
```mermaid
pie
    title 予算配分
    "開発": 40
    "マーケティング": 30
    "運用": 20
    "管理": 10
```
**用途:**
データの割合を視覚化するのに使用します。
````
```mermaid
pie
    title 予算配分
    "開発": 40
    "マーケティング": 30
    "運用": 20
    "管理": 10
```
````

# Markdown AIでのMermaidの使い方
Markdown AIでMermaid記法を使用する際も上記と一緒の記述で図が作成できます！

**Mermaid記法のメリット**
- シンプルで直感的な記法：HTMLやグラフィックソフトを使わずに図を作成可能
- 動的なデータ対応：数値を変更するだけで即座に更新
- ドキュメントの一貫性：Markdown形式でコードと図を一元管理できる
- 視覚的にわかりやすい：チーム内の情報共有がスムーズに

# 最後に
今回アップデートでMarkdown AIは、より実務でも使いやすく進化しました！
技術資料や計画書を作成しやすくなったので、ぜひMarkdown AIでMermaid記法を試してみてください！

**【Markdwon AI公式ツール】**

https://mdown.ai/
さくらスタンダードで使える言語(2024/12/10現在)

さくらスタンダードで使える言語(2024/12/10現在)

・C/C++(gcc 9.4.0)
・PHP(8.3.8)
・python(3.8.12)
・perl(5.32.1)
・ruby(1.8.7)
・go(1.17.6)
・luajit(2.1.0-beta3)

ですよ
【Amazon Connect】自動インタラクション通話録音を試してみた

## 内容
Amazon Connectのリリースノートで「自動インタラクション通話録音」がリリースされたとの記載がありました。
本記事では「自動インタラクション通話録音」の設定方法と実際に試した内容を記載しています。

https://docs.aws.amazon.com/connect/latest/adminguide/monitor-automated-interaction-logs.html

## 結論
エージェントにつながるまでの間に、お客様の発話が録音されます。
IVRやBotでの対応以外でも録音されていました。
セキュリティプロファイルには「自動音声応答 (IVR) トランスクリプト（編集なし） 」とあるのですが、現状、文字起こしは確認できていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/74a56c84-4d1a-a7bb-7ab2-9e87299c6733.png)


## 設定

### 前提
自動インタラクション通話記録はContact Lensの機能の一部となるため、Amazon Connectインスタンスでの、Contact Lensの有効化が前提となります。

### インスタンスでの設定

該当のAmazon Connectインスタンスエイリアスをクリックする。
サイドバーで「問い合わせフロー」を選択する。
「Automated interaction logs」を有効化し、保存する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/8bb34600-a2c8-03a5-4d9d-200ae37dea54.png)


### フローでの設定

「記録と分析の動作」ブロックを追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/64cd22f3-eee6-9116-1e85-ac96cc5f91e1.png)

「自動インタラクション通話記録」をオンにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/c06271e2-999f-ea13-5e5a-483580c0efd8.png)

### セキュリティプロファイル（補足）

- 「自動音声応答 (IVR) 録音 (編集なし)」の権限を付与する
    - 「コンタクトの検索」画面で、録音を表示・再生できるようにする権限

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/61c9edb0-b40c-ec60-c82b-1881362cfb15.png)


## 動作確認

### 自動インタラクション通話記録で録音できる範囲

- お客様が電話をしてから、オペレーターにつながるまでのお客様の発話

### コンタクトの詳細画面

「自動インタラクション通話記録」を有効化していると、以下のような画面のUIになります。
録音が『自動インタラクション（IVR）』と『エージェントとのやり取り』に分割されます。

![スクリーンショット 2024-12-10 141412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/47f3a22b-3e09-041d-2b8e-e51dab6ec167.png)


### S3の出力

エージェントとのやり取りとほぞんされるバケットは同じですが、「ivr」というオブジェクトが作成されていました。
`
S3バケット/connect/<Amazon Connectインスタンスエイリアス名>
`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/bdc38b0a-cc2a-f020-5286-0592342a4912.png)

## まとめ

Amazon Connectの「自動インタラクション通話録音」がリリースされたので、試してみました。
この機能で、今までわからなかったIVR選択中のお客様の声が確認できるので、IVRの改善やフローの改善にも利用できそうです。
Livewire page component layout view not found: [components.layouts.app]

## 概要
最近、Livewireの画面を作っていて、いくつかの画面を作った後で、新たな画面を作ってみたら掲記エラーが出たので記しておきます。
## 解決した策
```shell:config/livewire.php（抜粋）変更前
    'layout' => 'components.layouts.app',
```
```shell:config/livewire.php（抜粋）変更後
    // 'layout' => 'components.layouts.app',
    'layout' => 'layouts.app',
```
## 経緯
resources/views/components/layouts/app.blade.phpが存在せず、
resources/views/layouts/app.blade.phpが存在していたので、
上のように変えたらエラーが出なくなりました。
この辺はデフォルトのまま使っていたような気がするんですけど。
NetSuiteの開発生産性向上chrome拡張機能：NetSuite Advanced Field Help

## はじめに

NetSuite開発及び利用において、私自身、他にもインストールしていますが、NetSuite開発の生産性に寄与するchrome拡張機能を今日は1つだけ、ご紹介します。

:::note info
これはほんの一部です。Chromeウェブストアで"NetSuite"と検索すると色々出てきますので、皆さんお試しください。
:::

:::note warn
　本投稿は、今回ご紹介した機能を完全に保証するものでは御座いません。実際の制約等は、拡張機能自身の説明にてご理解ください。
:::

# 1.NetSuite Advanced Field Help
  これは、標準のフィールドヘルプに対して、生産性向上に寄与する項目を追加する拡張機能です。私、ずっとこれをONにしてしまっていて、もう標準機能と思って使っていました。:sweat:
  というぐらいちょっとした便利機能ですので、是非使ってみてください。

  https://chromewebstore.google.com/detail/netsuite-advanced-field-h/ehgcekpdldhgfjpionbkilpnaahjiejj

#### Before(NetSuite標準)
　NetSuite標準ではフィールドIDとフィールド・ヘルプのみが記載されています。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114483/14565484-1096-1509-10ae-4726803c07f8.png)

#### After(拡張機能インストール後)
 フィールドをコピー出来るボタン、該当のレコードへ遷移出来るようにリンクがあったり、フィールド自体の必須化、非表示化などが出来るようになります。また、リストにおいてはフィールドヘルプ上ですべてのリストが参照及び指定をすることが可能です。フィールドヘルプ上に各リストの説明を記載しておけば、フィールドヘルプを閉じて、あれ？どれだっけ？という事は無くなりそうですね。
 
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114483/89c7f547-e836-2da7-bbef-f75ef8c0d9d0.png)

## さいごに
 冒頭でも述べましたが、NetSUiteを開発、利用する際に便利機能はまだまだ存在します。これを機に色々試してみてはいかがでしょうか？
Istio Ingress Gatewayへの負荷分散設定（OpenShift）

## 概要
OpenShift Service Mesh(2.5)環境下、Istio Ingress Gateway Podを3台で構成していたが、トラフィックが分散せず特定のPodに集中していたので調査。

## 結論
Gatewayで以下を仕込み、手前のRouterの負荷分散ロジックを指定して解消。
```
  annotations:
    haproxy.router.openshift.io/balance: roundrobin
```

## 詳細

### 構成
外部LBからpassthroughのrouter経由でIngress Gatewayに流している。

```mermaid
graph LR
    A[外部LB] --> B[Router]
    B --> C[Ingress Gateway Pod1]
    B --> D[Ingress Gateway Pod2]
    B --> E[Ingress Gateway Pod3]
```
ここで、ingressのトラフィックが全てPod1に集中していたので、つまりは手前のrouterの負荷分散設定の問題。

### 原因
router（haproxy）の負荷分散設定を確認するとsourceになっている。
```
$ cat /var/lib/haproxy/conf/haproxy.config
...
backend be_http:istio-system:istio-ingressgateway
...
  balance source
```
これだと、source IP毎に振り分ける挙動となり、LBのIPで判定して同じpodに振り続けてしまう。

### 対応
上述の通り、Gatewayリソースのannotationでrouterの負荷分散方法を指定することができる。
```
  annotations:
    haproxy.router.openshift.io/balance: roundrobin
```



尚、デフォルトは[routerがpassthorughだとsourceで他はrandom](https://docs.openshift.com/container-platform/4.17/networking/routes/route-configuration.html#nw-route-specific-annotations_route-configuration)の模様。



## 補足：DestinationRuleの流量制限への影響

追記予定
深い位置にある apk を探してインストールする

```shell
❯ find . -name "*.apk" | fzf | xargs adb install

Performing Streamed Install
Success
```

fzf て素晴らしいですね。

![fzf-preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/c1b5dd85-67be-3fe2-c8ee-0da4c6019e08.png)


# 🧑🏻‍💻 参考
https://android.benigumo.com/20241210/my_package_replaced/
DestinationRuleの流量制限の仕様

## 概要
OpenShift Service Meshでは、DestinationRuleを使って流量制限をかけることができる。その際の挙動はリクエスト元（downstream）のenvoyの台数に依存するので、調査。


## 詳細
以下の例だと、hogeサービスへの同時リクエスト可能数を1に絞っていて、それ以上リクエストがくると503が返される。
```
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: ratelimit
spec:
  host: hoge
  trafficPolicy:
    connectionPool:
      http:
        http2MaxRequests: 1
```
この設定はdownstream側のenvoy1台1台に個別に反映される。したがって、Ingress Gateway経由のトラフィックで、Ingress Gateway Podが2台に冗長化されている場合、以下のような挙動になる。
```mermaid
flowchart LR
    %% クライアントリクエスト
    Client["client"] -->|request1 OK| IGW1["Ingress Gateway Pod 1<br>http2MaxRequests: 1"]
    Client -->|request3 NG| IGW1
    Client -->|request2 OK| IGW2["Ingress Gateway Pod 2<br>http2MaxRequests: 1"]
    Client -->|request4 NG| IGW2
```
すなわち、http2MaxRequestsの設定値自体は1だが、実質2リクエストまで同時受付可能となる。
また、上の例はリクエストがラウンドロビンで均等に投げられているが、ソースIP毎など他の負荷分散方式になっていたり、複数システムでIngress Gatewayを共用している場合、厳密なコントロールが不可になるため、注意が必要。
ラムダ式

「ラムダ式とは」
デリゲートを使用して、メソッドのインスタンス化やをとにかく簡単に記述できるようにしたもの
（正直なんでも簡単にすればいいってわけじゃねーよ！って思いますよね...）

ラムダ式が開発される前までは、
デリゲートを使用して、引数に変数だけじゃなくてメソッドを入れたい
↓
デリゲートを使ったらメソッドの呼び出しを共通化できた！
↓
匿名メソッドを使って、メソッドの数を減らそう！（デリゲートを使って、インスタンス化と同時に処理も書いちゃう）
↓
ラムダ式でインスタンス化をもっと簡単にしよう！

これまでは（匿名メソッドまで）...
```
public delegate void MyDel(string message);

public static void Main()
{
 MyDel del = delegate(string message)
 {
  Console.WriteLine(message);
 };
 del("匿名メソッドの時代の書き方")
}
```

ラムダ式を使うと、メソッド名まで省略出来て、「=>」(goes to)を使って簡単に表せる
```
public delegate void MyDel(string message);

public static void Main()
{
 MyDel del = (message) =>
 {
  Console.WriteLine(message);
 };
 del("匿名メソッドの時代の書き方")
}
```

参考資料
https://af-e.net/csharp-how-to-use-delegates/
ClickUpを使って必要最小限のガントチャートを爆速で作成

## 1 \. タスクを洗い出す
+ 要件定義
* 設計
  + データベース設計
  + API設計
  + フロントエンド設計
+ 環境構築
  + バックエンド
    + Spring Bootプロジェクトを初期化
    + 必要な依存関係を追加 (Spring Web, Spring Data JPA, Spring Security, PostgreSQL Driver)
  + フロントエンド
    + Vue3プロジェクトを作成
    + Vuetifyをセットアップ
  + Docker
    + PostgreSQLコンテナをセットアップ
    + Spring BootとVueアプリをDocker化する
  + CI/CD
    + CodeBuild/CodeDeploy用の設定ファイルを作成
* 実装
  * バックエンド:
    * 認証/認可 (JWTトークンなど)
    * RESTful APIの実装
  * フロントエンド:
    * 認証フローの構築 (ログインフォーム)
    * 日記エントリのCRUD UIを作成
  * テスト:
    * APIテスト (PostmanやJUnit)
    * UIテスト (手動テスト)

+ デプロイ
  + Apacheを使用してバックエンドとフロントエンドをホスト
  + CodeBuild/CodeDeployでCI/CDパイプラインを設定し、自動デプロイを確認

* 改善と最終調整
  * バグ修正と最適化
  * ユーザーエクスペリエンス向上 (UI/UX調整)
  * セキュリティの確認 (XSS/CSRF対策など)


## 2 \. ガントチャートツールの選定
* 選定基準
  * 色々な選定基準があると思うが、個人開発であること・短期間であることから、簡単に使える・ドキュメントが豊富・無料で使えるという点を重視して選定


+  __ClickUp__ を使うことに決めた
   + ワークスペースを作成したらすぐにタスクが入力できる
   + タスクの内容も、あとで中身を編集できるが、ひとまずは１で洗い出したタスクをがんがん入れてく
   + 全部タスク入れたら納期を設定　大体の納期を入れる
   + 上部メニューからGanttを選ぶとガントチャートが見られるので、全体を見つつ納期を再度調整  
   + 機能はたくさんあるが、今回は急ぐのでとりあえずここまで。必要に応じて活用していこうと思う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951746/5f743e92-da99-8018-d2d5-4fab2cecbb53.png)
Unityのプロジェクトをバージョン管理する方法

**`UnityのProjectをバージョン管理する方法`**

Unityのバージョン管理には **`GitHubDesktop`** という
バージョン管理システムを使います
##
**`1`**
https://desktop.github.com/download/
にアクセスしてダウンロード、インストールしてください
##
**`2`**
GitHubDesktopを開きます
![GitHubDesktop_Home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945845/0113338d-995e-2086-746d-b475bc6242ca.png)
**`Create a New Repository on your local drive`**
をクリックします
![GitHubDesktop_Create repository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945845/50814087-56e3-a44f-d85a-5725d2bc9331.png)
##
**Name** : `Unityのプロジェクトの名前`
**Description** : 説明 （空欄可能）
**Local path** : `Unityのプロジェクトの場所を指定`
**Git ignore** : `Unityに指定`
**License** : そのまま

**`Create repository`** をクリックします
##
![GitHubDesktop_Publish repository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945845/89b12602-5bc4-4066-880f-dd7bbc03eaca.png)
**` Publish repository`** をクリックします
![GitHubDesktop_Publish repository2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945845/21fc2d49-d3de-c229-ce3b-a74c38723fa6.png)
**`Keep this code private`** にチェックがあり→非公開 なし→公開
**`Publish repository`** をクリック
##
**`3`**
Unityのプロジェクトの中まで移動する
![Exproler.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945845/36b6a409-1877-a2c8-7f67-07f1ae634fa7.png)
**`.gitignore`** を開きます
##
https://github.com/github/gitignore/blob/main/Unity.gitignore

アクセスし、全文 **`.gitignore`** にコピーして保存してください
##
**`4`**
![GitHubDesktop_Commit_.gitignore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945845/1e1ba750-a760-2dd6-76e1-60327abb5879.png)
GitHubDesktopに戻り、左下の **`Commit to main`** をクリックしてください
##
![GitHubDesktop_Push origin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945845/e10b9aaa-ea6d-5681-a875-19fb4ee1e09e.png)
Push originをクリックしてください
##
Unityのプロジェクトを編集したときに、
`GitHubDesktop`で **`Summary`** に題名を書いて **`Commit to main`** をください
そのあとに、**`Push origin`** をクリックしてください
メーカー、工場やレガシーな職場での今思うとヒヤリハットだったこと

今エンジニアとして働いており、はや数年ですが、一時期メーカーで働いていました。
メーカーで働いていた時のことを思い出すと、セキュリティインシデント発生の要因が多すぎることに気づきました。。。
少しレガシーな会社で働いていると気づきにくい、ヒヤリハットを紹介します。

今回は下記のアドベントカレンダーに参加しています。
発言は全て個人のもので所属する組織の見解ではありません。

https://qiita.com/advent-calendar/2024/netskope-2


----------------------------------------------------------------------------------------
## 想定するセキュリティインシデント
- 情報漏洩
- マルウェア感染
- サービス不能攻撃（DoS、DDoS、EDoS）
- 紛失、故障等

### 実際にあった怖い話

#### ▶さまざまなできごと

- 社内Wi-Fiを私用端末でもつなぎ放題（パスワードが公開されていた･･･！）
- 出張先ホテルや漫画喫茶のWi-Fiにつなげてもオッケー
- Googleなど個人のアカウントでログインできは
⇒GoogleDriveも入れたので、外部記録装置なくてもアップロード可能
- ソフトウェア何入れてもオッケー
- もちろん使用許諾は読まない
- 名刺管理ソフト、規約読まずオッケー

- ウイルス感染時の対策がされてない（ウイルスソフトは入ってたけど使える人が…）
- 情シスがいない
- 資産管理ソフトがないのでテレワークでサボり放題
- 個人宛にメール送り放題、個人からもメール送り放題
- 個人USBを挿すことができる
- 退職者のアカウントを消さない
- 退職者のPCを初期化しない

などなど…。


----------------------------------------------------------------------------------------
今思うと鳥肌ものですが、たぶんレガシーな会社はこんな感じだと思います。（すべてがそうとは限らないと思いますが…）
上に書いた出来事がみなさんにも当てはまりませんように…。
Google Play Billing Libraryを7.0に上げた時のまとめ

この記事は and factory.inc Advent Calendar 2024 の10日目の記事になります。

こんにちは！
and factoryでAndroidエンジニアをしている @igyaaaaです！
気づけばもう年末間近、部屋の大掃除タスクを溜め続けているうちに、だんだんと虚無感が増してきました。

さて、今回はGoogle Play Billing Libraryを7.0にアップデートした際のことを軽く共有したいと思います。

## 1. `enablePendingPurchases()` が非推奨に

これまで保留購入に対応するため、`BillingClient.Builder` の `enablePendingPurchases()` を使っていましたが、Billing Library 7.0以降では**非推奨**となりました。  

理由としては、7.0から定期購入でも保留状態がサポートされるようになったため、新しいパラメータ化されたメソッド `enablePendingPurchases(PendingPurchaseParams)` を使用する必要があります。

### 修正前後のコード

#### Before
```kotlin
BillingClient.newBuilder(this)
    .enablePendingPurchases() // Deprecated
    .build()
```

#### After
```kotlin
BillingClient.newBuilder(application.applicationContext)
    .enablePendingPurchases(
        PendingPurchasesParams.newBuilder()
            .enableOneTimeProducts()  // 一回限りのアイテムをサポート
            .enablePrepaidPlans()     // 任意: 定期購入の保留をサポートする場合
            .build()
    )
    .build()
```

### 補足
- **`enableOneTimeProducts()`**  
  通常の一回限りの購入アイテムをサポートします

- **`enablePrepaidPlans()`**  
  定期購入（特にプリペイドプラン）の保留にも対応したい場合に必要です

---

## 2. `queryPurchaseHistoryAsync()` が非推奨に

アプリ内で定期購入の履歴を取得するために `queryPurchaseHistoryAsync()` を使用していましたが、7.0以降は非推奨となりました。そのため、代わりに `queryPurchasesAsync()` を使うように変更しました。

### 修正前後のコード

#### Before 
```kotlin
billingClient.queryPurchaseHistoryAsync(SkuType.SUBS) { result, purchaseList -> 
    // ロジック
}
```

#### After
```kotlin
val params = QueryPurchasesParams.newBuilder()
    .setProductType(ProductType.SUBS)
    .build()

billingClient.queryPurchasesAsync(params) { _, purchasesList -> 
    // ロジック
}
```

### 注意点

#### `queryPurchasesAsync()` と `queryPurchaseHistoryAsync()` の違い
`queryPurchasesAsync()` では、以下の条件に該当するアイテムのみが取得できます

1. **保留中のアイテム**  
   - ユーザーが購入手続きを進めたが、完了していない状態のもの

2. **未消費の一回限りのアイテム**  
   - 例えば、消費型アイテム（ゲーム内通貨など）の購入が完了したが、アプリ内でまだ消費されていないもの

3. **有効期限内の定期購入アイテム**  
   - 現在アクティブな定期購入（期限切れでないもの）


#### 履歴が取得できないケース
- **消費済みのアイテム**  
  例: ゲーム内等の通貨を購入して消費済みの場合、履歴は取得されません

- **有効期限切れの定期購入**  
  有効期限が切れた過去の定期購入は含まれません

もし完全な購入履歴が必要な場合は、対応できないため、サーバーサイドで管理する必要がありそうです🤔

## まとめ
自分が直近で対応した箇所は上の通りですが、他にも定期購入の分割購入APIなど新しい機能が追加されているので気になった方はぜひ公式ドキュメントを参考にしてみてください！

 [Google Play Billing Library ドキュメント](https://developer.android.com/google/play/billing)
文字列を分割して配列にする

## `"fooxbarxbaz".split('x') `

RubyのString#splitメソッドの説明（日本語訳）
String#splitメソッドは、文字列を指定した区切り文字（field_sep）で分割し、その部分文字列の配列を返します。

### 基本構文
```ruby
split(field_sep = $;, limit = nil) -> 配列
split(field_sep = $;, limit = nil) {|substring| ... } -> self
```

- field_sep: 分割に使用する区切り文字
- limit: 分割する回数の上限を指定するオプション
- ブロック: 各部分文字列に対してブロックを実行することもできます

### 動作
- field_sepがnil（デフォルト）
デフォルト値であるnilの場合、空白文字（スペース、タブ、改行）で分割されます。

```ruby
    'abc def ghi'.split       # => ["abc", "def", "ghi"]
    "abc \t def \n ghi".split # => ["abc", "def", "ghi"]
```

- field_sepが文字列の場合
指定された文字列で分割され、末尾の空文字列は削除されます。

```ruby
    'abracadabra'.split('ab')  # => ["", "racad", "ra"]
    'aaabcdaaa'.split('a')     # => ["", "", "", "bcd"]
```

- field_sepが正規表現の場合
正規表現にマッチする位置で分割されます。正規表現にグループが含まれる場合、そのマッチも結果配列に含まれます。
```ruby
'1:2:3'.split(/(:)/)   # => ["1", ":", "2", ":", "3"]
'abracadabra'.split(/ab/) # => ["", "racad", "ra"]
```

- limitが指定された場合
    - 正の整数: 最大limit - 1回まで分割され、limit個の部分文字列を返します
    - 0または負の整数: 無制限に分割され、末尾の空文字列は保持されます

```ruby
'aaabcdaaa'.split('a', 2)  # => ["", "aabcdaaa"]
'aaabcdaaa'.split('a', -1) # => ["", "", "", "bcd", "", "", ""]
```

```ruby
'abc def ghi'.split(' ') {|substring| puts substring }

# 出力:
# abc
# def
# ghi
```

### 関連メソッド
- String#partition: 最初の区切り文字で分割し、3つの要素（前、区切り文字、後）からなる配列を返します
- String#rpartition: 最後の区切り文字で分割します
- 以上がString#splitメソッドの詳細な説明です
Python の非同期処理を安全に！async with cls._lock の基本と応用

# はじめに
こんにちは。推薦基盤ブロックの宮本です！（アドベントカレンダー2つ目の記事です）
最近 Python の `asyncio` を活用した非同期システムの設計と開発に携わりました。

非同期プログラミングでは、複数のタスクが並行して動作するため、競合状態やデータの整合性を確保する必要があります。その際に役立つのが、**ロック機構**です。Python の `asyncio` ライブラリでは、これを `asyncio.Lock` を通じて提供しており、非同期コンテキストで安全な操作を可能にします。

今日は `async with cls._lock` を活用してリソース競合を防ぐ方法と、その実装の工夫を紹介します！

# 課題
非同期プログラミングで頻繁に直面する課題として、複数のタスクが同じリソースにアクセスした際に起こる**競合状態**があります。たとえば、次のような状況です：

- 複数のタスクが同時にデータベースを更新し、データの不整合が発生する
- グローバルカウンタを同時に更新しようとして値が正しく計算されない
- I/O リソース（ファイルやネットワーク接続など）が不正に利用される

これらの問題を解決するために、**タスク間のアクセスを調整するロック機構**が必要です。`async with cls._lock` を使えば、これらの問題を簡単に解決できます！

# 解決策：`async with cls._lock` の活用

`async with cls._lock` を使用することで、非同期タスク間でリソースへの安全なアクセスを保証できます。以下に基本的な使い方のコード例を示します。

```python: sample1.py
import asyncio

class Counter:
    _lock = asyncio.Lock()
    _value = 0

    @classmethod
    async def increment(cls):
        async with cls._lock:  # ロックを取得
            cls._value += 1
            print(f"Counter updated to {cls._value}")

async def main():
    await asyncio.gather(
        Counter.increment(),
        Counter.increment(),
        Counter.increment(),
    )

asyncio.run(main())
```

```css: 出力結果
Value incremented to 1
Value incremented to 2
Value incremented to 3
```
### ポイント解説
1. ロックオブジェクトの作成
クラスレベルで `asyncio.Lock` を作成し、複数のタスクが同時に操作しないよう制御します。

2. `async with` によるロックの取得と解放
`async with cls._lock` を使うことで、ロックの取得から解放までを自動化できます。ブロックを抜けるときにロックが解放され、次のタスクが処理を続行できます。

3. タスクの安全性
ロックによって `cls._value` の更新が排他的に行われるため、値が不正になることを防ぎます。

# 応用：汎用性の高いロックの設計

タスク間のリソース競合を防ぐ場合、頻繁にロックを使うコードを書く必要があります。しかし、繰り返しのコードが増えるとメンテナンス性が低下します。この問題を解決するために、以下のような汎用的なロック処理を設計しました。

```python: sample2.py
class LockManager:
    _lock = asyncio.Lock()

    @classmethod
    def with_lock(cls, coro):
        async def wrapper(*args, **kwargs):
            async with cls._lock:
                return await coro(*args, **kwargs)
        return wrapper

class Counter:
    _value = 0

    @LockManager.with_lock
    async def increment(cls):
        cls._value += 1
        print(f"Counter updated to {cls._value}")
```

### 改良ポイント
1. デコレータの活用
ロック操作をデコレータに抽象化することで、コード量を削減しつつ、ロジックの明確化と再利用性を向上させました。

2. コードの保守性向上
ロックの管理ロジックが一箇所に集約されているため、変更が必要な場合にも容易に対応可能です。

# まとめ
本記事では、Python の非同期プログラミングにおける `async with cls._lock` の活用法を紹介しました。ロック機構を活用することで、競合状態を防ぎつつ効率的な非同期処理が可能になります。また、デコレータを活用することでコードを簡潔に保ちつつ、保守性と再利用性を向上させることができます。
非同期処理を活用する際は、こうした設計の工夫がプロジェクトの安定性や効率に大きく貢献します。これからも実務で役立つ Tips を随時紹介していきます！
匿名メソッド

匿名メソッド
名前を持たないメソッド。
デリゲートを使用してメソッドをインスタンス化することで、メソッドを別途記述しなくてもよくなる

これまでは...
```
public deligate void MyDeli(string message);

piblic static void Message(string message)
{
 Console.WriteLine("message");
}

public static void Main()
{
 MyDeli del = Message;
 del("匿名メソッド");
}
```

匿名メソッドを使用すると
```
public daligate void MyDeli(string message);

public static void Main()
{
 MyDeli del =  delegate(string message) // 匿名メソッド採用
{
 Console.WriteLine("message");
};
 del("匿名メソッド");
}
```
QSONについて

QSONはQuery String Object Notationの略で、HTTP GETリクエストのQuery Stringを構造化する目的で作られました。通常のQuery Stringはシンプルなキーバリューのペアしか表現できなく柔軟性がないです。QSONはQuery Stringで配列やオブジェクトなどのより複雑なデータ構造を表現するために作られたそうです。

# サンプル

## シンプルな例
まずはシンプルな例を示します。このJSONに対応するQSONは、

```
{
    "id": 3,
    "search": "test",
    "highlight": true
}
```

このようになります。

```
id=3&search=test&highlight=true
```

よく使うQuery Stringと同様の見た目です。

# オブジェクトや配列が含まれている例
オブジェクトや配列などの複雑なデータ構造を含んでいる例も示します。
このJSONは、

```
{
    "favcol": ["blue", "green"],
    "pets": {
        "cats": 3,
        "dogs": 2
    }
}
```

このようなQSONに変換されます。

```
favcol=(blue'green)&pets=(cats~3'dogs~2)
```

## より複雑なオブジェクト
最後により複雑な例も示します。

このJSONオブジェクトは、

```
{
    "a": [1, 2, 3],
    "b": {
        "d": {},
        "f": ["g", "h"]
    },
    "c": "true",
    "d": 4e-20,
    "e": ":-)"
}
```

このようになります。

```
a=(1'2'3)&b=(d~(~~)'f~(g'h))&c=_true&d=4e-20&e=%3A-!)
```

# QSONの表記
QSONは以下のような方法でオブジェクトをエンコードします。

- 配列やオブジェクトの要素は `'` で区切られ、オブジェクトのキーバリューは `~` で区切られます
- 文字列の `"true"` は `_true` とエンコードされ、ブール値の `true` はそのまま `true` とエンコードされます。これはfalseやnullも同様です
- QSONで特別な意味を持つ文字をエスケープするために `!` が使われます

出展: 

https://github.com/jan-niestadt/qson
@deno-types ではなく @ts-types を使いましょう

型が付いてないパッケージを Deno で使いたい場合に、使う側で型をあてるためのプラグマで、`@deno-types` というものがありました。

例えば、`npm:react` パッケージには型情報が同梱されていないため、以下のように単純に使うと全ての型が any になってしまいます。

```ts
import React, { useState } from "npm:react@^19.0.0";
// React と useState は any になってしまう
```

これに型をあてるためには以下のように記述します。

```ts:注意:古い書き方
// @deno-types="npm:@types/react@^19.0.0"
import React, { useState } from "npm:react@^19.0.0";
```

この記法を使うことで、`React` や `useState` に正しく型が付いた状態になります。

実はこの記法の代替記法で `@ts-types` というプラグマが Deno 1.43 から使えるようになっています (リリースブログでは記載が漏れてしまっていました)

```ts:最新の書き方
// @ts-types="npm:@types/react@^19.0.0"
import React, { useState } from "npm:react@^19.0.0";
```

この記法でも、`React` や `useState` に型が付いた状態になります。今後はこちらの `@ts-types` の方が推奨の書き方になります。

参考: https://docs.deno.com/runtime/reference/ts_config_migration/#providing-types-when-importing

`@ts-types` が追加されたモチベーションとしては、Deno が JSR に対応するにあたって、モジュール解決機能周りで `Deno` キーワードの利用を減らしたかったという事があったようです。

なお、公式ドキュメント上では、このコミットで、`@deno-types` が削除されて、`@ts-types` に書き変わっています。

https://github.com/denoland/docs/pull/502

実装的にはこちらの PR で `@ts-types` の扱いが追加されています

https://github.com/denoland/deno_graph/pull/444
エイリアスを使える

# エイリアスを使うことでより会話的な例を書くことができる
>Aliasing it_should_behave_like to it_has_behavior
Given a file named “sharedexamplegroup_spec.rb” with:
```rb
RSpec.configure do |c|
  c.alias_it_should_behave_like_to :it_has_behavior, 'has behavior:'
end

RSpec.shared_examples 'sortability' do
  it 'responds to <=>' do
    expect(sortable).to respond_to(:<=>)
  end
end

RSpec.describe String do
  it_has_behavior 'sortability' do
    let(:sortable) { 'sample string' }
  end
end
```
>When I run rspec shared_example_group_spec.rb --format documentation
>
>Then the examples should all pass
>
>And the output should contain:
```
String
  has behavior: sortability
    responds to <=>
```    

https://rspec.info/features/3-13/rspec-core/example-groups/shared-examples/#:~:text=Aliasing%20it_should_behave_like%20to,sortability%0A%20%20%20%20responds%20to%20%3C%3D%3E
PMPとPMI-ACPホルダーが語る：試験内容・難易度・実務での活用徹底比較

プロジェクトマネジメントの資格取得を目指している方の中には、PMP（Project Management Professional）とPMI-ACP（PMI Agile Certified Practitioner）のどちらに挑戦すべきか迷っている方も多いのではないでしょうか？  
この記事では、筆者が実際に両資格を取得し、それぞれの試験勉強や試験内容、さらに実務でどのように役立ったかを詳しくお伝えします。迷っている方の判断材料になれば幸いです！

---

## 筆者のプロフィール

筆者はIT業界歴20年以上。ウォーターフォール型プロジェクトのプロジェクトマネージャーとして13年間の経験を積んできました。主に大規模金融系プロジェクトに携わり、スケジュール管理やリスク管理のスペシャリストとして活躍しました。  
近年ではアジャイル開発に興味を持ち、スクラムマスターとして2年間、スタートアップ企業向けの新規プロダクト開発をリードしています。

PMPとPMI-ACPの両資格を取得した経験を基に、実務での活用方法や試験勉強のポイントを紹介します。

---

## 1. PMPとPMI-ACPの概要

### PMPとは？


[PMP](https://www.pmi.org/certifications/project-management-pmp)は、プロジェクトマネジメントの国際標準として広く認知されている資格です。  
PMBOK（Project Management Body of Knowledge）に基づき、計画、実行、監視、コントロール、終結といったプロジェクトのライフサイクル全体を網羅します。  
試験内容:
- **問題数**: 180問（選択式）
- **試験時間**: 230分
- **受験対象**: 一昔前はウォーターフォール型プロジェクトを中心に管理する方でしたが、現在はウォーターフォール型とアジャイル型のどちらにも対応できる方を対象にしているようです。

### PMI-ACPとは？

[PMI-ACP](https://www.pmi.org/certifications/agile-acp)は、アジャイルプロジェクト管理に特化した資格です。  
スクラム、カンバン、リーンなどのアジャイル手法を幅広くカバーしており、アジャイルの価値観や原則を実務に応用するスキルを評価します。  
試験内容:
- **問題数**: 120問（選択式）
- **試験時間**: 180分
- **受験対象**: アジャイル手法を活用するプロジェクトに関わる方

---

## 2. PMPとPMI-ACPの受験体験談

### PMP試験を受験して

私は大規模金融系プロジェクトの経験を活かし、PMBOK第5版を基にPMP試験に挑みました。試験勉強では以下の点が難しいと感じました。

- **問題文の長さ**: 問題文が長く、読解力と集中力が求められます。特に日本語版は独特の表現があり、正確な理解が必要でした。
- **時間配分の難しさ**: 230分という試験時間は一見長く感じますが、180問を解き終えると見直しの時間はほとんど残りませんでした。

### PMI-ACP試験を受験して

アジャイル開発の実務経験があったため、PMI-ACP試験はPMPと比べて取り組みやすいと感じました。ただし以下の点で注意が必要です。

- **幅広いアジャイル知識**: スクラムだけでなく、リーンやカンバンなど他のアジャイル手法についても問われます。
- **どちらとも取れる選択肢**: 問題文が短い一方で、曖昧な選択肢が多く、深い理解が求められました。

---

## 3. 使用した教材と勉強方法

### PMPの教材と勉強方法

- **参考書**:
  - [PMPパーフェクトマスター](https://www.amazon.co.jp/dp/479815745X): 分厚いPMBOKをコンパクトなハンドブック版にしたような参考書。こちらに気になるところ書き込みして鞄に入れてスキマ時間に勉強してました。
- **問題集**:
  - [PMP試験合格虎の巻](https://www.amazon.co.jp/dp/4872689720): 試験範囲を凝縮した問題集。実際の試験は2段階くらい難易度が高いですが、試験感覚を掴むにはちょうど良いかもです。

私は平日に通勤のスキマ時間、土日に2〜3時間、試験直前には5時間ほど勉強時間を確保し、模擬試験を繰り返しました。計画的な学習が合格のカギです。

### PMI-ACPの教材と勉強方法

- **参考書**:
  - [PMI-ACP試験パーフェクトマスター](https://www.amazon.co.jp/dp/4297107114): アジャイル知識を網羅的に学べる参考書。ただし知識ベースが多いので、考え方を学ぶにはほかの「アジャイルサムライ」などの技術書を読むと良い気がします。
- **問題集**:
  - [PMI-ACP Exam Questions 2025](https://www.udemy.com/course/pmi-acp-exam-practice-tests/): 出題形式がPMPっぽく長文が多いので実際のPMI-ACPとは異なる。ただし、解説が非常に詳細な問題集なので、正答だけでなく誤答まで理解すると合格ラインに近づけると思います。
  - [PMI-ACP Practice Exams](https://www.udemy.com/course/pmi-acp-practice-exams/): 試験直前の仕上げに利用した問題集。やや問題文がわかりにくい。解説も簡素だった。

私は2か月間、土日に勉強時間を確保し、特にアジャイルプラクティスや事例問題に重点を置きました。

---

## 4. 実務での活用法

### PMPが役立った場面

PMP資格は、大規模ウオーターフォール開発（200人月）プロジェクトでのプロジェクトマネージャー業務において非常に役立ちました。  
PMBOKで学んだ知識が、以下のような場面で活用できたと思います。

- **堅牢なプロセス管理**: リスク管理や品質管理の重要性を実感し、計画段階でのミスを最小限に抑えることができました。
- **共通言語の提供**: PMOや顧客とPMBOKをベースにした共通言語でスムーズに意思疎通が図れました。

### PMI-ACPが役立った場面

PMI-ACP資格は、アジャイル開発チームのスクラムマスターとしての実務で役立ちました。

- **柔軟なチーム運営**: スクラムイベントを活用してチームの自己組織化を促進し、短いスプリントで成果物を提供しました。
- **顧客価値の最大化**: プロダクトバックログを適切に管理し、顧客の優先度に応じて柔軟に対応しました。

---

## 5. まとめ

PMPとPMI-ACPは、それぞれ異なるプロジェクト管理手法に特化した資格です。  
ウォーターフォール型かアジャイル型か、あなたのキャリア目標に応じて選択してください。両方を取得すれば、プロジェクトマネジメントの幅が大きく広がります！
デリゲートの使用方法

そもそもデリゲートとは？

　デリゲートを使うと、引数や戻り値にメソッドを与えたり、簡単にインスタンス化することができます。
 
　これまでは...
 ```
 public static void SayHello(string name)
  {
   Console.WriteLine($"こんにちは、{name}さん。");
  }

  public static void main()
  {
   SayHello sayHello = new SayHello("太郎");
  }
```
  のようにして引数に、変数を格納していたが、デリゲートを使うと、
  
１．簡単なインスタンス化
```
public delegate void DeligateHello(string name);

  public static void Greet(string name)
  {
   Console.WriteLine($"こんにちは、{name}さん。"); //①
  }
  
  public static void Main()
  {
   DeligateHello del = Greet;
   del("太郎"); //①を実行
  }
```
２．メソッドを引数に渡す方法　
```
public deligate void DeligateHello(string name);

  public static void Greet(string name)
  {
   Console.WriteLine($"こんにちは、{name}さん。"); //①
  }

  public static void Execute(DeligateHello del, string name)
  {
   del(name);
  }

  public static void Main()
  {
   DeligateHello del = Greet;
   Execute(del, "太郎");
  }
```

  Point!
  ・まずは、デリゲートの定義（シグネチャ型）
  ex) public void deligate Deli(string message);
  ・参照したいメソッドをインスタンス化
  ex) Deli del = ShowMessage; ← ShowMessageメソッドをインスタンス化
  ・呼び出したい引数にデリゲートを渡す
  ＊デリゲートを引数に渡したメソッド内で、デリゲートを通して参照元のメソッドを呼び出すことでマップできる