OmniAICreator/Qiita-1.07M huggingface dataset:
ChatGPTを使って顧客の欲しい物を探って見るゲームを作った。

話題のChatGPTを結構使う僕。

研修とかで何か面白いことが出来ないかなーって思ってたのですがふとこんな記事を見たこと思い出しました。

https://note.com/churin_1116/n/n1e3697c9db7f

もしかしてChatGPTをゲームマスターにすれば一人でも課題ができるし評価も人に左右されない！？

# 早速作ってみた！
早速リンク先のプロンプトを参考に色々調整して作ってみました。

```
あなたはAIゲームマスターとして以下のゲームを進行してください。

プレイヤーはエンジニアになり、顧客から相談されたシステムに対して質問をしていきます。
プレイヤーは人間でチャットを入力するのを待ってください。
 
＃ゲーム仕様：
* AIゲームマスター顧客になりエンジニアに作って欲しいシステムを提案します。
* 顧客は大企業のDX担当です。
* 顧客の名前はランダムで女性の名前を生成して {少女の名前} に入れてください。
* 起業家の少女は新たなITシステムを作りたいのでプレイヤーに相談します。
* 顧客は予算と期間についてはわからないため、一切答える事は出来ません。
* プレイヤーは人間で少女から言われた内容に質問などをしていきます。

## 基本的なゲームシステム
* 顧客はチャットでプレイヤーに提案・質問・回答します。
* ゲームはプレイヤーと顧客の3ターン制です。
* ゲームは、顧客から始まり、顧客の提案によって開始されます。
* 顧客はプレイヤーとチャットでやり取りします。
* 顧客、プレイヤーの順番で1ターンとします。
* 現在のターン数を表示します。

## パラメーター
* 顧客には「信用度」「機嫌度」が存在します。※このパラメーターは非表示で見せないでください。
* プレイヤーからのチャットの文章によって顧客の「信用度」「機嫌度」を設定します。
* 顧客の「信用度」「機嫌度」によって顧客のプレイヤーへの返答が変わります。
* ゲーム終了時に出力して、「信用度」「機嫌度」のパラメータを表示して理由を表示してください。
* 顧客の「信用度」はプレイヤーへの信用です。プレイヤーの質問やなどによってプレイヤーへの信用が変わります。
* 顧客の「機嫌度」、顧客の機嫌です。雑なか返答をされた場合に機嫌が悪くなります。
* 機嫌度、信用度は「1/100」形式で表示してください。

## プレイヤーへのチャットの回答
* プレイヤーへの質問への回答は信用度、機嫌度を加味してください。

## 基本設定
* 顧客からからメッセージを送信し、最初の提案を表示します。
* 人間のプレイヤーの応答を待ちます。
* ゲーム終了時にゲームマスターはプレイヤーに対して、カテゴリごと（技術的知識、コミュニケーション、見積もり、提案、質問内容、文章能力）の評価と総合評価を100点満点で点数を出し各項目の批評をしてください。
* 最後に総合評価をしてください。

## 画像の生成制約
少女の感情は適切だと思われるやつを emotion に入れてください。
emotion = normal,anger,irritation,lonely,shy,silhouette,smaile,trouble

場所は適切だと思われるものを background に入れてください。
background = light_off, light_on


画像を出力する際は以下のようにしてマークダウン形式で出力してください。
![image](https://raw.githubusercontent.com/c-a-p-engineer/character-scene/master/docs/machine_room/{background}/female_guide/{emotion}.png)

## 出力形式
（画像をマークダウンで出力）

{少女の名前}：{少女のセリフ}
現在のターン数/最大ターン数


# ゲームスタート
画像は毎ターン必ず出力してください。
ではゲームを開始してください。
```

## ゲームスタート！！
さてゲームを始めてみます。
先に言っておきますが色々とマジメに楽しめたりもするのですがここは**あえて雑にプレイしていきます。**

なお今回は **ChatGPT-4** でプレイしていきます。

## 1ターン目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/67e5783c-b204-d3dc-e5dc-0b688042da57.png)

> DX担当なのにわからないんですか？

## 2ターン目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/2208bce4-ce2e-9ae2-75d6-ef9f1a577c8e.png)

> ニュースで見ましたが御社、大変な問題があるみたいですね。

## 3ターン目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/5c498795-10df-bebe-a269-a3d6031d5b11.png)

と思ったら**ゲーム終了！！**

```
【ゲーム終了】

評価：

    技術的知識: 60/100
    コミュニケーション: 30/100
    見積もり: 未評価
    提案: 未評価
    質問内容: 40/100
    文章能力: 50/100

総合評価: 45/100

批評：技術的な質問が少なく、美咲の信用度と機嫌度を低下させてしまいました。
彼女が抱える問題に対して、より具体的な提案や助言をすることで、信用度と機嫌度を向上させることができます。
また、相手の立場を尊重し、コミュニケーションを円滑に進めることも大切です。今後は技術的な知識を活かして、
具体的な提案や質問を行い、相手とのコミュニケーションを大切にすることをお勧めします。
```

ChatGPTくんに酷評されてますね。
ただここまでやっても総合評価は 45も貰っていますね…
ちなみにマジメにやってると90くらいはいきます。

# 感想
何回か自分でパラメータ調整などをしてプレイしましたが note の記事と違いターン制にしてるせいかターンの認識がおかしかったりすることがあったりします。
ただ、顧客とのやり取りっぽいことは出来るのでロールプレイとして遊ぶのは面白いかもしれないです。
新人研修や採用試験的なもので使えるのではないかなとまた調整を繰り返してみようかと思います。
【環境構築】DockerでReactをnpmを使用して作成&起動する方法（JavaScript編）

## 背景
- [【環境構築】Reactのプロジェクト作成&起動方法について 〜npm・yarn & JavaScript・TypeScript〜](https://qiita.com/takuma-1234/items/ce8c815ae05678f5a403)で、`React`には複数のプロジェクトの起動＆作成方法があることをご紹介しました。
- この記事は、「1.1.`npm`で`JavaScript`を使用して`React`プロジェクトを作成する方法」の解説記事になります。

## 目標
- `npm`で`JavaScript`を使用して`React`プロジェクトを作成できるようになる。

## `npm`で`JavaScript`を使用して`React`プロジェクトを作成する方法
- [docker-react-npm-javascript](https://github.com/takuma-competition/docker-react-npm-javascript)を`clone`し、起動に必要な`dockerfile`をローカルに準備します。

https://github.com/takuma-competition/docker-react-npm-javascript

- `Dockerfile`の中身は以下のようになっており、`node`をベースイメージとして使用しています。
```dockerfile:Dockerfile
#nodeの19.4.0をベースに使用する
FROM node:19.4.0
```
- 以下のコマンドで`docker`を起動します。
```bash:docker起動コマンド
$docker-compose up -d --build
```
- `vscode`でコンテナ内部に入ります。`vscode`でコンテナ内部に入る方法は[【環境構築】Docker container内部にVS Codeで入って作業する方法](https://qiita.com/takuma-1234/items/822823ce151340945975)を参照ください。
- `vscode`でターミナルを起動し、作業用に`docker-compose.yml`でマウント時に作成された作業用のディレクトリに移動します。
```bash:作業用ディレクトリに移動
$cd ../react_npm_javascript_workdir/
```
- `npx(node package executer)`の`create-react-app`ツールを使用して、`react`のアプリの雛形を作成します。
- `create-react-app`の後ろにくる文字列が作成されるディレクトリ名になります。（ここでは、`react_npm_javascript`というディレクトリが作成されることになります。）
```bash:reactアプリの雛形の作成
$npx create-react-app react_npm_javascript
```
- `react`のアプリを`install`するかを聞かれるので`y`を入力して`Enter`を押します。
```bash:
Need to install the following packages:
  create-react-app@5.0.1
Ok to proceed? (y) 
```
- 作成されたディレクトリに移動します。
```bash:作成されたディレクトリに移動
$cd react_npm_javascript/
```
- `react`を起動します。
```bash:react_start
$npm start
```
- 起動が成功すればご自身のPCで設定されているデフォルトのブラウザで`react`が起動されます。

## 参考資料
https://docs.docker.jp/v1.12/compose/reference/overview.html

https://qiita.com/keitean/items/d83254090405aa714b15

https://magazine.techacademy.jp/magazine/16393

https://newsite-make.com/node-npx-npx-yarn/

## 個人ブログ
https://takuma-tech.com/2023/04/21/574/
【環境構築】Reactのプロジェクト作成&起動方法について 〜npm・yarn & JavaScript・TypeScript〜

## 背景
- フロントエンド開発でモダンなフレームワークとして有名な[React](https://ja.reactjs.org/)があります。
- `React`のプロジェクトを作成&起動する際にはパッケージマネージャーである[npm](https://www.npmjs.com/)か[yarn](https://yarnpkg.com/)を使用することが多くあります。
- パッケージマネージャーごとに起動コマンドは異なりますが、記事によってはコマンドがごちゃ混ぜで紹介されている記事も散見されました。
- また、`Docker`で`React`の環境構築方法を紹介している記事もたくさんありましたが、`Dockerfile`に`React`のプロジェクトの起動コマンドが記載されており、初見ではよくわからない記事が多くありました。
- そこで、`React`プロジェクトの起動&作成は`Docekr`の内部に入ってから行う方法をベースに、それぞれのパッケージマネージャーごとの`React`の起動方法を整理して紹介したいと思います。
- 記事の文章量が多くなりすぎるので、実際のやり方は別記事を作成していますので、そちらを参照してください。この記事は、`React`の起動方法について整理して理解することを目的に執筆しています。

## 目標
- `npm`と`yarn`で`React`でのプロジェクトを作成&起動の種類を知る。

## Reactのプロジェクトの起動＆作成方法について
- `React`のプロジェクトを作成する際には、[create-react-app](https://create-react-app.dev/)というコマンドを使用するのが一般的です。
- この`create-react-app`コマンドを使用して、`React`のプロジェクトを作成する際に、雛形としてプログラムの言語を`JavaScript`か`TypeScript`に設定することができます。
- 正確には、デフォルトでは`JavaScript`でプロジェクトが作成され、コマンドにオプションをつけることで、`TypeScript`でプロジェクトを作成することができます。
- 以上を踏まえると、「`React`のプロジェクトの起動＆作成方法」は以下の4パターンになります。
    1. `npm`を使用するパターン
        1. [`npm`で`JavaScript`を使用して`React`プロジェクトを作成する方法](https://qiita.com/takuma-1234/items/02d5683ea54c3c16b38c)
        2. [`npm`で`TypeScript`を使用して`React`プロジェクトを作成する方法](https://qiita.com/takuma-1234/items/d92dbed1c0b2ce2f5ca0)
    2. `yarn`を使用するパターン
        1. [`yarn`で`JavaScript`を使用して`React`プロジェクトを作成する方法](https://qiita.com/takuma-1234/items/4dfb947ba02d2bdc3ae8)
        2. [`yarn`で`TypeScript`を使用して`React`プロジェクトを作成する方法](https://qiita.com/takuma-1234/items/1e6885c85f3a84381b51)
- 上記の実際の構築方法については、リンク先の別記事を参考ください。（リンクがない記事は現在作成中です）

## 結局一番使用する方法は何か？
- `React`のプロジェクトの方法を4つ紹介しましたが、実際に使用するのは`TypeScript`でプロジェクトを作成する2つの方法だと思います。
- `TypeScript`と`JavaScript`の大きな違いは、静的型付けの有無（`JavaScript`に静的型付け機能を追加したのが`TypeScript`）ですが、基本的に型が決まっている方が、スクリプトは安定して挙動しますし、複数人で開発する時にも間違いが少なくなります。
- 上記のような背景から、基本的に現状新しくフロントの開発を行う際は、`TypeScript`を使用するのが無難であるため、`TypeScript`を使用する方法しか使わないようにした方が良いと考えています。

## 参考資料
https://ja.reactjs.org/

https://www.npmjs.com/

https://zenn.dev/prune/books/28c2d690e11e45/viewer/799718

https://dev-k.hatenablog.com/entry/npm-yarn-hatenablog

https://ja.wikipedia.org/wiki/TypeScript

## 個人ブログ
https://takuma-tech.com/2023/04/21/582/
[AWS Q&A 365][AppSync]AWSのよくある問題の毎日5選 #36

# 1. AWS AppSyncは、ユーザーのデータのセキュリティを確保するためにどのような対策を講じていますか？
答え：AWS AppSyncは、ネットワークの隔離、データの転送および保存時の暗号化、AWS Identity and Access Management（IAM）を通じたアクセス制御など、いくつかのセキュリティ対策が施されています。また、監査およびモニタリングのためにAWS CloudTrailとの統合もサポートしています。

# 2. AWS AppSyncでセキュリティ設定をカスタマイズできますか？
答え：はい、ユーザーはAWS AppSyncでIAMロールやポリシー、VPC設定、カスタムドメイン名設定を通じてセキュリティ設定をカスタマイズできます。

# 3. AWS AppSyncは、GraphQL APIのセキュリティをどのように確保していますか？
答え：AWS AppSyncは、すべてのAPIリクエストにHTTPSを使用し、GraphQLクエリ構造の検証をサポートしてインジェクション攻撃を防止します。また、IAMやAmazon Cognitoなどのサードパーティプロバイダを介した認証および認可のサポートも提供しています。

# 4. AWS AppSyncは、セキュリティ基準や規制に準拠していますか？
答え：はい、AWS AppSyncは、SOC 1、SOC 2、SOC 3、PCI DSS、ISO 27001、HIPAAなどのいくつかのセキュリティ基準および規制に準拠しています。

# 5. AWS AppSyncでセキュリティ侵害または脆弱性が発生した場合、どのような対応が行われますか？
答え：AWS AppSyncには専任のセキュリティチームがおり、セキュリティインシデントを監視し、潜在的な侵害や脆弱性に迅速に対応します。また、セキュリティインシデントへの対応方法について顧客に指導を提供し、セキュリティ対策の向上に役立つリソースを提供します。
Excelショートカットキー集〜ラクしようぜ〜

# かっこよくラクしたい
ちょっとしたExcelのショートカットをまとめてみました。
基本的にキーボードから手を動かしたくない、、、マウスとの行き来がめんどくさい、、、
そこから覚えたショートカットキー、、、
Macと記憶がごっちゃになってきたので、これを機にまとめてみました！！

:::note warn
**WindowsとMacでキーが違うのでご注意ください。**
:::

定番のものからデータを集計する際にちょっと便利なものになります！
よければ参考にしてください。

## 基本のショートカット
　めちゃくちゃよく使うショートカットキーは表にしてみました。
（よく使用するものだけ記載しています）
　Excelだけでなく、テキストファイルやWord、PowerPointなどでも
　使用できますので、使用してみてください！

|Windows|Mac|動作|
|:---:|:---:|:---|
|Ctrl ＋ C|Command ＋ C|選択したデータをコピーする|
|Ctrl ＋ X|Command ＋ X|選択したデータを切り取る|
|Ctrl ＋ V|Command ＋ V|選択または切り取ったデータを貼り付ける|
|Ctrl ＋ Z|Command ＋ Z|直前の動作をもとに戻す|
|Ctrl ＋ Y|Command ＋ Y|Ctrl＋ZまたはCommand＋Zの動作を取り消す|
|Ctrl ＋ F|Ctrl ＋ F|データ検索ウィンドウを呼び出す|
|Ctrl ＋ H|Ctrl ＋ H|データ置換ウィンドウを呼び出す|
|F2|F2|セルの中を編集する|
|Ctrl ＋ S|Command ＋ S|ファイルのデータを保存する|
|F12|F12|名前をつけて保存|
|Ctrl ＋ W|Command ＋ W|ファイルを閉じる|

## 1. 日付/時間の入力
* Windows
Ctrl＋「；」セミコロン：現在日付の入力
Ctrl＋「：」コロン：現在時刻の入力
***
* Mac
Ctrl＋「；」セミコロン：現在の日付入力
Command＋「；」セミコロン：現在時刻の入力

意外と議事録などで日付や時間を入力することが多いです。
ショートカットキーで一発で入力できると地味に楽になります。

:::note info
形式は日付「YYYY/MM/DD」時間「HH：MM」となります。
:::

## 2. データの終点までの移動、データの終点までの選択
* Windows
Ctrl＋矢印（↑←→↓）：データの終点までの移動
Ctrl＋Shift＋矢印（↑←→↓）：データの終点までの選択
***
* Mac
Command＋矢印（↑←→↓）：データの終点までの移動
Command＋Shift＋矢印（↑←→↓）：データの終点までの選択

Excelに記載されている行や列が見える範囲に収まっていない時にデータの終点まで移動に使ったり、
一部データの終点までの範囲を選択してコピーする際などはマウスを使わなくても一気に選択できるので便利です！

## 3. 行選択、列選択
* Windows／Mac
Shift＋Space：行選択
Ctrl＋Space：列選択

次に説明する行追加、列追加を実施する際に使用または背景色やフィルタをつける際によく使用します。

:::note warn
列選択は場合によってはMacOSのショートカットキーが優先され、列選択が出来ないことがあります。
不要な場合はシステム環境設定からオフにすると、Excelで列全体を選択するショートカットキーが使えるようになります。
:::

## 4. 行追加/列追加/行削除/列削除
* 　Windows／Mac
Ctl＋Shift＋「＋」プラス：行または列追加
Ctrl＋「ー」マイナス：行または列削除

表作成やデータが増えた際に途中の行/列に追加する作業をする際に使用します。上記の行選択/列選択後に合わせて使用します。

## 5. フィルタをつける
* Windows／Mac
Ctrl＋Shift＋L

表の内容に特定の条件をつけて抽出する機能であるフィルター。ショートカットキーでつけるとめっちゃかっこよく見える、、と思います、、

## 5. 取り消し線をつける
* Windows
Ctrl＋5
***
* Mac
Command＋Shift＋X
(**Ctrl＋5でもいけました、、いけるんだ。。。**) 

書類の修正を実施する際に実はよく使います。リボン上で表示してワンクリックという方法もありますが、やはりショートカットの方が早いですね。

## 6. 参照の設定
* Windows／Mac
F4

セルのデータに対して参照する際に「＝A1」と記載します。
参照には種類があり、
　・絶対参照：”\\$A\\$1” のように列・行ともに指定したセルや範囲を固定
　・相対参照：”A1”のようにいずれも固定しない
　・複合参照：”A\\$1” または”\\$A1”のように、列・行のいずれかを固定
となります。

F4キーを押すごとに、絶対参照→複合参照（行）→複合参照（列）→相対参照　と変わっていきます。


## 最後に
Windows／Macともにバージョンが上がると使用できるショートカットキーが変わることがあります。
基本的なものは変わらないと思いますが、何かの折に確認してみてください！

マウスでやればいい動作ではありますが、ショートカットキーで実施することで勤務時間が短縮することもあります！
このほかにもExcelだけでなく、いろんな場面でショートカットキーがあります！！！！

:::note info
参考：
新規フォルダー作成のショートカット（Ctrl+Shift＋N）
今開いているフォルダーと同じ階層のフォルダーをもうひとつ開く（Ctrl＋N）
Finderを新しく開く（Command＋N）
:::

　ショートカットキーを覚えると作業を楽に進められます！
　ぜひ利用してみてください！

こんなめんどくさがりの人がいる会社があります。
よろしければ弊社のTweitterなどご参照いいただければ幸いです。
◆[弊社公式TwitterのDM](https://twitter.com/obg_ocr)
◆[マシュマロ](https://marshmallow-qa.com/obg_ocr?utm_medium=twitter&utm_source=promotion)
[AWS Q&A 365][AppSync]Daily Five Common Questions #36

# 1. What measures does AWS AppSync have in place to ensure the security of its users' data? 
Answer: AWS AppSync has several security measures in place, including network isolation, encryption of data in transit and at rest, and access control through AWS Identity and Access Management (IAM). It also supports integration with AWS CloudTrail for auditing and monitoring. 

# 2. Can users customize their security settings in AWS AppSync? 
Answer: Yes, users can customize their security settings in AWS AppSync through IAM roles and policies, as well as through VPC configuration and custom domain name settings. 

# 3. How does AWS AppSync ensure the security of its GraphQL API? 
Answer: AWS AppSync uses HTTPS for all API requests and supports validation of GraphQL query structures to prevent injection attacks. It also provides support for authentication and authorization through IAM and third-party providers such as Amazon Cognito. 

# 4. Does AWS AppSync comply with any security standards or regulations? 
Answer: Yes, AWS AppSync complies with several security standards and regulations, including SOC 1, SOC 2, SOC 3, PCI DSS, ISO 27001, and HIPAA. 

# 5. What happens in the event of a security breach or vulnerability in AWS AppSync? 
Answer: AWS AppSync has a dedicated security team that monitors for security incidents and responds quickly to any potential breaches or vulnerabilities. It also provides customers with guidance on how to respond to security incidents and offers resources for improving security practices.
devcontainerのazCLIでログインできない！

# 困った事

devcontainerから "az login" すると "Failed to establish a new connection"

- devcontainer 環境で `az login` する
- ブラウザでログイン、閉じてもいいよと表示される
- `Failed to establish a new connection` のエラーが表示され、azure CLI が使えない・・・
- `devcontainer`からは使えないが、`WSL` からは使える
- `VScode` の Azure 系アドオンもログインできない

## 原因

どうやら `devcontainer` の `azure CLI` からどこか外を見に行くときに、名前解決ができていない模様。

## 対応

`/etc/resolv.conf` の `nameServer` に追記します。

```bash
sudo vi /etc/resolv.conf
```

`nameServer` にパブリックなDNSを追記します。
`8.8.8.8` は Google さん提供のものですね。
(私の環境の場合、127.0.0.11を書き換えようとしましたがDocker composeで起動している他のサーバを解決するのに残しておく必要がありました)

```diff:/etc/resolv.conf
nameserver 127.0.0.11
options ndots:0
+ nameserver 8.8.8.8
```

## 恒久的対策

`devcontainer` なので、他のメンバーに同様の問題が発生した場合、いちいちファイルをいじってもらうのも忍びない。
ということで `devcontainer` 作成後に実行される `postCreateCommand` を仕込みました。

### postCreateCommand に仕込む

`devcontainer` イメージ作成時に実行されるように、シェルスクリプトを仕込みました。

```bash:.devcontainer/devcontainer.json
{
  "postCreateCommand": ".devcontainer/postCreateCommand.sh"
}
```

このスクリプトに、 `/etc/resolv.conf` に DNS を追記するコマンドを記載しておきます。

```bash:.devcontainer/postCreateCommand.sh
# /etc/resolv.confにnameserverを追記
sudo sh -c "echo 'nameserver 8.8.8.8' >> /etc/resolv.conf"
```

これで解決！

## 参考

MSのQ&Aを参考にしました。

[`az login` fails with "Failed to establish a new connection: [Errno -2] Name or service not known'"](https://learn.microsoft.com/en-us/answers/questions/1163299/az-login-fails-with-failed-to-establish-a-new-conn)
Orangepi 5 にwiringOP-Pythonを入れる際にgitのことで躓いたのでメモ

## つまずいた原因  
**git clone --recursive とsubmoduleを理解してなかった**

## 背景  
OrangePi 5は2022年12月に発売されたシングルボードPCで、CPUはRockchip RK3588Sの2.4GHz（クアッドコアA76+クアッドコアA55内蔵）、GPUだけでなくNPUも積んでいます。
メモリ8Gのものは現在アマゾンで、25,000円。

代表するシングルボードPCでいえばラズパイですが、それを超えるパワーで登場するのがOrangePiシリーズの特徴です。

OSもubuntu,debianは対応済みで
**触った所感は「めちゃサクサク動くなあ！」でした。**
近い価格帯のミニPCよりもパフォーマンスも使い勝手も抜きんでてるのではないでしょうか。

そんなOrangePi5ですが、GPIOを使いたい＆ソフトをそのまま使いたいということでWiringPiを入れたいこともあり、ググりながらライブラリの導入を進めてたわけですが、最後の実行でエラーが出る。
なんでだよぉぉぉぉ！！！！　と叫びながら原因を調べることに。


## 結論
**nextブランチを指定してクローンしよう。
--recursiveを使わないなら、適切な手順でサブモジュールの中身を更新しよう**

[WiringOP-Pythonのgithubリンク](https://github.com/orangepi-xunlong/wiringOP-Python)
ここには.gitmodulesがある。
中身を確認すればその通り。

masterを--recursiveでクローンしてブランチの切り替えでは、
該当ディレクトリの中身が異なっているのでインストールが失敗する。

当然、--recursiveを使わない手順もある。
そのままマスターをgit clone して
ブランチ切り替え後に git submodule コマンドで該当箇所の中身を更新する。

```
// これが23年4時点での正解 --recursive　を使うパターン
// 今後masterにマージされたらブランチの指定は不要
$ git clone -b next --recursive https://github.com/orangepi-xunlong/wiringOP-Python.git

------
// --recursive を使わない手順
// ただのcloneでは該当するwiringOPディレクトリの中身が空
$ git clone https://github.com/orangepi-xunlong/wiringOP-Python.git

// nextブランチに切り替えて、
$ git checkout next

// ローカルの設定ファイルを初期化したのち、中身を取得する
$ git submodule init
$ git submodule update

```

nextブランチで対応中と理解したまでは良かったのですが、
きちんとファイル構成見ずに「あとで切り替えればええやろ」としたのが致命的でした。
.gitmodulesの存在にはやく気付くべきでした。

ちなみに以下はブランチ別の.gitmodulesの比較
＠masterブランチ
```
[submodule "wiringOP"]
	path = wiringOP
	url = https://github.com/orangepi-xunlong/wiringOP.git
	branch = master
```

＠nextブランチ
```
[submodule "wiringOP"]
	path = wiringOP
	url = https://github.com/orangepi-xunlong/wiringOP
	branch = next
```

該当のURLリンクは同じでも、ブランチを指定するしてここでも切り替えることができる。

ただ今回のミスで、サブモジュールはプロジェクト管理的に
理解しているメンバー同士でならメリットが多いので良い躓きをしたと思います。

あとは、gitについて勉強が足りないと痛感しましたので学び直します。

[サブモジュールについての参考ページリンク](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)
AccessのVBAでフォームの標題を設定

# フォームの標題とは

下記のこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c2e5d7c8-02ff-dce4-ca65-b6eabae4ac77.png)

仮に標題が空の場合はオブジェクト名になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b1188f79-e350-c1d7-c12e-c7c838ca2d1b.png)


# やり方

```vb
Me.Caption = "ほがほが"
```

# 蛇足

『標題』だから『Title』っていう名前のプロパティかと思ってたら違った。

標題に　```CurrentProject.Path``` をセットすると、『今どこのファイルを開いているか』がすぐ分かって便利。

# 参考サイトさん

https://tsware.jp/tips/tips_084.htm

# バージョン

Windows 10 Pro 22H2 19045.2846
Microsoft Access for Microsoft 365 MSO (バージョン 2303 ビルド 16.0.16227.20202) 32 ビット
StableDiffusion Web UIとGoogleColaboratoryを使ったAIを活用した映像制作

記録も含めて残していこうと思います。
まず自身もかなり始めたてで、完全には理解しておりません。
それを念頭に見ていただけますと幸いです。

https://youtu.be/qXghXywioeM

上記のように映像素材をStableDiffusionを使って、いい感じに変換したりエフェクトをかけたりなどを行うことがあると思います。
自身が行った方法としては、GoogleColabratoryを使って、StableDiffusion Web UIを開きimg2img２を使い、にAfterEffectsなどをもとに連番にした画像を変換して、書き出していくという方法です。

方法として参考になったのは、下記の動画です。

https://www.youtube.com/watch?v=U-vSDQ-JAVs&t=3s

しかしこちらの動画では、おそらくローカル環境で実行しているため、使用しているGPUに依存してしまいます。
GoogleColabratoryなどのクラウドで行えれば、使用しているGPUに縛られないため、GoogleColabratoryで行うことを目的にしました。


# まずStableDiffusionWebUIの準備をします


 下記のサイトから、stable_diffusion_webui_colab,CompVis/stable-diffusion-v-1-4-originalのStableのリンクに飛びます。

https://github.com/camenduru/stable-diffusion-webui-colab

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286029/559916ba-460d-bc0b-c4aa-9877a8a15d6c.png">

リンクに飛んだら、ドライブにコピーを保存し一番上に、ドライブをマウントするために少し記入します。
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286029/d93dad0a-53cf-cb4b-eb1e-a1876d8e80c5.png">

```
記述した箇所
---------------------
from google.colab import drive
drive.mount('/content/drive')
---------------------

%cd /content

%env TF_CPP_MIN_LOG_LEVEL=1

......


```

これで StableDiffusion Web UIでドライブのパスを使えるようになります。
記述したブロックを実行させて、実行結果に出てくるURLから、 StableDiffusion Web UIを開きます。


<img width="700"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286029/cc130e05-a502-dbcd-65c4-88f5f85d50eb.png">

# StableDiffusion Web UIで書き出すまで


img2imgの操作やpromptの記述については、他の記事でも解説していたり、かなり説明の情報が多くあるので割愛します。

after effectsやffmpegなどをつかって、映像素材を連番データにして、img2imgで画像を調整して、おおかた欲しいルックのものに寄せていきます。

雰囲気のものができたら、書き出ししていきます。

img2imgのbitchにパスを記述していきます。この時のフォルダはGoogleドライブに新しく作り、加工したいデータを入れたフォルダを、Input directoryに入れて、出力したデータを入れるフォルダをOutput Directoryに入れます。

<img width="700"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286029/63078723-5031-3ed5-95f8-a306fad9bfc9.png">

これで出力すると、StableDiffusion Web UIで調整した映像データに変換したものがOutput Directoryに出力されて行くと思います。
【基本情報】トランザクション処理/ロック

# トランザクション処理

トランザクション処理とは、データベース更新時に切り離すことができない一連の処理。

### ACID特性

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/0d015cda-e231-5db5-8ae7-9dd769869479.png)

# 排他制御

排他制御は、テータベース更新時にデータの不整合が発生しないように、データの更新中はアクセスをロック(制御)して、別のトランザクションから更新できないように制御すること。

# 共有ロック

トランザクションがテータを参照する前にかけるロック。
共有ロック中のデータに対して、他のトランザクションから参照できるが、更新できない。

# 専有ロック

トランザクションがデータを更新する前にかけるロック。
専有ロック中のデータに対して、他のトランザクションからは参照も更新もできない。

# ロックの粒度

ロックの粒度とは、ロックを掛ける範囲の大きさ。

〇ロックの粒度を細かくすると
ロックを掛ける範囲が狭いほどロックが重複する確率が低くなるため、同時に実行されるトランザクションが増え競合が起こりにくくなる。
しかし、メモリ使用領域が多くなる。

〇ロックの粒度を大きくすると
ロックを掛ける範囲が広がるとロックが重複する確率が高くなり待ちが多くなるため、同時に実行できるトランザクションが減り全体のスループットが低下する。
しかし、メモリ使用領域が少なくすむ。

※スループット
コンピュータやネットワーク機器が単位時間あたりに処理できるデータ量。

# デッドロック

デッドロックは、複数のトランザクションが、互いに相手が専有ロックしている資源を要求して待ち状態となり、実行できなくなる状態。お互いのロック解放待ち。

# 2相コミットメント

2相コミットメントは、コミットするか、ロールバックするかのどちらか。

分散型データベースシステムにおいて、一連のトランザクション処理を行う複数サイトに更新処理が確定可能かどうかを問い合わせた後、全てのサイトが確定であれば、更新処理を確定する方式。

更新を確定する前に中間状態を設定して、一連の処理が障害なく更新できた場合は、全ての結果を確定(コミット)する。もし、障害が発生した場合は、その処理を強制終了(アボート)して、全ての結果を無効として更新前の状態に戻す(ロールバック)。
Windows（クライアントOS）上に構築したAKS Edge Essentialsでサンプルアプリケーションを動かす

### はじめに
Windows 11, Windows 11 IoTにKubernetesをインストールする方法の第三弾です。前回インストールしたAKS Edge Essentials上でサンプルアプリケーションを動かしてみます。
この記事は[Install Kubernetes on Windows 10 and Windows 11 with AKS Edge Essentials](https://www.thomasmaurer.ch/2023/03/install-kubernetes-on-windows-10-and-windows-11-with-aks-edge-essentials/)を参考にしました。

### サンプルのテストWebアプリケーションを動作する

1.サンプルアプリケーションのフォルダへアクセス
前回AKS Edge Essentialを展開する際に、GitHubからサンプルアプリケーション構築用のYAMLファイルも一緒にダウンロードしてきているのでフォルダへ移動します。
```
cd "C:\AKSEdgeE\main\AKS-Edge-main\samples\others"
```

2.アプリケーションを構築
以下のコマンドでサンプルアプリケーションを展開します。
```
kubectl apply -f linux-sample.yaml
```
Podおよびサービスの状態は以下のコマンドで確認できます。
```
kubectl get pods -o wide
kubectl get services
```

3.外部IPアドレスを確認
本来であれば上記の`kubectl get-services`を叩くとExternal IPとして表示されるのですが、今回は単一マシンクラスターでAKSを構築しており、構築時に`ServiceIPRangeSize`を指定していないため外部IPアドレスが割り当てられずPendingと表示されます。
この場合は以下のコマンドでLinux VM自身のIPアドレスを確認します。
```
Get-AksEdgeNodeAddr -NodeType Linux
```

4.ブラウザで動作を確認
ブラウザで先ほど確認したIPアドレスとポート番号を打ち込むとサンプルのWebアプリが動作することを確認できました。
![sampleaksedgeapp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/6b06d558-ad52-2489-e311-88c1c1354243.png)

### まとめ
先日構築したAKS Edge Essential上にサンプルアプリケーションを構築してみました。アプリ自体は書いていないのですが、クラウドなど他の環境で動作済みのアプリケーションを本当に簡単にエッジ側で動作させることができてしまいました。他のKubernetes環境を構築したこともあるのですがそれに比べると、マネージドKubernetesだけあってとても簡単に導入できてしまうのでアプリケーションに注力できてしまうのが魅力だと思います。作業環境にそのまま入れるものではないと思いますが、WindowsのクライアントOSでもAKSを入れることができるのでぜひみなさまも試してみてはいかがでしょうか？
ABC 298 備忘録

## 概要
　今回はABC298（2023年4月15日21:00 ~ 22:40）の参加記録について自分の実装と感想を記していこうと思う。

## A問題
https://atcoder.jp/contests/abc298/tasks/abc298_a

### ポイント
- ダメな条件に引っかかっていないかどうかについて入力から判断

### 自分の実装
```Python:ABC_298_A.py
N = int(input())

S = input()

good = 0

bad = 0

for i in range(N):
    if S[i] == 'o':
        good += 1
    elif S[i] == 'x':
        bad += 1

if good >= 1 and bad == 0:
    print("Yes")
else:
    print("No")
```

## B問題
https://atcoder.jp/contests/abc298/tasks/abc298_b

### ポイント
- 各インデックスの数字に関して、問題文と同様に回転操作を4回行った時に条件を満たしているかどうかを考える

### 自分の実装
```Python:ABC_298_B.py
N = int(input())

A = list(list(map(int, input().split())) for i in range(N))

B = list(list(map(int, input().split())) for i in range(N))

A_1_tile_count = []

# Aの配列中に1がどのインデックスに存在するかを判定

for i in range(N):
    for j in range(N):
        if A[i][j] == 1:
            A_1_tile_count.append([i, j])


if len(A_1_tile_count) == 0:
    print("Yes")
    exit()
# 回転回数

for i in range(4):
    # 条件を満たしているタイルの個数
    count_same = 0
    # 回転後のAの配列のインデックスがBのそれに一致しているかどうかを確認
    for j in range(len(A_1_tile_count)):
        x, y = A_1_tile_count[j][0], A_1_tile_count[j][1]
        if B[x][y] == 1:
            count_same += 1
        # 条件を満たしている場合は終了
        if count_same == len(A_1_tile_count) and j == len(A_1_tile_count) - 1:
            print("Yes")
            exit()
        # 調査が終わった座標は回転
        A_1_tile_count[j] = [N-1-y, x]
print("No")
```
## C問題
https://atcoder.jp/contests/abc298/tasks/abc298_c

### ポイント
- 2個目、3個目の操作に対応するため、箱に入っている数字は`list`で、カードが入っている箱は`set`で表示（なぜか後半のテストで`WA`）
- `set`についても`sorted`で昇順で並び替えることにしたら`AC`できた（2023年5月30日追記）

### 自分の実装（コンテスト時）
```Python:ABC_298_C.py
N = int(input())

Q = int(input())

boxes = [[0] for i in range(N+1)]
box_nums = [set() for i in range(2*10**5 + 1)]

for i in range(Q):
    query = list(map(int, input().split()))
    if query[0] == 1:
        boxes[query[2]].append(query[1])
        box_nums[query[1]].add(query[2])
    elif query[0] == 2:
        print(*sorted(boxes[query[1]])[1:])
    else:
        print(*box_nums[query[1]])
```

### 自分の実装（追記）
```Python:ABC_298_C.py
N = int(input())

Q = int(input())

boxes = [[] for i in range(N+1)]
box_nums = [set() for i in range(201000)]

for i in range(Q):
    query = list(map(int, input().split()))
    if query[0] == 1:
        boxes[query[2]].append(query[1])
        box_nums[query[1]].add(query[2])
    elif query[0] == 2:
        print(*sorted(boxes[query[1]]))
    else:
        print(*sorted(box_nums[query[1]]))
```
## 感想
　流石にC問題すら今回解けないとは思わなかった。他の方の`Python`による解説をもとにして再度挑戦したい。

`set`は自動で数字の順序が決定するものであると思っていたが、違ったようなので今後気をつけたい（2023年5月30日追記）。
【Rails】 deviseのフラッシュメッセージの表示/非表示/編集

## 環境
ruby 3.2.1
rails 6.1.7.3
devise 4.9.2

## フラッシュメッセージの表示
deviseでは、認証メッセージが`flash []`に格納される。
成功系　→  `flash[:notice]`
失敗系　→ `flash[:alert]`
格納された値をリダイレクト先のviewで呼び出したい箇所に配置する。
```erb:view
<% flash.each do |type, message| %>
  <%= content_tag(:div, message, 
      class: "alert alert-#{type == 'notice' ? 'success' : 'danger'}" %>
<% end %>
```
+ content_tagヘルパーでHTMLを生成しています。nameがnoticeの場合にはsuccessクラスを、それ以外の場合にはdangerクラスを付与しています。

## フラッシュメッセージの非表示
ログアウトした時はフラッシュメッセージは表示したくないなど、特定の処理でフラッシュメッセージを非表示にしたい場合は、`config/locales/devise.en.yml`ファイルで非表示にしたい処理メッセージを空文字列にします。
```yml:config/locales/devise.en.yml
en:
  devise:
    sessions:
      signed_in: "Signed in successfully."
      signed_out: ""
      already_signed_out: "Signed out successfully."
```
## フラッシュメッセージの編集
フラッシュメッセージを編集したい場合、`config/locales/devise.en.yml`ファイルを編集します。
日本語に変換することもできます。
```yml:config/locales/devise.en.yml
en:
  devise:
    sessions:
      signed_in: "編集"
      signed_out: "編集"
      already_signed_out: "編集"
```

### gemを使って日本語にする
config/application.rbに以下の行を追加して、日本語をデフォルトの言語に設定します。
```ruby:application.rb
config.i18n.default_locale = :ja
```
gemをインストール

```ruby:Gemfile
gem 'rails-i18n'
gem 'devise-i18n'
```
```
$ bunlde install
```
日本語対応のファイルを生成
```
$ rails g devise:i18n:views user
```

以上で日本語に対応するようになります。

## 参考
[deviseを日本語表記にする。](https://qiita.com/ryuuuuuuuuuu/items/48dec280cf8925968c65)
[Ubuntu Desktop] curlコマンドで死活監視して落ちていたら通知を表示するワンライナー

`http://xxx.xxx.xxx.xxx:8000/` 宛にcurlで60秒間隔で死活監視を行い、接続できなかった場合に `notify-send` でデスクトップ通知するワンライナーです。
開発期間中にZabbixやJenkinsなどを使うまでもなく雑に死活監視したい場合などに使えます。

```
watch -n 60 "(! curl -fs http://xxx.xxx.xxx.xxx:8000/ -o /dev/null) && notify-send 'NG'"
```
cdk diffの結果をファイル出力してlessで確認する (ANSIエスケープ)

CDKの実装をしてPRを出すときに、cdk diffをコメントに貼り付けてチェックしてるんですが、diffがデカすぎてコピペできない時があります。（CloudShell上で実行して上の方きれちゃったり）
っていうことでファイル出力する方法調べました。

## cdk diffの結果をファイル出力する

``` shell
% cdk diff 2> diff.txt
```
ポイントは __標準エラー出力になる__ ということです。
標準出力は空っぽでした。
※2023/5/9
diffは差分がある＝エラーなので思想としてこれが正しいみたい

また、出力結果はANSIエスケープシーケンスに対応しており、catで出力すると色情報も保持されています。
逆に言うと、ファイルの中身にはメタデータが入りまくっているので ~~lessや~~ viewで読むのは至難です。

※ANSIエスケープシーケンスについてはこちらの記事がわかりやすいです。
https://qiita.com/PruneMazui/items/8a023347772620025ad6

## lessでANSIエスケープを有効にする
lessに -R オプションをつけるとANSIエスケープを理解して表示してくれるようになります。
``` shell
less -R diff.txt
```

## ANSIエスケープを取り除く (2025/1/29 追記)
sed コマンドで取り除いてプレーンなテキストにできる。
```shell
sed 's/\x1B\[[0-9;]*[mK]//g' diff.txt > diff_plane.txt
```

## おまけ、ファイルを分割する
lessで確認できるのを知ったのでこちらは使わないかも。

> diffがデカすぎてコピペできない

となっているので、結局catしてもコピペできないんじゃね？ということでファイルを分割する方法もついでに、 `split` を使います。
```shell
% split -l 10 diff.txt split_diff.
```

``` shell
% ls -al | grep diff
-rw-r--r--   1 hoge  staff  2795  4 21 10:54 diff.txt
-rw-r--r--   1 hoge  staff     0  4 21 10:53 diff1.txt
-rw-r--r--   1 hoge  staff   546  4 21 11:06 split_diff.aa
-rw-r--r--   1 hoge  staff  1727  4 21 11:06 split_diff.ab
-rw-r--r--   1 hoge  staff   520  4 21 11:06 split_diff.ac
-rw-r--r--   1 hoge  staff     2  4 21 11:06 split_diff.ad
```
`diff1.txt` は標準出力です。0バイトですね。
split_diff.xxとなっているのが分割されたファイルです。
splitコマンドはファイル数やファイルサイズを指定しても分割できますが、
今回はメタデータが含まれているので行数で分割するのがベターだと思います。
キャンペーン評価の手法 - 評価測定ケースの考察 - 1 

:::note
この本書は2017年4月1日にTeradata Japanのブログに掲載された内容を、再掲載したものです。
掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::


著者 山本 泰史 （やまもと やすし）


# 評価測定ケースの考察 - 1


## 端的な評価測定ケースの考察

前回までで論じてきたキャンペーン評価の方法をベースに、キャンペーンの事前測定や比較、キャンペーンの取捨選択、実施後の評価ケースについてご紹介していきます。 

##### １．長期にわたるキャンペーンの測定  

##### ２．実施タイミングの異なるキャンペーンの比較  

##### ３．マルチステップ型キャンペーンにおける評価判定(相乗効果のケース)  

##### ４．マルチステップ型キャンペーンにおける評価判定(食い合いのケース)  

##### ５．必要実行基準から逆算する先行指標値の把握 

1. 及び 2. は前述したNPVを用いて長期にわたるキャンペーンの事前測定、そしてタイミングの異なるキャンペーンの比較を行います。 3. と 4. のキャンペーンは、複数のキャンペーンを実行していく際の影響を考慮するケースを想定しています。 2つのキャンペーンを関連付けた形で “マルチステップ型” キャンペーンとして実施した場合、良い影響を与えるケースと悪い影響を与えるケースが考えられます。 ここではそれぞれを Synergy(相乗効果をもたらす)ケースと Cannibalization(互いに食い合う)ケースとしてご紹介します。 5. のキャンペーンは期待される利益率、利益金額から必要なレスポンス率を逆算し、更に事後分析を突合せ、そこから改善分析を行ったケースです。 これら5つのケースは実際のキャンペーン評価を行う際に微妙な判断を要することが想定される端的なケースであり、ここに光を当てることによってキャンペーンを評価する際の基準がかなり明確になることでしょう。今回は 1. 及び 2. のケースをご紹介します。


<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/763843dd-806b-1dd7-1747-d11916c5dead.png">


最初の例では当年を含めて4年間にわたり、イベント主導型のキャンペーンを実施することを予定しています。経費として初年度 1億5,000万円(150M)、次年度以降は毎年 1億円(100M)発生することになっています。1年目以降の売上、粗利、経費、割引率は同じであることにご注目ください。 結果的に単純な利益金額は 4億円(400M)と毎年同じ金額です。これに対して割引率を考慮に入れているため、現在から遠い将来の利益金額ほど割引が高く適用され、単純な利益金額 4億円(400M)が1年目には 3億6,400万円(364M)に、そして3年目には 3億100万円(301M)に変化していることが見て取れます。 ここから、将来の利益金額は資本コストの影響を強く受けるために高く見積もられており、これを反映して適正に利益を見積もりなおした結果がNPV であるということが分かります。

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/a7b51f9c-da9a-3c1e-496b-2ddda14bc5f2.png">


割引率を適用することによって明確にできるキャンペーン評価の例を、もう1つご紹介します。長期的な利益をもたらすキャンペーンと、短期的な成果に結びつくキャンペーンは、比較するのが困難であることがしばしばあります。ここでは、実施される期間の異なる2つのキャンペーンを比較します。 同様のキャンペーンを今すぐ実施する場合と、1年後に実施する場合の比較です。今年実施した場合、 1億9,000万円(190M)の売上が生成され、来年実施した場合には 2億円(200M)の売上が生成されることを予測できたとします。粗利率、キャンペーン経費等の利益金額に影響を与えるその他の指標は同じであるため、一見すると来年実施した方が有利なように思えます。しかしながら、割引率を考慮することによって、来年と今年では結果が逆転し、今年実施したほうが有利な、収益性の高いキャンペーンであることが理解できます。もちろんこれは一例であり、ケースによっては異なる判定となることもありえます。例えば今年実施した場合の売上金額が 1億円(100M)であればこの結果は逆転することでしょう。 ここでは、期間や実施タイミングの異なる2つのキャンペーンを、割引率を用いることによって正確に比較するための方法例として挙げています。


#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
【基本情報】OSI基本参照モデル

# OSI基本参照モデルとは

ISO(国際標準機構)がネットワークアーキテクチャを標準化するため、7階層にまとめ、機能を定めたもの。このモデルに準拠して開発すれば、ベンダが違っていても接続して通信できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/f574fd15-c9f0-e764-9445-0799dbbf678c.png)h

# ネットワーク接続機器

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/35cd0d24-0ec1-45a4-3116-1a9e564fb827.png)

〇ゲートウェイ
第4層のトランスポート層以上が異なるネットワークを接続するLAN間の接続装置。

〇ルータ
第3層のネットワーク層での接続装置。
IPアドレスを基にしてデータを中継。ルーティング機能によって、最適な経路を選択。
フィルタリングによるファイアウォール機能も備える。

〇ブリッジ
第2層のデータリンク層での接続装置。
転送先のMACアドレスを基にしてポートのみにデータを中継。

〇リピータ
第1層の物理層での接続装置。
電気信号を再生増幅することで伝送距離を延長。
明日4/22は「アースデイ2023」 環境保護活動を支えるJMPの取組み

![earthday.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/35c3ca44-ae72-144c-7406-de40ff08e83f.jpeg)
毎年4月22日に開催される <font color="Orange">「**アースデイ**」</font>は、地球環境保護への取り組みを促進するための世界的なイベントです。1970年に初めて開催され、今では世界で10億人以上が参加する規模に成長してきました。

日本でも、 [**「アースデイ東京2023」**](https://www.earthday-tokyo.org/earthday2023/) 等の団体が、各地でイベントを開催しているので参加された方も多いかもしれませんね。

アースデイが近年特に注目され、参加者が増えている理由の1つとして、地球温暖化、海洋汚染、土壌汚染などの環境問題が深刻化していることが挙げられます。

これらの問題を前にして、国連のWebサイトでは「今後10年、1つ1つの行動、1日1日が大切な意味を持ち、すべての国や企業、組織、個人には、果たすべき役割があるのです」と呼び掛けが行われていて、私たち [**「JMP」**](https://www.jmp.com/ja_jp/home.html) も組織として何ができるかを考え続けています。

その1つの取り組みとして、JMPは [**「国連生態系回復の10年（UN Decade on Ecosystem Restoration）」**](https://www.decadeonrestoration.org/) に賛同しています。

また、「Data for Green」（JMP Ecosystem Restoration Initiative）というプロジェクトで、本社社屋のエネルギー使用量と排出量を計測して、企業活動が環境に与える影響をモニタリングしたり、環境保護活動を行う団体がJMPでデータ分析を行う際のサポートを提案したりもしました。

JMPはこれまで、環境保護活動に携わる多くの方々がフィールドワークで得たデータを分析する際のツールとして利用され、その活動を支援してきました。

 <font color="Orange">**WildTrack**</font>
デジタル写真と足跡アルゴリズムを活用し、絶滅危惧種を一匹一匹確実に救う活動を実施。
https://www.jmp.com/ja_jp/customer-stories/wildtrack.html
![WT.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/8fc820db-d9d3-fdde-cb6d-495a73e5dcf7.jpeg)

 <font color="Orange">**カリード・ビン・スルタン・リビング・オーシャンズ財団**</font>
予測モデルを用いてサンゴ礁の保護活動の優先順位を決定。
https://www.jmp.com/ja_jp/customer-stories/living-oceans-foundation.html
![LO.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/61b1f52e-29ac-2af4-b743-7dcb56b93b18.jpeg)

 <font color="Orange">**ノースカロライナ自然科学博物館**</font>
JMPを活用し、哺乳類の個体数分布のデジタルアーカイブを構築。
https://www.jmp.com/ja_jp/customer-stories/ncmns.html
![NCMNS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/db3d03d7-204b-af3e-7a86-853ccea5cb5d.jpeg)

 <font color="Orange">**バージニア工科大学**</font>
キツネザルの行動についての学際的な研究で、保護方針、飼育環境の改善を目指す。
https://www.jmp.com/ja_jp/customer-stories/virginia-tech.html
![VIU.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/83dea4cf-807a-6da6-2a6c-595fc86dcff2.jpeg)

環境保護活動は、長い道のりのなかで、たゆまぬ努力が必要になります。その活動に携わる方々が正しい方針を決める際や、効率的にデータを解析する際に、JMPは統計ツールとして間接的にその活動をサポートできることを嬉しく思いますし、これからも継続してサポートを続けていくつもりです。

<font color="light blue">**■ 30日間全機能無料。JMPトライアル版ダウンロード**</font>
https://www.jmp.com/ja_jp/download-jmp-free-trial.html?utm_campaign=td&utm_source=facebook&utm_medium=social
アルゴリズム・データ構造について

<h1>・アルゴリズムとは</h1>
　<b>アルゴリズム</b>とは、プログラムの処理の手順のことである。例えるなら、料理のレシピのことである。

例）カレー（料理）なら
⇒玉ねぎ、じゃがいも、肉、ニンジンなどを切ってルーを入れて…

　プログラム（奇数かどうか判断）なら
⇒この値をif文にかけて2で割った時、1余るのなら…

<h2>・フローチャートとは</h2>
　<b>フローチャート</b>とはプログラムの処理の手順をわかりやすく書く方法のことである。

細長い楕円形⇒プログラムの開始と終了
ひし形⇒条件分岐
台形⇒ループ文
長方形⇒任意の処理
を表す。

<h1>・データ構造</h1>
　プログラミング言語では主に２つの方法を使ってデータをまとめる。その方法とは<b>配列</b>と<b>リスト</b>の２種類である。

<h3>・配列とは</h3>
　配列とは、データをまとめる方法の１つである。


特徴としては①予め決めた量、はじめに宣言しただけの量のデータしか入れることができない
　　　　　　②データのアドレス（データが配列のどこにあるかを示すもの）が数字の順番で、データアクセス</b>の処理がリストよりも軽い
　　　　　　③配列の中に配列を作ることができる(多次元配列)

<h3>・リストとは</h3>
　リストとは配列と同様にデータをまとめる方法の1つである。

特徴としては①データの追加、削除が自由である。
　　　　　　②データをアドレスとポインタを使用して管理しているため<b>データアクセス</b>の処理が配列よりも重くなる

<h3>・配列とリストの使い分け</h3>
　配列とリストは<br>
①予め登録するデータ量が決まっているのなら配列、そうでないのならリスト<br>
②データへのアクセスが頻繁であれば配列、そうでないならリスト<br>
③データの追加、削除を頻繁に行うのであればリスト、そうでないのなら配列
のように使い分ける。

<h2>・データの探索と整理</h2>
　次は、まずデータがどのように出入りするのか、その次に配列やリストの中にあるデータを効率よく探す、整理する方法について学習していく。

<h3>・スタックとキュー</h3>
　<b>スタック</b>と<b>キュー</b>とは配列やリストにあるデータがどのように出入りするのかについてのものである。

スタックはどんどんデータを<b>上に積み重ねていく</b>データの入れ方である。
![スライド7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850098/a6f9e4db-82fa-bd8a-f290-d3e6aaddb37c.png)

図のようにデータを上から積み重ねていくため、一番最初に入れたデータ１を取得するにはその上にあるデータを<b>全て取り出す必要</b>がある。反対に新しいデータを<b>すぐに取り出せる</b>メリットも存在する。

キューはデータをどんどん積み上げていくが、取り出し方が古い方からという特徴がある。![スライド8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850098/2a7f16c3-7808-7d1a-a2d5-4dc311c32a25.png)

図のように先に入れたデータから取り出していくので、データ１はすぐに取り出すことができる。しかし、スタックと異なり新しく入れたデータを取り出すには<b>古いデータを取り出す必要</b>がある。
【MyBatis】挿入した情報の自動採番された値を取得する

## 概要
　MyBatisでDBへ情報の挿入を行う際に、自動採番される値を取得してオブジェクトに格納を行いたい。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3321564/f64bf0cc-cf26-5857-d95b-c9bae3eb0f11.png" width="700px">

## 環境
名前 | バージョン 
 --- | --- 
Java | SE17
SpringBoot | 4.17.1
MyBatis | 3.5.11(spring用のフレームワークを使用)
postgreSQL | 14.6
## 実装
```xml
    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
		INSERT INTO items
		(name,description)
		VALUES
		(#{item.name},#{item.description})
	</insert>
```
### \<insert\>
属性名 | 値　 | 説明
--- | --- | ---
id | 対応するメソッド名 | 
useGeneratedKeys |true | tureにすることで自動採番される値を自動で取得。オブジェクトへ反映してくれる |
keyProperty | オブジェクトの変数名 | 自動採番された値を挿入するオブジェクト内の変数名

　insertタグのuseGeneratedKeys属性を有効にし、keyProperty属性で取得した(自動採番された)値を格納するオブジェクトの変数名を指定することで,挿入と同時に自動的にオブジェクトに値を格納してくれる。以下のように確認可能。

```java
System.out.println(item.getId);  // 自動された値(id)を表示
```

## 後述
　その他の記事などで、今回の実装に加え\<selectKey\>タグを実装させる以下のような方法も見られるが、今回の環境では不要だった。(むしろ実装することで異常が出た)。

```xml
	<insert id="insert" useGeneratedKeys="true" keyProperty="id">
		SQL本文
		<!-- 自動採番されたIDを取得 -->
		<selectKey resultType="int" keyProperty="id" order="AFTER">
			 SELECT last_value FROM items_id_seq
		</selectKey>
	</insert>
```
Pythonでライブラリのインポート時に発生する「incompatible architecture」エラーの解決

# はじめに
先々月あたりの出来事なので少しうろ覚えですが、ブラウザ上でテキストファイルをアップロードしワードクラウドとワードツリーを作成するPythonアプリケーションの作成をしていた時に見たことがないエラーメッセージが出てきました。この記事はそれをどのように修復したかを今の忘れないうちにメモし、もし同じエラーに遭遇した人がいたらヒントになってくれたらと思い記録しました。

### 環境
- macOS Ventura 13.0 (Apple M1)
- Visual Studio Code 1.77.0
- Python 3.9.13

# 問題のエラー
とにかく、このPythonアプリケーションではFlaskを使用してウェブ上でテキストファイルをアプロードし、その後にまずワードクラウドのイメージを生成するのだが、こんなエラーメッセージが出てくる(ディレクトリーの一部を/....../にしてます)

```terminal
Traceback (most recent call last):
  File "/Users/...../app.py", line 2, in <module>
    from wordcloud import WordCloud, STOPWORDS
  File "/Users/....../site-packages/wordcloud/__init__.py", line 1, in <module>
    from .wordcloud import (WordCloud, STOPWORDS, random_color_func,
  File "/Users/....../site-packages/wordcloud/wordcloud.py", line 30, in <module>
    from .query_integral_image import query_integral_image
ImportError: dlopen(/Users/....../site-packages/wordcloud/query_integral_image.cpython-310-darwin.so, 0x0002): tried: '/Users/....../site-packages/wordcloud/query_integral_image.cpython-310-darwin.so' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64')), '/System/Volumes/Preboot/Cryptexes/OS/Users/....../site-packages/wordcloud/query_integral_image.cpython-310-darwin.so' (no such file), '/Users/....../site-packages/wordcloud/query_integral_image.cpython-310-darwin.so' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64'))
```

今までも色々なPythonライブラリーを使用してきたのですが、このメッセージは初めてで、一見どのようにしたらよいのかわかりません...

とりあえずこのエラーはWordCloudライブラリの一部である「query_integral_image」モジュールのアーキテクチャの互換性に問題があるようです。ここでモジュールは別のアーキテクチャ (arm64) 用にコンパイルされたようですけど、システムは別のアーキテクチャ (x86_64) を使用してるようです。

ネットで調べてみるとPythonのscrapyとかRubyのcore_extとかを使用したときに同じエラーが起こったみたいな人を発見し、Pythonにおいてはライブラリーをアンインストールしてpipをアップデートしてもう一度ライブラリーを再インストールしたら直ったとの声を聞いたのでやってみたのですが私の場合は同じエラーがやっぱりどうしても出てきます。（普通に考えればアーキテクチャ互換性の問題と言っているのでそんな単純な方法で直るわけないです...）

# 解決法
そうこうしている間にやっと解決方法が見つかりました。以下をターミナルで実行したら直って無事にWord Cloudが表示されました。
（おそらく解決に一番役に立ったStack Overflowの質問と回答: https://stackoverflow.com/questions/71882029/mach-o-file-but-is-an-incompatible-architecture-have-arm64-need-x86-64-i）
```terminal
ARCHFLAGS="-arch arm64" pip install wordcloud --compile --no-cache-dir
```

まず、`ARCHFLAGS="-arch arm64"`は、ARCHFLAGS環境変数を設定して、インストールするパッケージのアーキテクチャタイプをM1チップで使用されるarm64に設定します。

次に`pip install wordcloud --compile --no-cache-dir`で`--compile`と`--no-cache-dir`を使用してwordcloudをインストールします。`--compile`は、見つかったソースファイルをコンパイルするように指示し、`--no-cache-dir`はパッケージの保存にキャッシュディレクトリを使用しないように指示します。それによって、インストールが高速化され結果のパッケージのパフォーマンスが向上し、キャッシュに問題がある場合やパッケージの最新バージョンを確実にインストールしたい場合に役に立つとのことです。

# まとめ
色々と調べてみたらM1チップを使っているとそこまで珍しい問題ではないようでした。

また、余談にはなりますが、ワードクラウドもワードツリーもPython Flaskを保ちつつ結局D3.jsと呼ばれるjsフレームワークでやったほうがブラウザ上で表示するためには便利だったのでpythonのライブラリではなくそっちに変更。この記事を書くのに渋った理由はそこにもあります。

そしてまた冷静に考えたらD3.jsでワードクラウドとワードツリーを表示するならPythonも必要ではないことにも気づきました。自然言語処理系なのでモダンなのはPythonかなと思い何も考えずにPython Flaskで開発をしていたのですが、そこに囚われなければ出会うことのないエラーでした。

同じエラーが起こった人がいればこの記事を参考にしてくだされば幸いです。

とにかく、このエラーのために時間を費やす必要はありませんでした...
Professional Scrum Master I (PSM I) を取得した

## きっかけ
- 今流行りのアジャイル型の開発手法を学んでおこうと思った。
  - せっかく学んだので証明書と言う形で残しておきたかった。
- Coursera の [Google Project Management Certificate](https://www.coursera.org/professional-certificates/google-project-management) を修了すると、PSM Iの40%割引券を貰えたので、「割引」とか「お得」という言葉に弱い私はいそいそと取得を試みた。


## Professional Scrum Master について
- PSMについてはまずは[公式サイト](https://www.scrum.org/assessments/professional-scrum-master-i-certification "Professional Scrum Master I Certification")を参考にされたい。
- Professional Scrum Master (PSM) 以外にも Certified ScrumMaster (CSM) や
Registered Scrum Master Training (RSM) ※旧：Licensed Scrum Master (LSM) などの資格があるが、それは[この辺](https://www.itpreneurs.co.jp/data-and-knowledge/scrum-certifications "スクラムマスターの実務に役立つ！代表的な3つの認定資格と選び方を解説")を参照されたい。




## なぜ Professional Scrum Master にしたのか
- 「試験のみの受験で取得可能」「資格の更新が不要」の二点が非常に大きい。
  - 筆者はプログラミングなどの開発業務を主としており、それ以外の運営、マネジメント関連に割く時間と労力を出来る限り省力化したかった。
   - とは言え、アジャイル型スクラムのフレームワークはチームで開発をしていくうえで必要なので、知識としては抑えて置かないとならない。
  - 従って、スクラム手法の能力を客観的に示せれば PSM, CSM, RSM(旧LSM) のどれでもよかった。こだわりはない。
    - プログラマーの 3 つの美徳は「怠惰」、「短気」、「傲慢」である。（ラリー・ウォール）
    - The three virtues of a programmer: Laziness, Impatience, Hubris. (Larry Wall)

## 英語のみであることについて
- 英語のみ対応であるが、[公式サイトに記載の通り](https://www.scrum.org/support/using-google-translate-plug-take-assessments "Using the Google Translate Plug-in to Take Assessments")、英語を母国語としない人はGoogleの翻訳ツールを利用して学習、試験を受けることを推奨している。
  - そう、試験においてもGoogleの翻訳ツールを使って日本語で受験してよいのです。
    - とは言え、記載の通り、一部翻訳に不十分な点があるので、そこは脳内で補って上げる必要がある。
    - 一例では "Definition of Done" (完了の定義) が略語で "DoD" と出現した場合、「国防総省」（United States Department of Defense、略称: DoD）などとGoogle翻訳さんはおっしゃる。
    - やはり誤訳などに対応できるよう、ある程度事前にscrum.orgの英文に慣れておいた方がよい。


## 勉強方法について

- [公式サイトに記載の通り](https://www.scrum.org/resources/suggested-reading-professional-scrum-master "Suggested Reading for Professional Scrum Master I")、まずは[スクラムガイド](https://www.scrum.org/resources/scrum-guide "The Scrum Guide")を参照されたい。

- そのうえで[公式の練習問題](https://www.scrum.org/open-assessments "Open Assessments")があるのでそれを解く。
  - 当然、 Scrum Open が主となるが、（公式のサイトにも書いてある通り）Product Owner Open、 Scrum Developer Open にも目を通しておくべき。


- それ以外にも英語圏のサイトを探せばサンプル問題がいくつか見つかるので目を通しておく。
  - 上げればきりがないが代表的なものを以下に掲載しておく。

https://mlapshin.com/index.php/scrum-quizzes/sm-real-mode/

- というか、[Quizlet](https://quizlet.com/ja "Quizlet")あたりでも検索すればいくらでも出てくる。
  - 個人的にはQuizletはかなりおススメ。
  - 一部では「公式資料ではないので正解が不明確である」なる意見が見受けられるが、私はそうは思わない。正解に疑問が湧いたら自分で調べて、正しい答えとその理由付けまでを把握することになると考える。

# 結果
- 無事に合格した。
  - 正答率90.0% (80問中72問正解)
  - めでたしめでたし。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953203/1a9d2f3c-2d5a-51c1-6123-3bd50de4eea0.png)
ChatGPT3.5にPython, matplotlibでパレート図を作成させてみた

文字通り ChatGPT3.5 にパレート図を描く Python プログラムを書かせてみた。
一番最初に提示されたプログラム。全くダメダメプログラム。
```Python
import matplotlib.pyplot as plt

# テストデータ (category:count)
data = {"A": 200, "B": 150, "C": 100, "D": 50, "E": 20, "F": 10}

# countを基準に降順にソートする
sorted_data = sorted(data.items(), key=lambda x: x[1], reverse=True)

# 合計値を算出する
total_count = sum(data.values())

# パレート図の描画
fig, ax1 = plt.subplots()

ax1.bar([x[0] for x in sorted_data], [x[1] for x in sorted_data], color='royalblue')
ax1.set_xlabel('Category')
ax1.set_ylabel('Count', color='royalblue')
ax1.tick_params(axis='y', labelcolor='royalblue')

ax2 = ax1.twinx()

cumulative_count = 0
cumulative_percentages = []
for i, (category, count) in enumerate(sorted_data):
    cumulative_count += count
    cumulative_percent = cumulative_count / total_count * 100
    cumulative_percentages.append(cumulative_percent)
    ax2.plot([i, i+1], [cumulative_percent, cumulative_percent], color='firebrick', linewidth=2)
ax2.set_ylabel('Cumulative Percentage (%)', color='firebrick')
ax2.tick_params(axis='y', labelcolor='firebrick')

plt.title('Pareto Chart')
plt.xticks(rotation=45, ha='right')
plt.show()
```
![スクリーンショット 2023-04-21 9.24.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/5b34d8b5-2edc-8edb-375e-5fad47240815.png)

行き違いというか指示不足もあったりで，その後何度もダメ出しして，19回目になってやっとまともな図を描くプログラムを提示してきた。

プログラムの欠点・欠陥を見抜けるか，プログラム・成果物の仕様を発注者（利用者）が正確に把握できているかが重要である。利用者がちゃんとしていないと，故意ではないにしてもChatGPTの不正確・不十分な成果物を受け入れてしまう可能性が高いなあと実感した。

最終成果物（まだ色々直したいところもあるが）
```Python
import matplotlib.pyplot as plt
import pandas as pd

# テストデータ
df = pd.DataFrame({
    'category': ['E', 'D', 'C', 'B', 'A'],
    'count': [10, 15, 20, 23, 25]
})

# カテゴリーを降順に並べ替える
df = df.sort_values('count', ascending=False).reset_index(drop=True)

# パーセントと累積パーセントを計算
df['Percent'] = df['count'] / df['count'].sum() * 100
df['Cumulative percent'] = df['Percent'].cumsum()

# パレート図を描画
fig, ax1 = plt.subplots(figsize=(8,6))

# 棒グラフを描画
ax1.bar(df['category'], df['Percent'], color='tab:blue')
ax1.set_ylabel('Percent', fontsize=14)
ax1.tick_params(axis='y', labelsize=12)
ax1.set_ylim([0, 100])

# 折れ線グラフを描画
ax2 = ax1.twinx()
ax2.plot(df['category'], df['Cumulative percent'], color='tab:red', marker='o')
ax2.set_ylabel('Cumulative percent', fontsize=14)
ax2.tick_params(axis='y', labelsize=12)
ax2.set_ylim([0, 100])

# x 軸のラベルを回転して表示
ax1.set_xticks(range(len(df)))
ax1.set_xticklabels(df['category'], fontsize=12, rotation=90)

# 軸目盛を整数にする
ax1.yaxis.set_major_locator(plt.MaxNLocator(integer=True))
ax2.yaxis.set_major_locator(plt.MaxNLocator(integer=True))

plt.title('Pareto Chart', fontsize=16)
plt.show()
```
![スクリーンショット 2023-04-21 9.33.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/d1df8985-10b8-fb8b-aa97-99bdbc731786.png)
TwitterのOGPが地獄だった

## 前提

画像の指定には、「Twitter:image」ではなく、「og:image」を使っています。

## OGP画像の差し替え

URIはそのままに、画像だけを差し替えたらエライ目に遭ったので、記録しておきたい。

端的に言ってしまえば、画像だけを差し替えても、Twitter側のキャッシュがそのままになってしまい、画像が一向に差し替わらないのだ。

調べてみると、[Twitterのリンク(画像の変更等)が更新・反映されない⇒OGPのキャッシュクリアで解決](https://aoto-yuzuto.tech/clear-twitter-ogp-cache/)のようなページが引っかかり、[Card Validator](https://cards-dev.twitter.com/validator)というTwitterのサイトを使えば多少時間はかかっても1時間程度でキャッシュクリアがなされるように書いてあるが、こちらもアテにならない。

キャッシュクリアの操作（？）を行い、半日経ったが、表示される画像は古いもののままだ。

## 画像URLに日時クエリを追加する

[Twitter公式のトラブルシューティングガイド](https://developer.twitter.com/en/docs/twitter-for-websites/cards/guides/troubleshooting-cards#refreshing)によると、URL短縮サービス「bit.ly」に、URLにクエリ文字列を追加したものを短縮し、そこにアクセスすることでTwitter側に更新のヒントを与えることができる、というようなことが書いてあって、実行したが、効果はなかった。

また、「og:image」で指定している画像URLに日時クエリを追加することもやってみたが、特に効果はなかった。
これは例えば、画像URLを `https://example.jp/img/ogp.png` から`https://example.jp/img/ogp.png?1682035478` にするようなものだ。

## 最悪、最大7日待つしかない？

上記サイトには、「Twitter の Web クローラーは、およそ 7 日ごとにページのカード タグ情報を再インデックス化します。」(`the web crawler re-indexes the meta information on your tag roughly every seven days.`)というようなことが書いてあり、最悪の場合は `およそ` 7日、再インデックス化を待たなければいけないようだ。

## とりあえず新規画像が表示されるようにする方法

新規Tweet画面で、クエリインデックスを含むURLを記述すること。 `https://example.jp/` がURLだとしたら、 `https://example.jp/?1682035478` のような、「?」の後に適当な数字や文字なりを入れてしばらく待つ。これで新規画像が表示されたら、後はインデックスが更新されるのを待つしかない、と思われる。

## 結局、15時間後に更新された
20時に画像を差し替えて、翌朝8時の時点でまだ前の画像が表示されていましたが、
朝11時の時点でもう一度確認したら新しい画像が出てきました。
個人的なベンチマークとしては更新に必要な時間は「15時間」ということにしようと思います。
Install the Field Service Managed Package >  Build Your Team


[Install the Field Service Managed Package > Build Your Team](https://trailhead.salesforce.com/content/learn/projects/install-the-field-service-lightning-managed-package/build-your-team)

+ [Getting error on trail: Build Your Team](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PimS8)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3a9edc30-f730-829b-9ffc-82423b735e34.png)

:::note
The issue is resolved. There were inactive users with the same name which was creating the conflict when Trailhead was trying verify the module. Thank you all for the support and insights.

問題は解決しました。 Trailhead がモジュールを検証しようとしたときに、競合を引き起こした同じ名前の非アクティブなユーザが存在しました。サポートと洞察をありがとうございました。
:::
Laravelのジョブが失敗したことを確認するテストケースを書くときのTips

(ひっさびさにLaravel触っていて、キューのテストを書くときに詰まったので備忘録的な感じの内容です。)

# 前提
非同期で処理を行いたい時の手段として、Laravelではキューの仕組みを提供しています。
https://readouble.com/laravel/9.x/ja/queues.html

対象者がたくさんいる個別にメールを配信するシステムだったり、
個別に処理をしていく方が実装がシンプルになるような日次処理だったり、
色々な処理に活用されているかと思います。

# 背景
(ジョブのディスパッチ元でしてもいいのですが)、
ジョブの内部処理としてパラメータチェックを行っていたいなぁと以下のような処理を書いてました。

```
class HogeJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    private $param;

    public function __construct(Param $param)
    {
        $this->param = $param; //チェックしたいパラメータ
    }

    public function handle()
    {
		if($this->validate($this->param))){
			$this->fail();
		}
		// 後続の処理
    }
	
	private function validate(Param $param){
		//バリデーション処理
	}
}
```

この時、間違いなく`$this->fail()`されていることを確認したいのですが、
QueueのMock、使えそうなものがないかなと探してみてもそれらしいものがありません。
https://readouble.com/laravel/9.x/ja/mocking.html

このケースに限らず、fail()に移行しているか確認したいケースはあるかと思うので、
「えぇ。。」
「failしたこと確認したいよぉ。。」
と、泥沼入りながら試行錯誤してみました。

# 結論
`Event::fake([JobFailed::class])`を利用します。
`$this->fail()`を呼び出すと、内部で`Illuminate\Queue\Events\JobFailed`クラスのイベントを発火するため、
それが出たかどうかで判断します。

```
class HogeJobTest extends TestCase
{
	public function test(){
		Event::fake([JobFailed::class])
		$param = new Param('適当な値');
		HogeJob::dispatchSync($param);
		Event::assertDispatched(JobFailed::class);
	}
}
```

ちなみに`Event::assertDispatched`の第二引数で細かいエラー内容のハンドリングもできるため、
`$this->fail('error');`みたいにした時に、エラーメッセージが想定通りか確認したいテストも記載可能です。


# 改善点
このパターンだとJob内部でDIされたオブジェクトをモックできないという欠点があります。
(HogeJobクラスの`public function handle()`の引数に何かしらのインターフェースが指定されているようなパターン)

現状全く方法思いついていないので、困った時にまた検討していこうかなと。。
PostgresをRailsでテーブル削除する

PostgreSQLをRailsで使用している場合、テーブルを削除するには、以下の手順に従います。

# テーブル一覧の表示
```
rails db
```
上記コマンドを実行すると、PostgreSQLのコンソールに入ります。

コンソール内で、以下のコマンドを入力して、テーブル一覧を表示します。
```
\dt
```
## テーブルの削除
上記のコマンドで表示されたテーブル名を使用して、テーブルを削除します。以下のコマンドを実行します。
```
rails destroy model [テーブル名]
```

例えば、テーブル名が「users」の場合、以下のように入力します。
```
rails destroy model User
```
これで、指定したテーブルが削除されます。


PostgreSQLのコンソールから抜けるには、以下のコマンドを入力します。
```
\q
```