OmniAICreator/Qiita-1.07M huggingface dataset:
Playwright で ファイル選択はできるが formData が送信できない時は buffer を指定する

# 問題

公式に以下のような使用例があるが、
ファイル選択はできるものの、その後の実際にアップロード送信がうまくいかない


```js
// Start waiting for file chooser before clicking. Note no await.
const fileChooserPromise = page.waitForEvent('filechooser');
await page.getByText('Upload file').click();
const fileChooser = await fileChooserPromise;
await fileChooser.setFiles(path.join(__dirname, 'myfile.pdf'));
```

https://playwright.dev/docs/api/class-filechooser

# 解決

- `fileChooser.setFiles` の引数としてファイル本体を渡したつもりでも、画面に表示される「ファイル名」の部分しかエミュレートできていなさそうに思えた

以下のように

- fs で ファイルから buffer を得るなどして、ファイル本体としての buffer を作っておく
- 引数として buffer にオブジェクトを渡す

ということで期待通り動いた

```js
import fs from 'fs'

test('UPLOAD SAMPLE', async ({ page }) => {
  const fileBuffer = fs.readFileSync('/path/to/example.csv')
  await page.getByText('Upload file').click()

  const fileChooserPromise = page.waitForEvent('filechooser')
  const fileChooser = await fileChooserPromise

  await fileChooser.setFiles({
    name: 'filename',
    mimeType: 'xxx',
    buffer: fileBuffer,
  })

})

```

# 環境

- Nuxt3 
- Playwright 1.4


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
Geminiを使ってQiitanで物語を書いてもらった

# 概要

アドベントカレンダーの参加賞でQiitanをもらったので、記念にQiitanを使った物語をGeminiで書いてもらいました。

もらったQiitanはこれ。
![IMG_2325.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/8f3427fb-8107-0647-fcab-23251af28963.jpeg)


# 命令文

```
Qiitanで物語を書いてみて。
```

# 回答

```
Qiitanで物語：AIエンジニアの葛藤
登場人物

佐藤 健太：AIエンジニア
田中 愛：AIエンジニア
山田 太郎：プロジェクトマネージャー
あらすじ

佐藤健太は、AIエンジニアとして新進気鋭のスタートアップ企業で働いている。彼は、AI技術で社会貢献したいという強い思いを持って仕事に取り組んでいる。しかし、プロジェクトマネージャーの山田太郎から、倫理的に問題のあるプロジェクトへの参加を依頼される。健太は、自分の信念と会社の利益の間で葛藤する。

物語

健太は、AI技術を使って医療診断の精度を向上させるプロジェクトに携わっていた。彼は、このプロジェクトが多くの人の命を救う可能性があると信じて、日々研究に没頭していた。

ある日、山田太郎が健太のオフィスを訪れた。山田は、健太に新しいプロジェクトへの参加を依頼した。それは、AI技術を使って人の感情を操るというプロジェクトだった。

健太は、そのプロジェクトに倫理的な問題を感じ、参加を拒否した。しかし、山田は、

「これは会社にとって重要なプロジェクトなんだ。君にはぜひ参加してもらいたい。」

と、健太を説得しようとした。

健太は、自分の信念と会社の利益の間で葛藤した。彼は、AI技術で社会貢献したいという思いと、倫理的に問題のあるプロジェクトに関与したくないという思いの両方を抱えていた。

健太は、田中愛に相談することにした。愛は、健太と同じくAIエンジニアとして働いている。彼女は、健太の話を聞いて、

「あなたは自分の信念に従うべきよ。」

と、アドバイスした。

健太は、愛の言葉を聞いて、決断した。彼は、山田に、

「私はそのプロジェクトには参加しません。」

と、きっぱりと断った。

山田は、健太の決断に怒った。しかし、健太は自分の信念を曲げなかった。

健太は、会社を辞めることを決意した。彼は、自分の信念を貫ける別の場所で、AI技術で社会貢献したいと考えていた。

結末

健太は、新しい会社で、AI技術を使って教育の格差を解消するプロジェクトに携わっている。彼は、自分の信念に従って、AI技術で社会貢献することに喜びを感じている。

感想

AI技術は、社会に大きな可能性をもたらす一方で、倫理的な問題も孕んでいます。AIエンジニアは、技術的な知識だけでなく、倫理的な判断力も求められます。健太の物語は、AIエンジニアの倫理観について考えさせてくれます。
```

# まとめと感想

Qiitanと関係はなさそうですが、なかなか興味深いお話になっていました。AIでストーリーも書いてもらうのもありですね。
ソースコードをどこまで読んだか記録するchrome extension作ってきた

# はじめに
初めましての方は初めまして
土佐犬と申します

いきなりですが皆様ソースコードを読まれると思うのですが、
**どこまで読んだか覚えていない**
そういうことがありますね、ないわけないです、あります

今回はそれをどうにかこうにかしたいchrome extensionを作ってきたのでそのご紹介です


# 作ったもの
今回作ったchrome extensionは**reading saver**です
読んでそのまま、読んだ部分を保持するchrome extensionです

https://github.com/tosaken1116/reading-saver

version 0.1のダウンロードはこちら

https://github.com/tosaken1116/reading-saver/releases/tag/0.1.0

どのような機能があるかという点に関して

1. 特定のページにおいてどこまで読んだかを記録できる
2. 読んだ位置までスクロールできる
3. 記録するページを限定できる

といったものになっております


## 特定のページにおいてどこまで読んだかを記録できる
まずこれがこのchrome extensionの1番の醍醐味です
![496214689064157249.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3230849/e9b80b4f-442b-8d4a-7b49-7c6dcef9e2bb.gif)


右下にどこまで読んだかのインジケーターが出てきます

## 読んだ位置までスクロールできる
ソースコードの特定の場所まで読んでから、あれそういえばここどういう関数だったっけって戻ること、あります。
見に戻った後にどこまで読んだっけってなりますよね
そういう時にインジケーターを押せば読んでる最新位置までスクロール位置を飛ばすことができます

![画面収録-2024-02-22-19.43.22.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3230849/b5ecc5ab-6604-d416-5fd6-b3455b777481.gif)


## 記録するページを限定できる
必要ないページまで読んだ位置を記録するのもなぁということで**特定の文字列から始まるurl**のみを観測することができます
例としてhttpsから始まるurlのページのみ記録する場合がこちらになります(~~今の時代どのサイトもhttpsから始まるやろ~~)
![スクリーンショット 2024-02-22 19.45.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3230849/862f9911-80a5-575e-1438-f6d9c126febc.png)



# 終わりに
という感じでほんとに紹介程度の記事になります
初めてchrome extension作ったのですが割と詰まるところもありつつ楽しく作ることができました。
これでソースコードを読むのに困りませんね

今後の展望としてはとりあえず`記録するページのUIを綺麗`にしたり、あとは`正規表現の対応`などをしていけたらなーって思ってます(現状startwithでチェックしているため)
あ、あとはページ内の他のリンクでどこまで読んでるかの表示とかしたいですね
ほんとは対応したかったんですけどaタグでurl見てstorageから引っ張ってくるみたいなことしたかったんですよ
だけどgithubのソースコードのファイルボタンの部分ってあれaタグでもないんでgithubの場合とかで場合分けとかが必要そうだな〜って感じだったんで今回は見送りにしました

では、また次の記事で
【Python】SQLファイルから特定のカラムのデータ以外の全データを取得する方法

# 概要
SQLファイルから、特定のカラムのデータ以外のすべてを取得する必要性が生じましたので、Pythonプログラムで実装しました。

### 前提
例えば以下のようなSQLがあるとします。

```sample.sql
INSERT INTO `fruit` (fruit_cd, fruit_name, price, quantity) VALUES 
(1, 'バナナ', 200, 10)	,
(2, 'りんご', 500, 5)	,
(3, 'みかん', 300, 8)	,
(4, 'パイナップル', 1000, 3)	,
(5, 'ぶどう', 400, 6)	,
(6, 'いちご', 600, 4)	,
(7, 'メロン', 1500, 2)	,
(8, 'スイカ', 800, 7)	,
(9, 'キウイ', 300, 9)	,
(10, 'マンゴー', 1000, 3)	;
```

この時、上記の`price`以外の値を除いたすべてを行（レコード）を取得したい場合、どうすればいいか？
サンプルコードを紹介します。

# サンプルコード

```py
import re

def extract_values(file_path, pattern):
    with open(file_path, 'r') as f:
        content = f.read()
    matches = re.findall(pattern, content)
    return [(int(match[0]), match[1], int(match[2])) for match in matches]

path = 'sample_sql/sample.sql'
values = extract_values(path, r'\((\d+), \'(\w+)\', \d+, (\d+)\)')
print(values)
```

実行結果は以下の通りです。

```
[(1, 'バナナ', 10), (2, 'りんご', 5), (3, 'みかん', 8), (4, 'パイナップル', 3), (5, 'ぶどう', 6), (6, 'いちご', 4), (7, 'メロン', 2), (8, 'スイカ', 7), (9, 'キウイ', 9), (10, 'マンゴー', 3)]
```

`price`以外が取得できていますね。

## サンプルコード解説
### ①正規表現のキャプチャグループを利用して取得する
大事なポイントは正規表現の箇所です。

この正規表現パターン`r'\((\d+), \'(\w+)\', \d+, (\d+)\)'`は、

数字（`fruit_cd`）、文字列（`fruit_name`）、数字（`price`）、数字（`quantity`）

の順にマッチします。

ここで、`fruit_cd`、`fruit_name`、`quantity`のみをキャプチャグループにすることで、これらのみが`re.findall`によって返される仕組みです。`re.findall`関数は、2つの引数を取り、それぞれ「検索する正規表現パターン」と「検索対象の文字列」を指定、マッチしたものはすべてリストとして返す関数です。

正規表現における`\d`は任意の数字（0-9までの一桁の数字）を表す文字クラスで、`\w`は任意の単語文字（数字、小文字、大文字）を表す文字クラスです。

今回利用した正規表現パターンをより詳細に書くと以下の通りです。

- ``\(``：括弧で始まる
- `\d+`：1つ以上の数字。キャプチャグループ（`()`で囲まれた部分）なので、マッチした部分は結果に含まれる
- `, `：コンマとスペース
- `\'(\w+)\'`：シングルクォートで囲まれた1つ以上の単語文字。これもキャプチャグループ
- `, `：コンマとスペース
- `\d+`：1つ以上の数字。`()`で囲まないことによりマッチした部分は結果に含まれないようになります
- `, `：コンマとスペース
- `\d+`：1つ以上の数字。キャプチャグループ
- ``\)``：括弧で終わる

キャプチャグループについては以下で解説してくださっているのでご参考までに。

https://www.javadrive.jp/python/regex/index15.html


公式ドキュメントはこちら。

https://docs.python.org/ja/3/library/re.html


### ②数値のデータは数値のまま返すようにする
2点目は、`return [(int(match[0]), match[1], int(match[2])) for match in matches]`です。
これがない場合、結果は以下のようになります。

```
[('1', 'バナナ', '10'), ('2', 'りんご', '5'), ('3', 'みかん', '8'), ('4', 'パイナップル', '3'), ('5', 'ぶどう', '6'), ('6', 'いちご', '4'), ('7', 'メロン', '2'), ('8', 'スイカ', '7'), ('9', 'キウイ', '9'), ('10', 'マンゴー', '3')]
```

元々数値だったデータが`''`のついた文字列の形で出力されてしまいます。

そこで、各タプルの1つ目（`fruit_cd`）と3つ目（`quantity`）の要素を整数に変換し、2つ目の要素（`fruit_name`）は文字列のまま返すようにしています。

文字列がなく全て数値の場合は以下のようにすればOKです。

```py
return [int(match) for match in matches if match.isdigit()]
```

すべてのマッチを整数として返すようになります。
世界一流エンジニアの思考法　第2章「アメリカで見つけたマインドセット」１

# 世界一流エンジニアの思考法(前回の続き)

## 第2章「アメリカで見つけたマインドセット」ー日本にいるときは気づかなかったことー
**-「Be Lazy」というマインドセット（仕事を加速するマインドセット）-**

*「より少ない時間で価値を最大化するという考え方」*
* 望んでいる結果を達成するために、最低限の努力をする
* 不必要なものや付加価値のない仕事をなくす
* 簡潔さを目指す
* 優先順位をつける
* 時間や費やした努力より、アウトプットと生産性に重点を置く
* 長時間労働しないように推奨する
* 会議は会議の時間内で効率的かつ生産的に価値を提供する

ここで取り上げられる一例として **「優先順位をつける」** がある。
⇨たくさんのタスクがある中で順位をつけるのではなく、「最初の1個をピックアップしてやったら他はやらない。その1個に集中（フォーカス）すること」であ離、意識することは、**より短い時間で価値を最大化・生み出すこと（＝どれだけビジネスインパクトを与えるのか）** ということ。

**-「リスクや間違いを快く受け入れる」-**

生産性を加速する上で重要なことは、**「リスクや間違えを快く受け入れる」** こと。

* 間違いを厳しく批判したり懲罰したりしない
* 失敗から学ぶ態度
* Fail Fast（早く失敗する）
* 実験が推奨されている
* 全員に「現状維持」や「標準」を要求せず、臨機応変が推奨される
* 非難や恐怖心のない環境

**成功しようが姉妹が、まずはやってみて、早くフィードバックを得て、早く間違いを修正ていく（＝「フィードバック」を歓迎する環境作り）**

## 気付きなど
現職の会社ではユーザーからの要望や不具合などに対してものすごいクレームを言われることがある。

そこでチーム内ではたくさん挙げることによってユーザーも使いやすくなるし、より良いシステムになるんだからどんどん上げていこう！など不具合に対してポジティブなシーンが多いと思った。

起票する際は不具合という名目ではなくよりポジティブな名称で挙げることがあったわ〜〜と思いました。
rexcornu Tech Blog はじめます

みなさんはじめまして。rexcornuでプロダクトや技術領域を担当しているさかもとです。
この度rexcornuではTech Blogをはじめることにしました！
これから皆さんぜひご愛顧（いいね！やブックマークなど）お願いします:grinning:
この記事では、会社の概要となぜブログを始めたのかの経緯などを簡単にご紹介したいと思います。

# はじめに：株式会社rexcornuについて

rexcornuは「人びとの努力に光を当て、新しいフェアネスを創る」というミッション、「テクノロジーを介して人と仕事と地域の距離を縮める」というビジョンのもと、エンジニアのプロフェッショナルサービスを提供しながら、2023年4月にはTechMatchという人材マッチングSaaSをリリースし、HR Tech領域のプレイヤーとしてチャレンジの日々を続けている会社です。

https://www.rexcornu.com/

https://c.tech-match.net/

# なぜTech Blogをはじめるのか

rexcornuでは、自社サービスの開発体制を構築するにあたり、エンジニアは社員だけではなく、副業も含む業務委託、学生インターンといった多様な形態のメンバーで構成しています。特に、学生インターンでジョインいただいているメンバはrexcornuのオフィスがある東京ではないところからフルリモートで関わっていただいている方も多くいます。実はこうした多様なメンバでチームが構成されているのは、rexcornuのビジョン「テクノロジーを介して人と仕事と地域の距離を縮める」を意識してのことです。

こうしたrexcornuのサービス開発に関わるエンジニアが、当社の日々の業務での成果や得られた教訓などを社外にも積極的に発信することで、普段業務で頑張っていることが発信に値する価値があるということを認識してもらったり、発信をすることにより、普段仕事を共にするメンバ以外からもフィードバックをもらう機会が創出されたり、業務の成果とはまた違った楽しさを感じてもらえると良いのではないかと考えました。また、こうした発信をすることは、エンジニアの市場価値を高めることにも寄与することがありますので、そうしたキャリア形成にもとても意義のあることではないかと考え、ブログをはじめよう、となりました。

そして、このブログの記事によって、普段全くrexcornuに縁のない方も含めた世の中のエンジニアのどなたかが抱える問題が解決したり、新たな取り組みに気軽にチャレンジしてみようと思ってもらえたらさらに嬉しいと思います。

# 今年の新たな取り組みとして新卒採用も

2024年は「テクノロジーを介して人と仕事と地域の距離を縮める」というビジョンに沿った新たな挑戦として、弊社の経営陣にゆかりのある九州地方の学生さんを対象とした新卒採用にチャレンジします。

このため、新卒採用でrexcornuに来ていただきたい学生の皆さんにも楽しんでいただけるよう、このTech Blogでは、経験のあるエンジニアからの技術トピックのみならず、インターン生エンジニアによる技術トピック、インターン活動を通したエンジニアリングの楽しさ、私たちのキャリア支援に対する考え方など、学生目線のコンテンツもたくさん発信していきたいと考えています。

# おわりに

これから色々と投稿するにあたり、最初は記事のクオリティとしては不十分な点も沢山出てくるかと思いますが、まずは楽しく発信していくことを重視していきたいと思いますので、読者の皆さんには暖かく見守っていただければと思います。

rexcornuでは、これからの会社の成長を共にしてくれる仲間を募集しています。

https://www.rexcornu.com/career

https://www.wantedly.com/companies/company_9295588/projects
[Unity]新しいURPテンプレートからプロジェクトを作成した時エラーが発生したら

# 概要
UnityのURP用テンプレートが新しく追加されました。

![スクリーンショット 2024-02-22 182312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/508c3011-a5b9-0ba7-1973-3e7f64ce1577.png)


実行時エラーが出て進めなくなった場合の解決手順を共有します。

:::note info
No valid user created or default window layout found. Please revert factory settings to restore the default layouts.
:::

![スクリーンショット 2024-02-22 182901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/be3cc373-7fb1-7e8c-4add-e942fbd805ae.png)

# 本文
ポップアップの「Revert Factory Settings」を押しても進めないと思います。一旦「Quit」を押して終了します。

その後、今回作成したプロジェクトのファイルから**プロジェクトフォルダ > Library**と辿った所にあるファイル「ArtifactDB」を削除するとエラーが出なくなります。（正常に起動出来た後「ArtifactDB」は勝手に自動生成されます）
![スクリーンショット 2024-02-22 183622.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/19e89f9b-fa85-a52e-7834-f3498b45b53b.png)
githubに誤ってAPIキーをあげてしまった時のお話

# はじめに
個人開発でのお話です。  
動作確認でAPIキーをハードコーディングで書いていたことを忘れてgithub上にpushしてしまったので、その時に行った対処法を備忘録用に書き起こしておきます。  

# 手順
## 1.APIキーを再発行(または削除)
僕の場合GoogleのAPIを使用していたのでAPIキーをすぐに削除しました。

## 2.対象のリポジトリに移動して対象のファイルを削除
APIキーを削除しているので必ずしもする必要はないのですが、ネット上にAPIキーの履歴が残ってしまっているのはあまりよろしくないと思い削除しました。  

以下コマンドを実行
```
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch {ファイル名を相対パスで記載}' HEAD 
```
実行することでリモートとローカル上の対象ファイルの履歴が全て消去されます。(ファイルの中身を残しておきたい場合はバックアップを取っておく)

## 3.正しい内容に修正してpush
正しいコードに書き換えた上でpushする。  
(ファイル自体を上げたくない場合は、.gitignoreに追加しておく)
```
git push -f
```

# 終わりに
今回は個人開発だったので特に何もありませんでしたが、チーム開発の際は大惨事になっていたと思うので、リモートに上げる前に再度確認すること、そもそもハードコーディングで書くことがないように気をつけようと思いました。  

是非弊社開発課のXのフォローもよろしくです！
毎日エンジニアに向けた情報発信を行っています！

https://twitter.com/tech_cin

# 参考
https://qiita.com/ftnext/items/be166d3eaa511ee068b5

https://git-scm.com/docs/git-filter-branch#_examples
rex0220 プラグイン 電話番号の半角自動変換とハイフォンチェック

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で半角自動変換・数字ハイフォン以外を削除、[項目検証プラグイン](https://qiita.com/rex0220/items/be20fd879f5e1bc9e035)で数字ハイフォンの形式チェックを行います。

# 概要

電話番号を半角数字とハイフォンの組合せで統一するため、計算式プラグインで半角自動変換・数字ハイフォン以外を削除。項目検証プラグインで形式チェックを行います。

![2024-02-22_18h14_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/849e626e-2d1a-c989-79f8-8205b0f73069.png)

# 計算式プラグイン設定

「循環参照を許可」をチェックします。

- 半角変換
- 正規表現で、数字とハイフォン以外を削除

![2024-02-22_18h21_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/44e2235a-90c2-ec4e-2f37-49b70bfe7358.png)

```.js
OPTION: 循環参照を許可

// テーブル.電話番号 SINGLE_LINE_TEXT (editable)
REPLACERE(ASC(電話番号),"[^0-9-]","g","")
```

# 項目検証プラグイン設定

電話番号のカスタムバリデーションチェックで、数字とハイフォンの組合せをチェックします。
※携帯電話は、エラーになります。

- 下記形式以外をエラーにする
    - 0 で始まる
    - 0n-nnnn-nnnn
    - 0nn-nnn-nnnn
    - 0nnn-nn-nnnn

![2024-02-22_18h19_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/99b9a76b-ffc6-c31a-db7f-2c81df0b92ee.png)

![2024-02-22_18h19_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/5a4466fe-0a22-862e-2f6d-3ca09c42ecf4.png)

```.js
// 電話番号カスタムチェック
NOT(TESTRE(電話番号,"^0([0-9]-[0-9]{4}|[0-9]{2}-[0-9]{3}|[0-9]{3}-[0-9]{2}|[0-9]{4}-[0-9])-[0-9]{4}$"))

// 電話番号カスタムメッセージ
"電話番号に問題があります"
```

## 携帯番号をエラーにしないチェック

※050-nnnn-nnnn の IP電話を含みます。

- 下記形式以外をエラーにする
    - 0 で始まる
    - 0n-nnnn-nnnn
    - 0nn-nnn-nnnn
    - 0nnn-nn-nnnn
    - 090-nnnn-nnnn
    - 080-nnnn-nnnn
    - 070-nnnn-nnnn
    - 050-nnnn-nnnn

```.js
// 電話番号カスタムチェック
NOT(TESTRE(電話番号,"^0([0-9]-[0-9]{4}|[0-9]{2}-[0-9]{3}|[0-9]{3}-[0-9]{2}|[0-9]{4}-[0-9]|[5789]0-[0-9]{4})-[0-9]{4}$"))

// 電話番号カスタムメッセージ
"電話番号に問題があります"
```
Nodeのmongodbでfindにprojection指定

バージョン
mongodb@3.7.4

```javascript:.js
// findOneの場合
db.collection('collection').findOne({ key: 'value' }, { projection: { _id: 0 } });

// findの場合
db.collection('collection').find({ key: 'value' }, { projection: { _id: 0 } }).toArray();
db.collection('collection').find({ key: 'value' }).project({ _id: 0 }).toArray();
```
この書き方で「_id」だけ取得対象外にできます。


ちなみに
```javascript:.js
db.collection('collection').findOne({ key: 'value' }).project({ _id: 0 });
```
これだと「project is not a function」と言われてエラーになります。
＜Python＞伝票の明細番号（連番）列を作成する

OMS、WMS、サプライチェーンで使用するマテハン関連機器間でのデータ連携検討は多々発生する。

注文伝票から出荷伝票にデータレイアウト変更を行うツールを作成する。

OMSで発行する注文伝票で明細番号のデータ項目がなかった。
WMS連携にあたり、各注文伝票の明細に連番を振ったデータ項目を追加することとなった。

.cumcount()　をつかって連番を振る。

```py
order['注文明細番号'] = order.groupby(['注文伝票番号']).cumcount()+1
```

pandasのDF型の"order"に「注文明細番号」という新たな列を追加。
既存の「注文伝票番号」ごとにグループ化を行う。
.cumcount()で、グループごとの連番を振る。
「0」から始まるため、1から連番が開始するように「+1」する。
配列をループして条件に合った要素のみで新しい配列を作成する

シェルスクリプトで配列をループして条件に合った要素のみで新しい配列を作成する方法について説明します。以下は一般的なBashシェルスクリプトの例です。

このスクリプトは、既存の配列をループして条件に合致する要素のみを新しい配列に追加します。例えば、特定の条件（この例では数値が5より大きいかどうか）を満たす要素のみを選択します。

```bash
#!/bin/bash

# 既存の配列
original_array=(1 2 3 4 5 6 7 8 9 10)

# 新しい配列を初期化
new_array=()

# 既存の配列をループ
for i in "${original_array[@]}"; do
  # 条件を満たす場合のみ新しい配列に追加
  if [ "$i" -gt 5 ]; then
    new_array+=("$i")
  fi
done

# 新しい配列を表示
echo "新しい配列: ${new_array[@]}"
```

このスクリプトは、`original_array`の各要素をループし、それが5より大きい場合にのみ`new_array`に追加します。最後に、`new_array`の内容を表示します。

条件を変更することで、異なる種類のフィルタリングを実行できます。例えば、文字列が特定のパターンに一致するかどうかを確認したり、数値が特定の範囲内にあるかどうかを確認することができます。

この例では、数値の比較を行っていますが、文字列の比較や他の複雑な条件を用いることも可能です。条件を変えることで、さまざまなシナリオに応じた配列の再構築が可能になります。
【PowerAutomate】現在の日付を取得する


今回は現在の日付を取得する方法について覚え書きしていきたいと思います！


## 現在の日付を取得する

### step1

アクションの追加⊕を押してアクションを追加します。

検索窓で「日時」と入力し、日時アクション群を表示させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/07f3f6c8-60d0-ff21-1d3b-ed72c598a9c1.png)

### step2

日時アクション群の中から「タイムゾーンの変換」アクションを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/2dbff35f-6a8c-316c-320b-1b2f0b830e9e.png)

### step3

それぞれの項目を埋めていきます。
必須項目の内容については以下を入力してください。

■ 基準時間：`utcNow()`
⇒関数を利用します。
fx欄に`utcNow()`と入力した後、OKボタンを押すことでアクション内に関数を設定することができます。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/7163d243-5882-9a5f-b763-dd1a64a05678.png)

■ 変換元のタイムゾーン：`(UTC) 協定世界時`　_←ドロップダウンから選択_
■ 変換先のタイムゾーン：`(UTC+09:00) 大阪、札幌、東京`　_←ドロップダウンから選択_

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/7794d518-adf6-a2c6-65e5-cb5a3e2bc84e.png)

<dl>
  <dt>書式設定文字列について</dt>
  <dd>上記の画像のようにドロップダウンから選択することも可能ですが、日本で使われている書式ではないため、カスタム値の入力を利用するのが良いと思います。</dd>
  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/aa94b125-1b38-ee5e-3027-672f73c4da55.png)

  <dd>日付フォーマットについては一般的に使われている通りです。</dd>
<br>
  <dt>よく使うもの</dt>
  <dd>⇒ yyyy/MM/dd</dd>
  <b><font color = "red">
  <dd>ちなみに、アクション内で同時に時間も取得しているため、フォーマットを指定すれば表示させることができます。</dd></font></b>
  <dd>⇒ yyyyMMddHHmm</dd>
</dl>

[➡日付フォーマットについてはこちらをどうぞ！](https://qiita.com/etoootak/items/c3547cab3e46ab097fa6)


## 実行してみる

カスタム値でyyyy/MM/ddのフォーマットを指定し、実行してみると、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/0fcd2360-1439-2de3-7e83-05430cd9cf77.png)

きちんと取得できていることが確認できました◎！


## おわりに

読んでいただきありがとうございました！

ファイルの命名等で現在の日付を取得したい時にぜひご活用ください。

お役に立てれば幸いです。
PythonでPDFドキュメントにページ番号を挿入する方法

ページ番号は、多くの種類のファイルで重要な情報であり、読者がドキュメント内をナビゲートする際に便利です。PDFドキュメントを作成する際に、ページ番号を追加することは、コンテンツの整理や参照に特に役立ちます。本記事では、Pythonプログラムを使用して効率的に**PDFドキュメントにページ番号を挿入**し、美しい構造のPDFドキュメントを作成する方法について説明します。

- **[Pythonを使用してPDFドキュメントのフッターにページ番号を挿入する](#pythonを使用してpdfドキュメントのフッターにページ番号を挿入する)**

この方法には、[Spire.PDF for Python](https://www.e-iceblue.com/Download/Spire-PDF-Python.html)を使用します。公式ウェブサイトからダウンロードするか、PyPIを通じてインストールすることができます：`pip install Spire.PDF`。

## Pythonを使用してPDFドキュメントのフッターにページ番号を挿入する
Spire.PDF for Pythonの **PdfPageBase.Canvas.DrawString()** メソッドを使用すると、PDFドキュメントの任意の場所にカスタムのページ番号を描画することができます。以下にPDFドキュメントのフッターにページ番号を挿入する手順を示します：

1. **PdfDocument** クラスのオブジェクトを作成します。
2. **PdfDocument.LoadFromFile()** メソッドを使用してPDFドキュメントをロードします。
3. **PdfDocument.PageSettings.Margins** プロパティを使用して、ドキュメントの余白を取得します（ページ番号の位置の計算に使用されます）。
4. ドキュメント内の各ページをループしてページ番号を描画します。
5. **PdfDocument.Pages.get_Item()** メソッドを使用して1ページを取得します。
6. **PdfTrueTypeFont** クラスと **PdfStringFormat** クラスのオブジェクトを作成し、ページ番号のテキストの書式と配置方法を設定します。
7. 位置を計算し、ページ番号のスタイルを設定します。
8. **PdfPageBase.Canvas.DrawString()** メソッドを使用してページにページ番号を描画します。
9. **PdfDocument.SaveToFile()** メソッドを使用してドキュメントを保存します。

**コードの例：**
```python
from spire.pdf.common import *
from spire.pdf import *

# PdfDocumentクラスのオブジェクトを作成する
doc = PdfDocument()

# PDFドキュメントをロードする
doc.LoadFromFile("サンプル.pdf")

# ドキュメントのページ余白を取得する
margin = doc.PageSettings.Margins

# ドキュメント内のページを反復処理する
startNumber = 1
for i in range(doc.Pages.Count):
    # ページを取得する
    page = doc.Pages.get_Item(i)

    # ページ番号のためのフォントと文字列フォーマットを作成する
    font = PdfTrueTypeFont("HarmonyOS Sans SC", 12.0, PdfFontStyle.Regular, True)
    format = PdfStringFormat(PdfTextAlignment.Center)

    # ブラシを作成する
    brush = PdfBrushes.get_DarkGray()

    # ページ番号を描画する位置を計算し、ページの下部中央に配置する
    space = font.Height
    x = margin.Left
    width = page.Canvas.ClientSize.Width - margin.Left - margin.Right
    y = page.Canvas.ClientSize.Height - margin.Bottom - space

    # ページ番号のスタイルを設定する
    numberLabel = "ページ {0:d} / {1:d}".format(startNumber, doc.Pages.Count)
    startNumber += 1

    # ページにページ番号を描画する
    page.Canvas.DrawString(numberLabel, font, brush, x + width / 2, y, format)

# 変更されたドキュメントを保存する
doc.SaveToFile("output/PDFページ番号.pdf")
doc.Close()
```

**追加効果：**
![PythonでPDFドキュメントにページ番号を挿入する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/6c8d7fc6-841e-8fde-59af-333fcedaa573.png)

上記の内容では、Spire.PDF for Pythonを使用してPDFドキュメントにページ番号を挿入する方法について説明しました。このAPIは、他にも多くのPDF操作をサポートしていますので、[Spire.PDF for Pythonチュートリアル](https://www.e-iceblue.com/Tutorials/Python/Spire.PDF-for-Python/Program-Guide/Spire.PDF-for-Python-Program-Guide-Content.html)で詳細を確認してください。

技術サポート：[Spire.PDFフォーラム](https://www.e-iceblue.com/forum/spire-pdf-f7.html)

[一時ライセンスの申請](https://www.e-iceblue.com/TemLicense.html)
親インスタンス部分のメソッドやフィールドを利用するには

親インスタンス部分のメソッドやフィールドに子インスタンスからアクセスする事が可能です。

~~~:親インスタンス部分のフィールドを呼び出す方法
super.フィールド名
~~~

~~~:親インスタンス部分のメソッドを呼び出す方法
super.メソッド名(引数)
~~~
※引数が無い場合は（）で動作します。
SVNリポジトリ内で特定のファイルが存在するかどうかを確認する

`svn` リポジトリ内で特定のファイルが存在するかどうかを確認するためには、`svn ls` コマンドを利用できます。以下に示すシェルスクリプトのスニペットは、リポジトリ内に `a` という名前のファイルが存在するかどうかを確認する方法を示しています。

```bash
#!/bin/bash

# SVNリポジトリのURLを設定します
REPO_URL="https://your_svn_repository_url"

# 確認したいファイル名
FILE_NAME="a"

# svn ls コマンドを使用してファイルが存在するかどうかを確認します
if svn ls $REPO_URL | grep -q "^$FILE_NAME$"; then
    echo "ファイル $FILE_NAME がリポジトリに存在します。"
else
    echo "ファイル $FILE_NAME がリポジトリに存在しません。"
fi
```

このスクリプトでは、`svn ls` コマンドを使用してリポジトリの内容を一覧表示し、`grep` コマンドで特定のファイル名を検索しています。ファイルが存在する場合はその旨を表示し、存在しない場合は別のメッセージを表示します。

スクリプトを実行する前に、`REPO_URL` 変数を実際の SVN リポジトリの URL に置き換えてください。また、このスクリプトを実行するには SVN クライアントがシステムにインストールされている必要があります。

リポジトリのパスがディレクトリ構造を含む場合や、確認したいファイルがサブディレクトリにある場合は、`$REPO_URL` 内で適切なパスを指定してください。
自分的には重要なお知らせ

# お知らせ
明日（２月２３日）にRaspberry pi 5 4GBがDigikeyから届くので、ラズパイでしたいことを書く。
# リスト
- Ubuntu Server をインストール
- ワードプレスをインストールし、ブログサーバーを切り替える
- もう一つ運営しているサイトも移し替え、少々規模が大きい言語変更（PHPからDartへ切り替え）
- Ubuntu serverにもともと入っているフレームワークをアップデートさせる。

Fin

# 終わりに
これらを自分のブログやQiitaにこれから書いていこうと思います。
4GBでメモリ足りるかな...？
XAMMP環境構築（初心者）

# ファイル類の準備
1.backlog中のGitのmasterをコピー。
2.デスクトップに適当にフォルダーを作って中で右クリック。
3. ** Git Clone... **をクリックしてダウンロードする。

# XAMMPの準備
backlogのWikiに各バージョンが書いてあるのでそれに合わせる。

ザンプ公式→Windows版→（例）7.2.34をクリック。

**portable、64bit、installer**の文字が入っているフォルダをダウンロード。

* * *
**＊１つのPCで複数のXAMMPを入れる場合**

スタートボタンを右クリック→　システム→　詳細設計→　環境変数→

下枠の中の**path**をクリック→　新たなpathを入力→　上下で上に来たものが起動する。

コマンドプロンプトで **php -v**  現在の起動しているバージョンを確認する。

* * *
 **Node のバージョンを切り替えて使用する「nvm-windows」**

**主に使用するコマンド一覧**

node -v
npm -v
nvm ls
nvm use 16.13.2（バージョンは例）
npm list vue　(vueのバージョン確認)

**npm　install**
**composer install**
**npm run watch**

* * *
カスタム投稿タイプのsingleページで「前のページへ」「次のページへ」を表示

## 三つ目の値をTRUEにすると動かない
動くコード↓
```php
<?php next_post_link('« %link', '前の記事へ'); ?>
```

```php
<?php previous_post_link('%link »', '次の記事へ'); ?>
```
Automatic Termination for Neural Architecture Search #3

## 4. Proposed method
ATNASの過去のハイパパラメータの分布と今のハイパパラメータ分布gap(不一致）の評価に基づく早期終了をおこなう。
## 4.1 Upper bound for gap between expected value of generalisation errors
NASに焦点を当て式１の汎化誤差を最小化するようなものを見付けることを目的とする。
過去のハイパパラメータの分布と今の分布のgap(異なる点）に注目する。確率的に緩和することで、pθの分布からサンプルする。pθとpθ-1の汎化誤差によるgapについて考える
```math
J(w_t, \theta_t)-J(w_{t-1},\theta_{t-1})
```
ゼロに収束するように勧める
ハイパパラメータの分布を過去と現在は直接計算することができない。なぜなら汎化誤差はアーキテクチャ探索を行っている間は計算できないから。なので上の式の最大値のgap（差、相違）を決めてしまい、閾値の上限を計算する過程によって終了を決定する。
酔って上限がrtよりも小さくなるにつれて私たちは定理4.1を考えた。
## Theorem 4.1
```math
 E_{pθt (c)}[L(w, c)]−E_{pθt−1 (c)}[L(w, c)] ≤ (b−a)\sqrt{
 \frac{1}{ 2}DKL(p_{θt} (c)∥p_{θt−1} (c))}
```
aはＬの最大値、bはＬの最小値として、pとqのＫＬダイバージェンス。ここでのダイバージェンスとは分布の類似度を示す指標。
pθは離散分布で表すことができるので、したがってＫＬダイバージェンスの計算も簡単になります。
また上記の定理を使用して上限値を計算できますが、wt+1 = wtの場合に限りる。しかし、重みwはNAS手順で更新される。したがって、定理4.1は直接適用することはできない。そこで、テイラー展開を用いて近似する。
以下テイラー展開したしきとテイラー展開の説明
もと論文式４，５参照
式５から定理4.1は
```math
 J(w_{t},\theta_{t}−J(w_{t-1},\theta_{t-1}) ≤ (b−a)\sqrt{
 \frac{1}{ 2}DKL(p_{θt} (c)∥p_{θt−1} (c))} + T′_{ n}(w_{t},θ_{t}) + R_{n}(w_{t},θ_{t}).
```
次に、残差項Rn(w,θ)を除去します。Jをwに関するCnクラスとします。すべてのw ∈ [wt−1, wt−1 + d] に対して J(w,θ) ≤ M であり、∥wt − wt−1∥ < d であると仮定します。すると、次の不等式が得られます。
```math
 J(w_{t},\theta_{t}−J(w_{t-1},\theta_{t-1}) ≤ (b−a)\sqrt{
 \frac{1}{ 2}DKL(p_{θt} (c)∥p_{θt−1} (c))} + T′_{ n}(w_{t},θ_{t}) + \frac{M}{n!}||w_{t}-w_{t-1}||^n.
```
T′nは0次の項を除いたn次のテイラー多項式であり、J(w,θ) ≤ M とします。
テイラー展開の話式6,7
## 4.2 Automatic determination of threshold
提案されているのは、上限 rt が閾値 λt 未満になった場合にアーキテクチャサーチを停止することです。典型的な NAS の設定では、検証データが利用可能であり、トレーニング/検証データを使用して終了閾値を自動調整する動機があります。最近の研究（Makarova et al., 2022）では、ベイズ最適化による予測モデルのハイパーパラメータ調整における過学習の問題を緩和するための早期停止基準が提示されています。終了は、単純な後悔の上限が汎化エラーの標準偏差よりも小さくなったときにトリガーされます。直感的には、終了は、最大の妥当な改善が推定の標準偏差（揺らぎ）よりも小さくなったときにトリガーされます。この終了戦略に着想を得て、我々は汎化エラーの標準偏差を閾値 λt として選択することを提案します。Nadeau と Bengio（1999）は、トレーニングおよび検証データの k-fold クロスバリデーションから汎化エラーの標準偏差を推定します。ここで、ˆ s2t は NAS の t 番目のエポックにおける k-fold クロスバリデーションによる推測モデルの標本分散を表し、|Strain| と |Sval| はそれぞれトレーニングデータと検証データのサイズを表します。ASNG-NAS の場合、ˆ s2t はクロスバリデーションを実行する代わりに、検証データ（5-fold）を分割して検証エラーの標準偏差を計算します。我々の提案された基準は、（期待される）汎化エラーとの間のギャップに基づいており、それを推定された汎化エラーの標準偏差と比較するのは自然です。ここで注記しておくと、推定された標準偏差 λt は ASNG-NAS の各エポックで容易に計算でき、無駄なオーバーヘッドが発生しません。各停止アルゴリズムに必要な計算時間を補足資料でベンチマークします。

## 4.3 Application to DARTS
提案された方法は、ASNG-NAS の設定を使用して停止基準を定式化しており、そのため DARTS に直接適用することはできません。特に、DARTS では、最適化の対象が汎化エラーの期待値ではなく、アーキテクチャパラメータが確率的リラクゼーションに基づくのではなく、連続リラクゼーションに基づいています。我々は softmax exp(α(i,j)ν) / ∑K−1ν′=0 exp(α(i,j)ν′) を多項分布パラメータ分布と解釈し、それを前の探索エポックの分布と比較します。我々が停止基準として使用する rt の定義における pt と pt−1 は、softmax によって計算される事後分布です。閾値の自動決定のために、ワンホットの離散化が行われ、各エポックの終わりに Eq. (8) によって閾値が自動的に計算されます。
ZED2iで人体検出を行う

StereoLabのZED2iを触る機会があったので、その備忘録。
# 機材

・ZED2i

https://www.stereolabs.com/products/zed-2

・サンワダイレクト USB延長ケーブル 10m USB 3.2/3.1 Gen1 アクティブ ACアダプタ付 500-USB068

https://www.amazon.co.jp/%E3%82%B5%E3%83%B3%E3%83%AF%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88-USB%E5%BB%B6%E9%95%B7%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96-AC%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E4%BB%98-500-USB068/dp/B08DFF7NDF/ref=sr_1_9?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2HDBQ3SNXJ1UF&dib=eyJ2IjoiMSJ9.RmbtGYlXI6kGhfzhT9UkbX_oCHVJK4N-acg7_6xevZcIuA2ya8guqB8xJ9UA_b7MJ4GtdpZ2iaGoXBWqQNtrHcCk8HP78AeIRAkjUFudP0nz_ZD1hbHRqjBuI4fUKLadyX1A-Sn0LiHQvin7qFq6fioDN7OiyknYH3-5uc3lwxtwqnCc0_PQ6dBYSeFA9eahlHCwO0R265AaBcFsyKmSK3KarsE_xh9lxPnGdopVOc8_MhbbXwrcGTxuUWRoJ41DUAiEJbLsfAFtNP7vvqI6E1N62Ma4b2CDTlVq-yvUHwg.BNSsrVhf7iLpAJ1zdwyC1dtGDZ_bTXM5YfnneByic64&dib_tag=se&keywords=%E3%82%B5%E3%83%B3%E3%83%AF%E3%82%B5%E3%83%97%E3%83%A9%E3%82%A4+usb+%E3%83%AA%E3%83%94%E3%83%BC%E3%82%BF%E3%83%BC+10m&qid=1708570184&sprefix=%E3%82%B5%E3%83%B3%E3%83%AF%E3%82%B5%E3%83%97%E3%83%A9%E3%82%A4+usb+%E3%83%AA%E3%83%94%E3%83%BC%E3%82%BF%E3%83%BC+10m%2Caps%2C170&sr=8-9

# ZED2iのスペック
・ニューラルデプスセンシング
・空間オブジェクト検出
・次世代IMU、ジャイロスコープ、気圧計、磁力計内蔵
・**120°の広角FOV**　
・サーマルコントロール付きオールアルミニウムフレーム 
・反射除去用内蔵ポラライザー（オプション
・IP66の防水・防塵性能
・安全なUSB Type-C接続（1.5mのロックケーブル付属）

※公式サイト参照

おそらくKinectの上位互換な上、Unity用のプラグインが用意されています。

# 開発環境
・Windows11
・Unity 2022.3.18f1

# ZED2iを選定した理由
ふわふわ遊具にいる人（複数人）をセンシングする必要がありました。
最初は側域センサを使用する想定でいましたが設置条件が合わず断念。
ZEDを試しに使ってみたところ精度もよく距離や画角も丁度良かったのでこちらのセンサを使用することにしました。

# 人体検出を行う
基本的にはこちらのUnity用プラグインのreadmeにそって必要な手順を踏めばOKです。

ZED を使用して Unity でアプリケーションを開発するには、次のものが必要です。

・[ZED SDK](https://github.com/stereolabs/zed-unity?tab=readme-ov-file)をダウンロードしてインストールする。
・Unity 用の [ZED プラグイン](https://github.com/stereolabs/zed-unity/releases)のUnitypackageをgithubからダウンロードし、UnityProjectにインストールする。

:::note warn
CUDAのインストールもする必要があります。
これを忘れると動かないので注意。
:::

# プラグインをUnityにインストールする
まずUnityにプラグインをインストールしてみると以下のエラーがでる。
```error
Assets\ZED\SDK\Helpers\Scripts\Utilities\ZEDSupportFunctions.cs(5,22): error CS0234: The type or namespace name 'Management' does not exist in the namespace 'UnityEngine.XR' (are you missing an assembly reference?)
```

```
Shader error in 'Custom/Green Screen/Green Screen URP': Couldn't open include file 'Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl'. at line 49
```
とりあえずXRpluginManagementとURPをインストールすると無事エラー解消し、ZEDのポップアップが表示されるのでAccseptAllをクリック。![スクリーンショット 2024-02-22 120131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524352/53b5794f-0dd5-66a7-66a4-e149266b2072.png)
これでセッティング完了。
# サンプルを触ってみる
3DObjectDetectionシーンを開いてみる。
動いた。

![実験動画.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524352/2196840e-7e84-25ea-471d-7ec264d3b35e.gif)

:::note warn
機械学習モデルのインストールにかなり時間がかかるようなので注意。
![2024-02-02_182952.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524352/6075dff4-8174-b992-cca6-5fefcce910f7.png)
:::

# まとめ
キネクトの上位互換どころかボディトラッキングの精度によっては測域センサの代わりにもなりそうです。
また、ZED2iが自己位置を出してくれる（床からの高さや回転など）ためキャリブレーションが非常にやりやすく現場で調整もやる身としてはありがたいです。
引き続き他のサンプルも検証していきたいです。
AWS SAA-C03受験記

# はじめに
AWS認定SAA-C03の試験に辛くも合格できましたので、勉強方法と受験の感想について書いておきます。
これからSAA-C03受験を考えている方の参考になれば幸いです。

# 前提
・AWSの実務経験は1年程度

# 教材
・「AWS認定資格 ソリューションアーキテクトアソシエイトの教科書: 合格へ導く虎の巻 Kindle版」※私が購入した時点ではkindle版は無料でした。
・Udemy「【SAA-C03版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座」
・AWSのサンプル問題※AWSのサイトからダウンロードができます。

# 勉強方法
書籍は少しづつ半年程度かけて読みました。
Udemyはsectionをすべて受講し、直前の1週間は模擬試験を時間の限り実施しました。試験を受験する直前でも正解率は60%ぐらいでした。
AWSのサンプル問題は10問程度ですが、回答と解説が付いていますので繰り返し解きました。

# 試験内容
・選択問題のみ(複数選択もあり)
・65問 140分
※私はピアソンVUEのテストセンターで受験しました。
# 受験結果
結果は738/1000でした。合格ラインが720なので本当にギリギリでした。

# 受験の感想
正直今回の試験はあまり自信がありませんでした。
受験中は時間をかけて問題分を読み解きましたが、それでも20分程時間が残っていました。
合格点ギリギリでしたので、あまり合格に向けたコメントもし辛いですが、勉強も試験もあきらめずに最後までやりきることが大切だと改めて思いました。
# 追記
受験後に試験端末に結果が表示されなかったため、受験直後は落ちたものと思っていました。試験結果は数時間後にメールで通知が来ました。
AWS Hands-on for Beginners を理解しながら進めてみた #3


<br></br>
### #3 [AWS Hands-on for Beginners 〜 スケーラブルウェブサイト構築編 〜](https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Network-3-2022-reg-event.html?trk=aws_introduction_page "ハンズオン公式サイト")

# 目的
[前回](https://qiita.com/okigaruni_/items/9a7e13df357cff82f6fe "Network編#3")に続き、[今回](https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Scalable-2022-reg-event.html?trk=aws_introduction_page "スケーラブルウェブサイト構築編") はスケーラビリティと冗長性に優れたブログサイトの構築が目的のハンズオンです。要点として、まずWebサーバーを立ててWordPressをインストールします。そして、ELB(ALB)にインスタンスを登録することで負荷分散を実現します。この2つのセキュリティグループを通じて、HTTP通信のインバウンドルールを設けます。また、RDS(MYSQL)にはスタンバイインスタンスを用意し、データを同期した予備のDB(スタンバイインスタンス)を用意します。
ハンズオンの最後では、冗長性を確かめる次のオプションが用意されていました。
① 実際にWebのインスタンスを停止させ、ELBに登録したもう一方のEC2が機能し、負荷分散を確認する
① プライマリDBを再起動し、スタンバイインスタンス(セカンダリDB) の機能を確認する
<br></br>
# 本題

以下が、今回のハンズオンの全体像になります。
##### ネットワーク構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850329/f51fda02-a702-b1c8-6a7a-33fa44c3a6b8.png)
##### ルートテーブル一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850329/c4d05d96-6c87-d6d0-ea1b-513eb6141894.png)
##### セキュリティグループ一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850329/4a44e2a0-023b-be3e-4001-037cdbe7887d.png)
<br></br>
次に、大まかな手順について説明します。

1. VPCの作成と同時に、AZやサブネットなどその他のリソースも作る
1. ユーザーデータ(インスタンス起動時に実行されるスクリプト)にWordPressのダウンロード設定をしたEC2を立てる
1. RDSでDBインスタンスを立てる (セキュリティグループの指定に注意する) **※1**
1. ELBを作成し、ターゲットグループなどを適切に設定する
1. WordPressの初期設定をする
1. WordPressのEC2からAMIを作成する
1. AMIからEC2を作成し、ELBのターゲットグループに追加する
1. RDSでスタンバイインスタンスを作成し、適用する
1. 目的で述べたオプション①, ②を実施する


:::note warn
※1  DB はパブリックサブネットのEC2からのアクセスのみを受け付けたいので、インバウンドルールのソースにパブリックサブネットのEC2のセキュリティグループを指定する。これはDBインスタンスで一般的な仕様である。
また、DB作成時のデータベース名やパスワードは、WordPressの初期設定に利用するので控えておく。
:::

# 振り返り
前回に引き続き、セキュリティ面を意識してハンズオンに取り組みました。システムがより複雑になればなるほど、ルートテーブルやセキュリティグループが細かくなると想定されるので、アンテナを張りながらこれからのハンズオンを進めたいと思います。
また、VPCを削除する際に、紐づいたルートテーブルやサブネットを削除してくれるのは便利だと感じました。その一方で、RDSのサブネットグループや、EC2のAMIとそのスナップショットなどは含まれないので、削除し忘れないように注意しようと思いました。

# その他
思い返すと以前に個人開発をしたWebアプリの[構成](https://qiita.com/okigaruni_/items/ab0b353091c77539c425#%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E6%A7%8B%E6%88%90)と似ていたなーと感じました。ただ、無料利用枠の都合でEC2を一つしか立てていなかったので、今回はELBの本来の機能を確認出来て面白かったです。
<br></br>
最後まで記事を読んでくださり、ありがとうございます。もし内容に誤りがございましたら、ご指摘いただけますと幸いです。
SVNのXMLファイルを解析し、更新日付が120日以内のディレクトリ名を出力する

Python 2.7でXMLファイルを解析し、更新日付が120日以内のディレクトリ名を出力するスクリプトを作成します。Python 2.7では、`xml.etree.ElementTree` モジュールを使用してXMLの解析を行うことができます。以下はそのためのスクリプト例です。

この例では、svnのxml出力ファイルが `svn_info.xml` という名前であると仮定しています。また、svnのxml形式が具体的にどのような構造を持っているか不明なため、一般的な形式に基づいてスクリプトを作成します。更新日付が含まれている要素や属性の名前を、あなたのファイルの実際の構造に合わせて適宜変更してください。

```python
import xml.etree.ElementTree as ET
from datetime import datetime, timedelta

# SVNのXMLファイルを読み込む
tree = ET.parse('svn_info.xml')
root = tree.getroot()

# 現在の日付と120日前の日付を計算
now = datetime.now()
delta = timedelta(days=120)
cutoff_date = now - delta

# 更新日付が120日以内のディレクトリ名を出力
for entry in root.findall('.//entry'):
    # entry要素のkind属性がdirectoryであることを確認
    if entry.get('kind') == 'directory':
        # commit要素とその子要素dateを見つける
        date_element = entry.find('.//date')
        if date_element is not None:
            # 日付文字列をdatetimeオブジェクトに変換
            date_str = date_element.text
            # SVNのXMLから取得した日付の形式に合わせてください
            commit_date = datetime.strptime(date_str, '%Y-%m-%dT%H:%M:%S.%fZ')

            # 日付が120日以内であればディレクトリ名を出力
            if commit_date > cutoff_date:
                print(entry.get('name'))
```

このスクリプトは、次の手順に従います：

1. `xml.etree.ElementTree`を使用してXMLファイルを読み込む。
2. 現在の日付から120日前の日付を計算する。
3. XMLファイル内のすべての`entry`要素を検索し、その`kind`属性が`directory`であるか確認する。
4. 各ディレクトリの`commit`日付が120日以内であるか確認する。
5. 条件を満たすディレクトリ名を出力する。

このスクリプトを実行する前に、`svn_info.xml`ファイルが存在し、正しい形式であることを確認してください。また、日付の形式（`%Y-%m-%dT%H:%M:%S.%fZ`）があなたのXMLファイルの形式と一致するように、適宜変更してください。
メモ　ShaderGraph Built-InからURPへ変更したときの作業

Unity 2022.3.18f1
結構悩んだのでメモ

・ShaderGraphを適用しているマテリアルがprojectをURPへ変更したときにピンク色になり
使えなくなったときにしたこと

ShaderGraph→GraphInspector→Target SettingsにプラスボタンからUniversalを追加
Universalタブが追加されるので設定をコピー
GPUを誰が使っているかを表示する方法

# 概要
共有のGPUで、誰がGPUを使ってるのか確認する方法。


# [py3nvml](https://github.com/fbcotter/py3nvml)
```
pip3 install py3nvml
py3smi -l 1 # update every 1 sec
```

# nvidia-smi & ps

```
nvidia-smi # check PID
ps -u | grep "PID"
```
Promiseについて

### なぜPromiseが必要なのか？

1. 非同期処理のコールバック関数地獄はネストが深くなる上に、エラー処理が相まって、可読性を著しく下げる傾向があります。このコールバック地獄を避けるために考えられたの仕組みが、Promiseです。
2. 非同期処理中に発生した例外を扱う仕様はありませんでした。

## 内容

1. 非同期処理についての理解
    
    非同期処理とは 通常はコードを順番に処理していくが 非同期処理では一つのが終わるのを待たずに次の処理を評価します。 つまり非同期処理では同時に実行している処理が複数あります。 代表的なのがSetTimeout等
    
2. Promiseの概念を理解
    
    非同期処理とは 通常はコードを順番に処理していくが 非同期処理では一つのが終わるのを待たずに次の処理を評価します。 つまり非同期処理では同時に実行している処理が複数あります。 代表的なのがSetTimeout等
    

### SetTimeout例：

```jsx
    setTimeout(() => {
        console.log("3. ブロックする処理を開始します");
        blockTime(1000); // 他の処理を1秒間ブロックする
        console.log("4. ブロックする処理が完了しました");
    }, 10);
```

### Promise例：

```jsx
    // funnction内でリターンせずにもプロミスインスタンスは作れるが引数が取れないのでこれでは使わないだろう。

    const promise = new Promise(function(resolve, reject){
            resolve();
        });

    // この形でもし使うとしたら、一つのインスタンスを作って返すようにする。
    const promise = Promise.resolve(555);

    // 呼び出しは
        promise.then(r =>{
            console.log(r);//555
        });
```
　
## 補足（ここから細かく解説）

### promise キャッチの法則

### なんとなく例

```jsx
    setTimeout(() => {
        console.log("3. ブロックする処理を開始します");
        blockTime(1000); // 他の処理を1秒間ブロックする
        console.log("4. ブロックする処理が完了しました");
    }, 10);
```

## 参考

https://jsprimer.net/basic/async/#sync-processing

https://techplay.jp/column/581
矩形を描画する

# 関連記事

https://qiita.com/yokan/items/81eb493d177da9d96c56

# 開発環境
- Windows11
- Visual Studio 2022
- DXライブラリ Ver3.24d

# 矩形の描画
DrawPixel関数とループを組み合わせることで矩形（すべての角が直角の四辺形）を描くこともできますが、DXライブラリには矩形を描画する`DrawBox`関数が用意されています。

```cpp
#include "DxLib.h"

int WINAPI WinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpcmdLine, _In_ int nCmdShow )
{
    // ウィンドウモードで起動
    ChangeWindowMode( TRUE );

    // DXライブラリの初期化
    if( DxLib_Init() == -1 )
    {
        // -1ならエラーとして終了
        return 0;
    }

    // 矩形の描画
    DrawBox( 100, 100, 200, 200, 0xFFFFFF, TRUE );

    // プログラムの一時停止
    WaitKey();

    // DXライブラリの破棄
    DxLib_End();

    return 0;
}
```

**実行結果**

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713748/acb4f5f9-d34d-f33a-0993-445ea0f1402c.png)

# DrawBox関数の引数

DrawBox関数の引数を日本語にすると以下のような形になります。

```txt
DrawBox( 左上頂点のX座標, 左上頂点のY座標, 右下頂点のX座標, 右下頂点のY座標, 色, 塗りつぶしフラグ );
```

### 座標

第一引数から第四引数までが座標の指定です。この値で描画する矩形の位置や大きさが決定します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713748/9691b7fa-7946-3747-3c32-f7af28db2acf.png)

### 色
第五引数は矩形の色の指定です。サンプルプログラムでは16進数(0xFFFFFF)で指定し、この場合は白になります。16進数による色の表現については関連記事の[ピクセルの描画と座標・色の考え方](https://qiita.com/aozora_doro/items/81eb493d177da9d96c56)で紹介しています。

### 塗りつぶしフラグ
第六引数は塗りつぶしのフラグで`TRUE`か`FALSE`を指定します。TRUEにすると単色で矩形が塗りつぶされます。FALSEを指定すると輪郭のみ描画されます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713748/4d3344c0-bca1-f7f6-8e5d-93b8613aae11.png)

## 重なったとき
矩形が重なるような位置に描画されたときは、**後から描画した矩形が前面に表示されます。**

```cpp
#include "DxLib.h"

int WINAPI WinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpcmdLine, _In_ int nCmdShow )
{
    // ウィンドウモードで起動
    ChangeWindowMode( TRUE );

    // DXライブラリの初期化
    if( DxLib_Init() == -1 )
    {
        // -1ならエラーとして終了
        return 0;
    }

    // 矩形の描画
    DrawBox( 50, 50, 150, 150, 0xFFFF00, TRUE );   // 黄色の矩形
    DrawBox( 100, 100, 200, 200, 0xFF0000, TRUE ); // 赤の矩形

    // プログラムの一時停止
    WaitKey();

    // DXライブラリの破棄
    DxLib_End();

    return 0;
}
```

**実行結果**

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713748/c36b046b-bfa7-12d0-96b8-68931c93542a.png)

DrawPixel関数やその他の描画関数を使用した場合も、要素が重なった際には後に描画された要素が前面になるように表示されます。

## 座標の指定を逆にしたとき
通常、左上の座標が右下の座標より数値的に小さくなるような値は渡しませんが、渡すとどうなるか検証しました。

```cpp
// 右下の座標の方が小さくなるように指定
DrawBox( 100, 100, 0, 0, 0xFFFFFF, TRUE );
```

**実行結果**
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713748/5d438bad-f528-ede7-7a4b-c8fe9e4039fe.png)

右下座標と左上座標の範囲が問題なく塗りつぶされました。

:::note
DXライブラリのソースコードを確認したところ、左上と右下の座標は描画前に大小比較を行って必要なら入れ替えているようです。
:::

# 参考

- [DrawBox](https://dxlib.xsrv.jp/function/dxfunc_graph0.html#R2N2)
基本情報技術者試験（FE） 科目A試験免除の過去問の統計とってみた

基本情報技術者試験（FE）の科目A試験免除の過去問の問題、解答はIPAがサイトで公開してくれてます
FE, AP, その他で使用した問題がほとんどなのでどのくらいの割合で出るか統計とってみました
その統計を元にFE、APの過去問道場から問題を出す簡単なサイト作ってみたので受ける方は使ってみてください！

# 統計情報を元に問題を出すサイト

統計情報を元に科目A免除の過去問50%, テクノロジーFE30%, AP20%, マネジメント・ストラテジFE20%, AP30%の割合で出題してます
また過去問で3回出た問題は出ないようなので除いてます
問題数は10～80で選択でき統計情報の割合に分野の割合を加味してます

https://sueasen.github.io/opensite/ipa-fe-apass-r/

# 過去問の順番で出すサイト

令和2年6月以降の過去問で FE, AP, その他 とかで過去問道場から問題を出すサイトです

https://sueasen.github.io/opensite/ipa-fe-apass/

# 統計情報(令和02年06月～令和06年01月・計16回)

- FE/AP/その他 の問題数、割合

令和4年ころからFE60%, AP30%, その他10%くらいになってきている
その他はITパスポートやSGからの出題が多いが割合が少ないので出題サイトでは考慮してない

| テスト日 | 問題数 | FE | AP | その他 |
| ---- | ---- | ---- | ---- | ---- |
| 令和02年06月 | 80 | 56<br>70% | 24<br>30% | 0<br>0%  |
| 令和02年07月 | 80 | 62<br>77% | 18<br>23% | 0<br>0%  |
| 令和02年12月 | 80 | 78<br>98% | 1<br>1% | 1<br>1%    |
| 令和03年01月 | 80 | 58<br>72% | 19<br>23% | 3<br>3%  |
| 令和03年06月 | 80 | 76<br>95% | 3<br>3% | 1<br>1%    |
| 令和03年07月 | 80 | 77<br>96% | 1<br>1% | 2<br>2%    |
| 令和03年12月 | 80 | 68<br>85% | 10<br>13% | 2<br>2%  |
| 令和04年01月 | 80 | 42<br>53% | 34<br>42% | 4<br>5%  |
| 令和04年06月 | 80 | 45<br>56% | 31<br>39% | 4<br>5%  |
| 令和04年07月 | 80 | 53<br>66% | 26<br>33% | 1<br>1%  |
| 令和04年12月 | 80 | 46<br>58% | 28<br>35% | 6<br>7%  |
| 令和05年01月 | 80 | 43<br>54% | 29<br>36% | 8<br>10% |
| 令和05年06月 | 60 | 33<br>55% | 21<br>35% | 6<br>10% |
| 令和05年07月 | 60 | 40<br>67% | 15<br>25% | 5<br>8%  |
| 令和05年12月 | 60 | 35<br>58% | 21<br>35% | 4<br>7%  |
| 令和06年01月 | 60 | 37<br>62% | 17<br>28% | 6<br>10% |
| 令和06年06月 | 60 | 31<br>51% | 25<br>42% | 4<br>7% |

- 出題回数 の問題数、割合

過去問からの出題が令和4年ころから40%こえて50%近くになっている
また出題3回目はあるが4回目はないので出題サイトでは3回出てる問題を除いている

| テスト日 | 問題数 | 出題1回目 | 出題2回目 | 出題3回目 |
| ---- | ---- | ---- | ---- | ---- |
| 令和02年06月 | 80 | 56<br>70% | 21<br>26% | 3<br>4% |
| 令和02年07月 | 80 | 42<br>53% | 31<br>39% | 7<br>9% |
| 令和02年12月 | 80 | 51<br>64% | 22<br>28% | 7<br>9% |
| 令和03年01月 | 80 | 46<br>58% | 29<br>36% | 5<br>6% |
| 令和03年06月 | 80 | 59<br>74% | 17<br>21% | 4<br>5% |
| 令和03年07月 | 80 | 52<br>65% | 24<br>30% | 4<br>5% |
| 令和03年12月 | 80 | 61<br>76% | 17<br>21% | 2<br>3% |
| 令和04年01月 | 80 | 48<br>60% | 26<br>33% | 6<br>8% |
| 令和04年06月 | 80 | 42<br>53% | 34<br>43% | 4<br>5% |
| 令和04年07月 | 80 | 46<br>58% | 27<br>34% | 7<br>9% |
| 令和04年12月 | 80 | 48<br>60% | 26<br>33% | 6<br>8% |
| 令和05年01月 | 80 | 48<br>61% | 25<br>32% | 6<br>8% |
| 令和05年06月 | 60 | 32<br>54% | 19<br>32% | 8<br>14% |
| 令和05年07月 | 60 | 31<br>52% | 20<br>33% | 9<br>15% |
| 令和05年12月 | 60 | 34<br>57% | 22<br>37% | 4<br>5% |
| 令和06年01月 | 60 | 31<br>53% | 20<br>34% | 8<br>14% |
| 令和06年06月 | 60 | 27<br>45% | 26<br>43% | 7<br>12% |


- 引用サイト

問題に関してはいろいろなサイトから引用してます
本当にありがとうございます

https://www.ipa.go.jp/shiken/about/menjo-fe.html

https://www.fe-siken.com/

https://www.ap-siken.com/

https://www.itpassportsiken.com/

https://www.sg-siken.com/

https://www.sc-siken.com/

https://www.db-siken.com/
aptとapt-getについて

`apt`は`apt-get`を内包しています。

そもそも、`apt-get`の不便さを解消したのが`apt`です。
なので基本的には`apt`を使用するのが良さそう。
ちなみに、`apt`と`apt-get`の混用も問題ありません。
参考：[公式ドキュメント](https://www.debian.org/doc/manuals/debian-reference/ch02.ja.html#_literal_apt_literal_vs_literal_apt_get_literal_literal_apt_cache_literal_vs_literal_aptitude_literal)

# `apt update`/`apt upgrade`/`apt install`
## `apt update`
[パッケージリスト](https://manpages.ubuntu.com/manpages/jammy/ja/man5/sources.list.5.html)の更新を行います。

## `apt upgrade`
パッケージの更新を行います。
環境に入っているものを最新化したい時に使用します。

## `apt install`
[パッケージリスト](https://manpages.ubuntu.com/manpages/jammy/ja/man5/sources.list.5.html)を使用してインストールします。
アロー関数とは？

### アロー関数とは？

ES6 JavaScript のアップデートで導入されました。 これは、変数を宣言し利用するもうひとつの方法です。 アロー関数がもたらすメリットは次のとおりです。

- より簡潔である
- this が周辺のスコープからピックアップされる
- 暗黙的な return

## 内容

### アロー関数のここがすごい!!

- 関数を短く書ける　※例①
- thisを束縛しない　※例②

### アロー関数 実用例①：関数を短く書ける

**function() の場合**

```jsx
let normalFunc = function(x){
    console.log(x);
}
normalFunc('今までの関数');
```

**アロー関数の場合**

```jsx
let arrowFunc = (x) => {
    console.log(x);
}
arrowFunc('アロー関数式');
```

### アロー関数 実用　例②： thisを束縛しない

**function() の場合**

```jsx
this.text = 'aaa';

function hoge() {
  console.log(this.text);
}

const obj = {
  text : 'bbb',
  func : hoge,
};

const obj_2 = {
  text : 'ccc',
  func : hoge,
};

obj.func(); // => 'bbb'
obj_2.func(); // => 'ccc'
```

**アロー関数の場合**

```jsx
this.text = 'aaa';

const hoge = () => {
  console.log(this.text);
}

const obj = {
  text : 'bbb',
  func : hoge,
};

const obj_2 = {
  text : 'ccc',
  func : hoge,
};

obj.func(); // => 'aaa'
obj_2.func(); // => 'aaa'
```

## 結論

個人的にはFunctionを多用している為、なれるのが時間はかかるが

関数を短く書くことができる為、とても便利。

## 補足


#### アロー関数を使わずにthisを固定する場合　 実用例③：bind(this)

```jsx
//thisを通常した関数 -----------------------------------

var person = {
  name: 'mejileben',
  hobby: 'programming',
  callHobbyLater: function(){
    setTimeout(function(){
      console.log('趣味は' + this.hobby);
    },1000);
  },
  callName: function(){
    console.log("私の名前は" + this.name);
  }
}

person.callHobbyLater();//趣味はundefined ※ここがエラー（this）
                   
person.callName();//私の名前はmejileben

//　bind(this)を使用した場合 -------------------------------------

var person = {
  name: 'mejileben',
  hobby: 'programming',
  callHobbyLater: function(){
    setTimeout(function(){
      console.log('趣味は' + this.hobby);
// ここにbind(this)を書いておくとthisを確定しておける
    }.bind(this),1000);
  },
  callName: function(){
    console.log("私の名前は" + this.name);
  }
}

person.callHobbyLater();//私の名前はmejileben
person.callName();//趣味はprogramming

```

## 参考

https://mbeaudru.github.io/modern-js-cheatsheet/translations/ja-JP.html#introduction

https://qiita.com/mejileben/items/69e5facdb60781927929
iOSアプリの配信国を指定する

アプリの配信国はデフォルトでは全ての国配信されるようになっていますが、今はGDPR設定でデータの自己使用について同意を求める必要があります。

<br>


# GDPRについての記事

・GDPR（EU一般データ保護規則）とは？マーケティング担当者が対応すべき事項について

https://www.onemarketing.jp/contents/gdpr_re/


・GDPR罰金まとめ（2023年1月時点）

https://acompany.tech/privacytechlab/gdpr-fine/


・GDPR設定データの自己使用について同意を求める

https://support.google.com/admob/answer/10305345?hl=ja


・AdMobのGDPR対応

https://zenn.dev/iiinaiii/scraps/c3355353839c4a



・EU加盟国

https://www.mofa.go.jp/mofaj/area/eu/map_00.html





<br>







<br>



なのでAdMobなど使用して配信するにはGDPR対応の実装が必要になります。

GDPR対応はしないでAppStoreConnectから配信国を制限するには以下の通りになります。


# やり方
AppStoreConnect配信アプリ画面を開きます。

![controlP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/249268bd-a15e-f0ef-b90d-b7818d2a30f1.png)
一般の『価格及び配信状況』→『アプリの配信状況』になる『管理』をクリックして下さい。


<br>

![ManageDeliveryStatus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/a610a021-e32e-a66e-052b-f8502e76d3bc.png)
アプリの配信状況の『配信状況を管理』をクリックして下さい。


<br>

![Country or region distribution status (174).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/c5645557-60d2-ccd0-2f19-c91aefdf54e3.png)
配信したい国にチェックを入れると配信できてチェックを外せば配信できないようになります。

<br>


![currentmemberstates.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/cdc981ec-7ee0-ef2e-a6c4-b969d6a7920a.png)
外務省によるEU加盟国は現時点で27カ国となっています。

EU加盟国はこちらで確認して下さい。

https://www.mofa.go.jp/mofaj/area/eu/map_00.html


<br>

<br>

![CountryorRegionDeliveryStatus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/cc1a5c51-d610-9dcd-6980-48cb33f93590.png)
配信する国のチェックが済んだら『次へ』をクリックして下さい。
これで24時間ほどでAppStoreの方で反映されるそうです。
【合格体験記】Google Cloud認定 Professional Cloud Architectに合格しました！

2023年12月にGoogle Cloud認定 Professional Cloud Architect試験に合格したため、合格体験たるものを記載します。
今後、受験を考えている方に参考になる部分があればと思っています。

### 受験の動機
筆者がGCP_Professional Cloud Architectを受験した理由は下記になります。

・GCPに関連する案件に携わる可能性があったため
・8月にAWSの試験に合格できたので、GCPの試験も合格できるのはと思った。

### 試験結果
AWS試験とは異なり、スコアレポートのようなものはなく、ただ合格であることの証明だけされました。（7割以上で合格のようです）

試験終了直後に、合格・不合格の一次結果はすぐPC画面上に表示されました。
試験日から5日後くらいに、正式に合格おめでとうございますという旨のメールを受領しました。試験時の不正がなかったかを確認するという名目があり、正式な通知までが、意外と日数がかかりました。

### 学習に使用した教材
学習教材は、2つを使用しました。

・Cousera
・Udemy：【最短攻略】Google Cloud 認定 Professional Cloud Architect 模擬問題集

### 学習方法
学習方法は①～③の通りです。学習期間は、計3か月くらいでした。
試験合格だけでいうと、おそらく②③（Udemy）の実施だけでも十分な可能性はあると思っています。

① Couseraの各コースでGCPの概要、各サービスの概要を理解
　結構流し読みみたいになっていたので、どこまで理解できていたかは不明でした。

② 「【最短攻略】Google Cloud 認定 Professional Cloud Architect 模擬問題集」を各2周。
正解・不正解に限らず、全問題解説を読みながら進めました。1周目で4割、2周目で7割くらいの正答率でした。

③ 「【最短攻略】Google Cloud 認定 Professional Cloud Architect 模擬問題集」をもう3周しました。正解ではない選択肢の解説が乗っていないこともあり、わからないところは、Couseraで見直したり、ChatGPTを利用して調べたりしながら進めました。
3,4週目時点では、8,9割の正答率で、5週目はすべて満点の状態になりました。

### 受験してみての感想
8月に受験したAWS SAAと比べると、比較的簡単なように感じました。
試験問題が、勉強していたUdemyの模擬試験から5割近くは同じような問題が出題されたので、6割は自信をもって答えられました。残りの問題も、おそらくこれしか答えないだろうみたいなのが2割くらいはあったと思うので、最低でも8割程度の正答率はあったのではないかと予想しています。
とはいえ、合格できたこと自体は、とてもうれしいです。
Docker上のjupyter labからcv2.imshow()

# 概要
Dockerコンテナ上でGUIで画像を表示しようとするとrestart kernelしたので画像表示できるようにした

# 環境
Windows 11 Pro
Docker Desktop
JupyterLab 4.1.2

Docker上でjupyterlabを使うには以下記事参考

https://qiita.com/plumfield56/items/335cad3b58afe55f6529

# やったこと
VcXsrvをinstall

https://sourceforge.net/projects/vcxsrv/

VcXsrvを起動
設定項目は全てdefault
毎回起動する必要がありそう

```dockerfile```に以下を追加
```python
apt-get install -y libgtk-3-dev 
```
または
```python
apt-get install -y libgtk2.0-dev
```

```docker-compose.yaml```に以下を追加
```
environment:
    - DISPLAY=host.docker.internal:0.0
```

これで再build後jupyterlabに入りcv2.imshow('img', img)をするとVcXsrv上で描画される

# 他細々
```opencv-contrib-python```のinstallだけだと色々言われて```import```できないので、以下をDockerfileに追記するとよい
```
apt-get install -y libgl1-mesa-glx libglib2.0-0
```

# 参考
https://zenn.dev/dozo/articles/3ef1565b2b069e

https://rin-ka.net/windows-x-server/

記事中に```Disable access control```にチェックをつける、つけない場合は```X0.hosts```で個別設定とあるが特にそれもせずいけた、よく分かってない
【合格体験記】AWS Certified Solutions Architect – Associate（SAA）

AWS全く未経験だった筆者が、2023年8月AWS SAA試験に合格したため、合格体験たるものを記載します。
今後、受験を考えている方に参考になる部分があればと思っています。

### 受験の動機
筆者がAWS SAAを受験した理由は下記になります。
とにかく、クラウドの知識をつけておきたい、というのが一番の動機でした。

・クラウドの知識をつけたい
・まずは、シェア1位のAWSから学んでみたい

### 試験結果
点数・スコアレポート（受験後に発行されるもの）については、下記の通りでした。
1000点中720点で合格なので、ギリギリでした。

点数：738点
スコアレポート：
・セキュアなアーキテクチャの設計：コンピテンシーを満たしている
・弾力性に優れたアーキテクチャの設計：コンピテンシーを満たしている
・高性能アーキテクチャの設計：改善が必要
・コストを最適化したアーキテクチャの設計：コンピテンシーを満たしている

### 学習に使用した教材
学習教材は、3つを使用しました。

・Udemy：【SAA-C03版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座
・Udemy：【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）
・Ping-t

### 学習方法
学習方法は①～④の通りです。学習期間は、計4か月くらいでした。①を2か月、②～④を2か月くらいで行いました。もっと集中して行えば、学習期間は短くすることもできたのかな、という印象です。
試験合格だけでいうと、おそらく②～④の実施だけで十分なのではないかと思っています。

① Udemyの「【SAA-C03版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座」を一通り視聴しました。（ハンズオンもありましたが、私は視聴のみしていました。）
各章にある、小テストは実施していました。

② 「【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）」の基本問題（1~4）を2周しました。1周目は3割前後、2周目は6.7割くらいの正答率でした。
正解・不正解に限らず、全問題解説を読みながら進めました。

③ Ping-tを全問題コンボ（2問連続正解すること）になるまで実施しました
1週目は、未着手問題とミスに絞って、10問ずつ解きました。すべてヒット（1回正解）になった以降は、ミスとヒットに絞って10問ずつ解きました。
こちらも解説は全問読みながら進めました。
ミスしやすい問題や、丸暗記したいことは、ノートにメモしながら進めました。

④ 「【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）」の基本問題（1~4）をもう2周しました。3周目で7割、4週目で9割くらいの正答率でした。
この時も、正解・不正解に限らず、全問解説を読みながら進めました。
結局応用問題（5,6）は実施しませんでした。

### 受験してみての感想
難しかったというのが率直な感想です。
試験問題は、Udemyの模擬試験で受験していた難易度だったと思いますが、全くわからない問題が3割くらいはありました。2択まで絞れたけどわからない、という問題も同様に3割くらいあったので、自信をもって解けたのは4割くらいでした。
五分五分だと思っていたので、合格できていたのは、うれしかったです。
EXPO49に移行後webアプリを起動してもページがblankになる問題の対応

## 概要

2024年2月時点で、EXPO50が正式にリリースされているが、その前段階でEXPO49にアップグレードした際、webアプリ画面が真っ白になって困ったので、その対策の備忘録
（EXPO50 では修正ずみのバグらしいので、現在はあまり気にしなくても良さそう）

## 環境
- ReactNative : v.0.72.6
- react-native-webview : v.0.19.10
- Expo : v.49

## 参考
- https://blog.expo.dev/expo-sdk-49-c6d398cdf740
- https://docs.expo.dev/workflow/upgrading-expo-sdk-walkthrough/
- https://github.com/expo/expo/issues/23819

## 起きた問題
[公式のアップデート手順](https://docs.expo.dev/workflow/upgrading-expo-sdk-walkthrough/)に従って、EXPO48 → EXPO49のバージョンアップ。
バージョンアップ後、 `expo start --web` でwebアプリとして起動時に、画面がBlankになる。
ただし、Android / iOSアプリは問題なくビルド、動作可能である。

## 結論

以下対応を行うとページが描画されるようになった
① expo-routerを導入する。以下、yarnで入れた例
`$yarn add expo-router@2.0.0`

② app.config.jsに以下設定を追加

```js
    plugins: [
      "expo-router"
    ],
```

---

## 試行錯誤したものたち

### bundlerの変更
WebpackからMetroに変更。

metro.config.js (またはmetro.config.ts)を用意。
また、app.jsonの[web設定](https://docs.expo.dev/versions/latest/config/app/#web)部分を以下のように変更

```json
    "web": {
      "bundler": "metro"
    },
```