OmniAICreator/Qiita-1.07M huggingface dataset:
お題抽選ツール（最終完成版)

***お題抽選ツールの最終完成版***です。

```python3
####################################################
###   お題抽選ツール
###
####################################################

#ランダムモジュールを呼び出す
import random
# エクセルへの書き込みモジュールを呼び出す
import openpyxl
# 関連付けられたアプリケーションでファイルを開くモジュールを呼び出す
import subprocess
# 非同期処理用モジュールを呼び出す
import asyncio
# タイムモジュールを呼び出す
import time
# システムモジュールを呼び出す
import sys

#配列を定義する
array1 = ["大園玲","小坂菜緒","正源司陽子","守屋麗奈","佐々木久美","山下瞳月","山下葉留花","梅澤美波","筒井あやめ","遠藤さくら","中西アルノ","齊藤京子","井上和","山下美月","小林由依","山﨑天"]

array2 = ["好きな小説家","好きなお笑い芸人","好きなファッションブランド","好きなコスメブランド","好きな赤文字系ファッション雑誌","好きなロックバンド","住みたい街","好きなランニングシューズ","好きなおにぎりの具","納豆餅に使う納豆は小粒派、ひきわり派","スマートフォンはAndroid派？iPhone派？","一度は行きたい国","好きなゲーム","手軽にできる料理","初心者にお薦めのプログラミング言語","初詣でおみくじを引く?"]

#エクセルファイルのファイル名変数
out_file = "odai.xlsx"
#エクセルファイルをロードする。既に対象エクセルファイルが開いていたらメッセージを出力して処理を終了する。
try:
  wb = openpyxl.load_workbook(out_file)
  #書き込むワークシートを定義する
  ws = wb['select']
except PermissionError as e:
  #既にファイルが開いているときのメッセージ
  print(f"{out_file}ファイルが既に開いています。閉じて再実行してください")
  sys.exit()

#行数の定義
start_row = 3
# 待ち時間変数
sleep_time = 10
#演出待ち時間変数
play_time = 2

# 非同期処理で1秒後に「抽選結果の発表です」を出力し、９秒待つ
async def start_msg():

  print("抽選結果の発表です")
  div1()
  await asyncio.sleep(sleep_time)

# 非同期処理で10秒間演出する
async def message_out():
    for k in range(0,4):
      await asyncio.sleep(play_time)
      print("ﾄﾞﾗ" * 20)
      div1()

#非同期メイン関数
async def main():

  task1 = asyncio.create_task(
        start_msg()
  )

  task2 = asyncio.create_task(
        message_out()
  )

  print(f"started at {time.strftime('%X')}")
  await task1
  await task2
  print(f"ended at {time.strftime('%X')}")

#配列の数の比較関数
def array_count(num1,num2):
    if num1 == num2:
      return "OK"
    else:
      return "NG"

def div1():
  print("=" * 40)


ans =  array_count(len(array1),len(array2))
if ans == "NG":
  print("人数とお題のタイトル数が違うので、array1とarray2の数を合わせてください")
  sys.exit()

N = len(array1)

#配列の要素をランダムに並べる
random_array1 = random.sample(list(set(array1)),N)
random_array2 = random.sample(list(set(array2)),N)


#ランダムに並べた名前を1行ずつエクセルファイルに出力する。
for k in range(0,N,1):
  man1 = random_array1[k]
  title1 = random_array2[k]
  try:
    with open(out_file,mode='a') as f:
      #エクセルファイルに追記モードで書き込む
      ws.cell(row=start_row,column=2).value = man1
      ws.cell(row=start_row,column=3).value = title1
      start_row += 1
  except:
    print("エクセルファイルの書き込みに失敗しました")
    exit()

#エクセルファイルを保存する
wb.save(out_file)

# 非同期処理で
asyncio.run(main())


#エクセルファイルを開く
subprocess.Popen(['start',f"{out_file}"],shell=True)
```

エクセルに書き込んだ結果が下記の画像です。

![result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/35248b3a-879f-e1ae-50fc-eafed84e5acc.jpeg)
JetpackComposeでStringResourcesの間に文字を入れる方法

Androidの開発はじめたての人向け記事になります。


StringResourcesの間に文字を入れるとういうのは
こんばんは、〇〇さんの〇〇はJetpackCompose側で可変の文字を設定して、こんばんは、〇〇さんのところはStringResourcesで設定するイメージとなります。

StringResourcesはこのようにします。
```staring.xml
<string name="evening">こんばんは、%1$sさん</string>
```

設定したい文字にこのように記載します。
```EveningText.kt
@Composable
fun EveningText(
    name: String,
) {
    Text(
        text = stringResource(id = R.string.evening, name)
    )
}
```
DynamoDBにDeep Diveするためのリンク集

Amazon DynamoDB Developer Guide
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html

The DynamoDB Book
https://www.dynamodbbook.com/

Amazon DynamoDB: A scalable, predictably performant, and fully managed NoSQL database service
https://www.amazon.science/publications/amazon-dynamodb-a-scalable-predictably-performant-and-fully-managed-nosql-database-service

Dynamo: Amazon’s highly available key-value store
https://www.amazon.science/publications/dynamo-amazons-highly-available-key-value-store

AWS Prescriptive Guidance Using Amazon DynamoDB global tables
https://docs.aws.amazon.com/prescriptive-guidance/latest/dynamodb-global-tables/introduction.html

Simulating Amazon DynamoDB unique constraints using transactions
https://aws.amazon.com/jp/blogs/database/simulating-amazon-dynamodb-unique-constraints-using-transactions/

AWS re:Invent 2018: Amazon DynamoDB Deep Dive: Advanced Design Patterns for DynamoDB (DAT401)
https://www.youtube.com/watch?v=HaEPXoXVf2k

AWS re:Invent 2019: Data modeling with Amazon DynamoDB (CMY304)
https://www.youtube.com/watch?v=DIQVJqiSUkE

AWS re:Invent 2018: Amazon DynamoDB Under the Hood: How We Built a Hyper-Scale Database (DAT321)
https://www.youtube.com/watch?v=yvBR71D0nAQ

Building Modern Apps Using Amazon DynamoDB Transactions
https://www.youtube.com/watch?app=desktop&v=IgFvWaSQaeg
Python小ネタASCII⇔HEX文字列変換

# はじめに
ASCII文字列とHEX文字列を相互に変換する方法をまとめる。

# ord()とchr()で変換する
ASCII文字列→HEX文字列は```ord()```、HEX文字列→ASCII文字列は```chr()```で変換できる。

```python:ascii_hex.py
import re 

ascii_string = 'abcdefghi-ABCDEFGHI_0123456789'

#====================
# ASCII→HEX
#====================
# ASCII文字列を1文字ずつ分割してリスト化
ascii_list = list(ascii_string)

# 内包表記で ASCII文字のリストを ord() で整数にして f-stringでHEX文字に変換
hex_list=[f'{ord(i):02X}' for i in ascii_list]

# 変換したHEX文字を結合
hex_string=''.join(hex_list)
print(f'# {hex_string=}')
# hex_string='6162636465666768692D4142434445464748495F30313233343536373839'


#====================
# HEX→ASCII
#====================
# HEX文字列を2文字ずつ分割してリスト化
hex_list = re.split('(..)',hex_string)[1::2]

# 内包表記で HEX文字のリストを int() で整数にして chr() でASCII文字に変換
ascii_list=[chr(int(i,16)) for i in hex_list]

# 変換したASCII文字を結合
ascii_string=''.join(ascii_list)
print(f'# {ascii_string=}')
# ascii_string='abcdefghi-ABCDEFGHI_0123456789'
```

HEX⇔ASCII それぞれ1行で表現すると
```python:ascii_hex.py
import re 

ascii_string = 'abcdefghi-ABCDEFGHI_0123456789'

# ASCII→HEX
hex_string = ''.join([f'{ord(i):02X}' for i in list(ascii_string)])
print(f'# {hex_string=}')
# hex_string='6162636465666768692D4142434445464748495F30313233343536373839'

# HEX→ASCII
ascii_string= ''.join([chr(int(i,16)) for i in re.split('(..)',hex_string)[1::2]])
print(f'# {ascii_string=}')
# ascii_string='abcdefghi-ABCDEFGHI_0123456789'

```
以上
JavaScriptのイベント種類

### JavaScriptの[イベント](https://developer.mozilla.org/ja/docs/Web/Events#Standard_events)とは？
ユーザがボタンをクリックしたり、キーボードで入力したりなど操作することで何らかの動作をする、**きっかけ**のことです。

イベントの設定は`addEventListener()`メソッドを使います。

```
何が.addEventListener(どうなったら,どうなる);
```
と記述します。

例：
```
btm.addEventListener('click', comment);
```
これは「ボタンがクリックされたらコメントを表示」という意味です。

この**どうなったら**の部分でよく使われるイベントには様々な種類があります。

| イベント名　　　　| 発生するタイミング　　　　　　 |
| ---- | ---- |
| submit|フォームが送信されたとき  |
| reset| フォームがリセットされたとき |
| scroll| 画面がスクロールされたとき |
| copy| 画面がコピーされたとき |
| keydown| キーが押されたとき |
| keyup| キーが離れたとき |
| click| クリックされたとき |
| dbclick| ダブルクリックされたとき |
| mousedown| マウスのボタンが押されたとき |
| mouseup| マウスのボタンが離れたとき|
| select| テキストを選択したとき|
| input| 入力されたとき |

など普段何となく使っていてもたくさんのイベントが発生します。
ベイズ統計モデリング 4_6

20%は1年生、20%は2年生、60%は3年生とする。それぞれの学年ごとの回答比率は以下。classとfavoritesは独立か？

``` r
favorites_by_class = matrix(c(0.3,0.6,0.3,0.6, 0.3, 0.1, 0.1, 0.1, 0.6),nrow=3, dimnames = list(class=c("1年生","2年生","3年生"), favorites=c("アイス","フルーツ","ポテトフライ")))
favorites_by_class
```

    ##        favorites
    ## class   アイス フルーツ ポテトフライ
    ##   1年生    0.3      0.6          0.1
    ##   2年生    0.6      0.3          0.1
    ##   3年生    0.3      0.1          0.6

``` r
apply(favorites_by_class,c("class"), sum)
```

    ## 1年生 2年生 3年生 
    ##     1     1     1

同時確率

``` r
simultanious_ratio = favorites_by_class * c(0.2,0.2,0.6)
simultanious_ratio
```

    ##        favorites
    ## class   アイス フルーツ ポテトフライ
    ##   1年生   0.06     0.12         0.02
    ##   2年生   0.12     0.06         0.02
    ##   3年生   0.18     0.06         0.36

``` r
sum(simultanious_ratio)
```

    ## [1] 1

周辺確率　favorites

``` r
favorites = apply(simultanious_ratio, c("favorites"), FUN=sum)
favorites
```

    ##       アイス     フルーツ ポテトフライ 
    ##         0.36         0.24         0.40

周辺確率　class

``` r
class = apply(simultanious_ratio, c("class"), FUN=sum)
class
```

    ## 1年生 2年生 3年生 
    ##   0.2   0.2   0.6

``` r
class %o% favorites
```

    ##       アイス フルーツ ポテトフライ
    ## 1年生  0.072    0.048         0.08
    ## 2年生  0.072    0.048         0.08
    ## 3年生  0.216    0.144         0.24

p(アイス|1年生)*p(1年生)=0.06だが、p(アイス)*p(1年生) = 0.072なので、favoritesとclassは独立ではない。
flutter_launcher_iconsの警告


flutterのアプリアイコンは、flutter_launcher_iconsが便利との事で今回はこれを使用することにしてみました。

flutter_launcher_iconsの0.13.1でネットで調べながら作業したら警告が出たので
それの対応方法をメモっておきます。

## アプリアイコンの作成コマンドで警告がでる

警告がでるコマンド
```shell
flutter pub run flutter_launcher_icons:main
```

警告の出ないコマンド
```shell
flutter pub run flutter_launcher_icons
```

## アプリアイコンの作成中に警告がでる

設定ファイルの書式が悪いと以下の様な警告が出た。
```shell
Warning: flutter_icons has been deprecated please use flutter_launcher_icons instead in your yaml files
```

警告がでる設定
```yaml: pubspec.yaml
dev_dependencies:
  flutter_launcher_icons: "^0.13.1"

flutter_icons:
  # アイコンの設定
```


警告の出ない設定
```yaml: pubspec.yaml
dev_dependencies:
  flutter_launcher_icons: "^0.13.1"

flutter_launcher_icons:
  # アイコンの設定
```

アイコンの設定書式は、基本同じで良さそうです。
［Docker Compose］postgres ✖️ pgadmin4

本記事は、[［Docker］postgres ✖️ pgadmin4](https://qiita.com/gobtktk/items/67f6a66eaf3ebd13f434)を`Docker Compose`で構成したものです。
## 環境

- Docker: 4.25.2
- postgres: 16.1
- pgadmin4: 8.1
## docker-compose.yaml
~~~yaml:docker-compose.yaml
version: '3.9'

services:
  service_postgres:
    image: postgres:latest
    container_name: container_postgres
    environment: 
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports: 
      - "5432:5432"
    volumes:
      - volume_postgres:/var/lib/postgresql/data
  
  service_pgadmin:
    image: dpage/pgadmin4:latest
    container_name: container_pgadmin
    ports:
      - 8080:80
    volumes:
      - volume_pgadmin:/var/lib/pgadmin
    environment:
      PGADMIN_DEFAULT_EMAIL: example@domain.com
      PGADMIN_DEFAULT_PASSWORD: password
    depends_on:
      - service_postgres

volumes:
  volume_postgres:
  volume_pgadmin:
~~~
###  コンテナの起動
公式のイメージはbuild済みのため、`docker compose build`コマンドは不要。
~~~
$ docker compose up
~~~
### 接続情報の設定
- ホスト名/アドレスはコンテナ名を入力。
> デフォルトで Compose はアプリに対して１つの ネットワーク を作成します。サービス用の各コンテナはデフォルトのネットワークに接続し、そのネットワーク上で他のコンテナと相互に「 接続可能reachable 」になります。そして、**コンテナ名と同じホスト名として、お互いが「 発見可能discoverable 」になります。**

参考：[Compose の ネットワーク機能](https://docs.docker.jp/compose/networking.html#compose)

![スクリーンショット 2024-01-11 10.12.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653944/a7c4ac06-e861-28cc-5774-e70152896284.png)
［Docker］postgres ✖️ pgadmin4

## Dockerイメージで環境構築
- Docker: 4.25.2
- postgres: 16.1
- pgadmin4: 8.1

### pgadmin4のイメージを取得
[dpage/pgadmin4 docker image](https://hub.docker.com/r/dpage/pgadmin4/)
~~~
$ docker pull dpage/pgadmin4
~~~

### postgresのイメージを取得
[postgres docker image](https://hub.docker.com/_/postgres)
~~~
$ docker pull postgres
~~~

### pgadmin4のイメージを起動
参考：[Examples](https://www.pgadmin.org/docs/pgadmin4/latest/container_deployment.html#examples)

pgadmin4のdocker hubを参照。
- コンテナをmy-pgadmin4と命名
- docker側の80ポートとローカルの8080ポートをバインド
- データの永続化のために[名前付きボリューム](https://docs.docker.jp/engine/userguide/containers/dockervolumes.html#mount-a-shared-storage-volume-as-a-data-volume)を作成してコンテナ側のファイルをマウント。
- PGADMIN_DEFAULT_EMAIL環境変数にログイン用のメールアドレスを設定。
- PGADMIN_DEFAULT_PASSWORD環境変数にログイン用のパスワードを設定。
- dpage/pgadmin4イメージをdetachモードで起動
~~~
$ docker run --name my-pgadmin4 -p 8080:80 \
-v volume_pgadmin:/var/lib/pgadmin \
-e 'PGADMIN_DEFAULT_EMAIL=user@domain.com' \
-e 'PGADMIN_DEFAULT_PASSWORD=SuperSecret' \
-d dpage/pgadmin
~~~

### postgresのイメージを起動
参考：[start a postgres instance](https://hub.docker.com/_/postgres)

- コンテナをmy-postgresと命名
- docker側の5432ポートとローカルの5432ポートをバインド
- データの永続化のために[名前付きボリューム](https://docs.docker.jp/engine/userguide/containers/dockervolumes.html#mount-a-shared-storage-volume-as-a-data-volume)を作成してコンテナ側のファイルをマウント。
- POSTGRES_PASSWORD環境変数にログイン用のパスワードを設定。(※デフォルトユーザーは`postgres`になる)
- postgresイメージをdetachモードで起動
~~~
$ docker run --name my-postgres -p 5432:5432 \
-v volume_postgres:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=mysecretpassword \
-d postgres
~~~

### postgresが実行されているコンテナのIPアドレスを取得
~~~
$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-postgres
~~~
~~~
172.17.0.3
~~~

### 接続情報の入力
- ホスト名/アドレス：postgresが実行されているコンテナのIPアドレス
- ポート番号：5432(postgresのポート番号)
- ユーザ名：postgres(デフォルト)
- パスワード：POSTGRES_PASSWORD(環境変数)で設定した値(ここではmysecretpassword)
![スクリーンショット 2024-01-10 14.06.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653944/bf146515-70d1-5380-c3ed-825fd2f700df.png)
RefreshDatabaseトレイトの挙動

## はじめに
Laravelのテストを実行する際、Foreign key violationのエラーが出ました。

「ちゃんとシーダーで外部キー制約をパスするためのテストデータ用意してるんだけどな？」と思っていましたが、

テストクラスで「use RefreshDatabase」しているのを忘れていました。

これは、テストが実行されるたびに一旦マイグレーションをリセットするトレイトです。

## 環境
Laravel 9.52.16

## 問題
* 以下のようなテストがある

```php: SalesOrdersControllerTest.php
<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use App\Models\User;
use Tests\TestCase;

class SalesOrdersControllerTest extends TestCase
{
    use RefreshDatabase;

    /**
     * A basic test example.
     *
     * @return void
     */

     public function test_sales_store(): void
    {
        // テスト用のユーザを作成
        $user = User::factory()->create();

        $formData = [ 
            'title' => 'テストタイトル',
            'sales_abstract' => 'テスト概要',
            'category_id' => '1',
            'budget' => 1000,
            'schedule' => '2021-01-01',
        ];

        // 作成したユーザで認証
        $response = $this->actingAs($user)->post('/my/sales/store', $formData);

        $response->assertStatus(302);
        $this->assertDatabaseHas('sales_orders', [
            'title' => $formData['title'],
            'sales_abstract' => $formData['sales_abstract'],
            'category_id' => $formData['category_id'],
            'budget' => $formData['budget'],
            'schedule' => $formData['schedule'],
        ]);
    }
}
```

* このtest_sales_store()を実行するとエラーが

```terminal
root:/var/www/html/niches# php artisan test --filter test_sales_store

   FAIL  Tests\Feature\SalesOrdersControllerTest
  ⨯ sales store

  ---

  • Tests\Feature\SalesOrdersControllerTest > sales store
  Expected response status code [302] but received 500.
  Failed asserting that 302 is identical to 500.
  
  The following exception occurred during the last request:
  
  PDOException: SQLSTATE[23503]: Foreign key violation: 7 ERROR:  insert or update on table "sales_orders" violates foreign key constraint "sales_orders_category_id_foreign"
  DETAIL:  Key (category_id)=(1) is not present in table "categories". in /var/www/html/niches/vendor/laravel/framework/src/Illuminate/Database/Connection.php:419
```

「sales_ordersテーブルへの挿入または更新は外部キー制約に違反しています」

「具体的にはcategoriesテーブルのカラム"category_id"が1であるキーが存在しません」

とエラーが出ています。

```terminal: Tinker
> use Category
> Category::find(1);
= App\Models\Category {#7252
    id: 1,
    category: "ゲーム",
    created_at: "2024-01-14 16:02:33",
    updated_at: "2024-01-14 16:02:33",
  }
```
Tinker上で確認してみると、Categoriesテーブルにはちゃんと紐づけられる「id = 1」のデータが存在します。


## 解決法
* RefreshDatabaseトレイトを使用している
* そのためテストを実行するたびにマイグレーションがリセットされている
* よって、シーダーで作成したCategoriesテーブルのデータはテスト実行時に削除されている


このようなことが分かったので、テストクラス内でもCategoryのインスタンスを作成します。

```php: SalesOrdersControllerTest.php
public function test_sales_store(): void
    {
        $user = User::factory()->create();

        // テスト用のカテゴリーを作成
        $category = Category::factory()->create();

        // 以下同じ
    }
```

## おわりに
シーダーで用意してるし大丈夫！と思っていましたが、RefreshDatabaseを使っているのをすっかり忘れていました。

この問題に対処する過程で、Factoryクラスの使い方も学べた気がします。
REST APIについて

REST APIについてインプットをしたので自分なりに少しまとめてみようと思います。

# REAT APIとは
RESTの原則に基づいて設計されたAPI。

API:機能やデータを外部から呼び出して、利用できるために定めた規約

# REST原則
1. クライアント/サーバー
2. ステートレス
3. キャッシュ制御
4. 統一インターフェース
5. 階層化システム
5. コードオンデマンド

### クライアント/サーバー
クライアント側がトリガーで、サーバー側は受け身

### ステートレス
前の状態を保存しない。
それぞれのやりとりが独立して成立する

<dl>
  <dt>メリット</dt>
  <dd>単一のリクエスト以外見る必要がないため把握が容易</dd>
  <dd>リクエスト全体でサーバーリソースを共有する必要がないのでスケールが容易</dd>
  <dt>デメリット</dt>
  <dd>複数バージョンを同時で提供だと状態管理が複雑になる</dd>
</dl>

### キャッシュ制御
→ クライアントはレスポンスをキャッシュできる

__キャッシュを適切に行うことで必要な情報だけリクエストすればよくなる__

<dl>
  <dt>メリット</dt>
  <dd>ユーザ体験の向上</dd>
  <dd>リソースの向上</dd>
  <dd>拡張性の向上</dd>
  <dt>デメリット</dt>
  <dd>古いデータを戻してしまうとシステムに対する信頼性の低下につながる</dd>
</dl>

### 統一インターフェース

__4つの制約__
+ リソースの識別
 __リソース__
 　→サーバー側に保持されるデータ
    　　例)ドキュメント、画像、人、情報、サービス、状態
　 __URIはリソースを識別するもの(URIに動作を含まない)__
<br>

+ 表現を用いたリソース操作
→クライアントへ返されるレスポンスやサーバーへPOSTするデータ
__断面情報を利用してサーバー上のデータを操作する__
<br>

+ 自己記述のメッセージ
メッセージ：サーバーへリクエストするデータ、クライアントへレスポンスするデータ
__メッセージ内容が何であるか、ヘッダーに記述されている__
<br>

+ アプリケーション状態エンジンとしてのハイパーメディア


<dl>
  <dt>メリット</dt>
  <dd>システムアークテクチャ全体が簡素化されて分かりやすい</dd>
  <dd>提供するサービスに集中でき、独自の進化ができる</dd>
  <dd>異なるブラウザでも同じような画面を表示できる</dd>
  <dt>デメリット</dt>
  <dd>標準化によって効率が犠牲になる</dd>
</dl>

### 階層化システム
→ 多層アーキテクチャ

<dl>
  <dt>メリット</dt>
  <dd>各システム(コンポーネント)に役割を決めて独立することで進化と再利用ができる</dd>
  <dt>デメリット</dt>
  <dd>データ処理にオーバーヘッドが発生(ユーザから見ると口頭が悪く見える)</dd>
</dl>

### コードオンデマンド

__クライアントコードをダウンロードして実行できる__

リリース後にクライアントコードを変更できる
例) HTML自体の更新、Javaアプレットの更新

<dl>
  <dt>メリット</dt>
  <dd>リリース済みのクライアントに対して機能追加ができる</dd>
  <dd>サーバーの負荷が下がる(クライアント処理が移譲できるため)</dd>
  <dt>デメリット</dt>
  <dd>評価環境が複雑になる</dd>
</dl>
【intelliJ】【Git】別のリポジトリのブランチをローカルリポジトリにpullする

intelliJのGUIで通しでやる方法が案外ぱっと見つからなかったためメモ
Fork元のリポジトリのブランチをマージするとき等に使ったりするイメージです。

### 前提
intelliJとGitの連携ができている

### 結論
①Git→リモートの管理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629824/edc0e8c4-dda7-275b-929e-40ca1f156f78.png)

②pullしてきたいリポジトリのURLをリモートリポジトリとして追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629824/1d7705f2-a150-00d0-47b9-95109cd29d4c.png)

③fetch（1度リモートリポジトリの内容を取りこむ）

④pull操作時にFork元リポジトリ/ブランチが指定できるようになっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629824/b2f7119c-ed04-899c-2d67-e4e6b48dd077.png)

🎉

### 備考
やっていることは単純にリモートブランチの追加（remote add）→pull（fetch & marge）
そもそも何が起こっているかは下記の記事等が大変わかりやすく解説してくださっています。
[fork元の変更を取り込む](https://leico.github.io/TechnicalNote/Git/pull-fork-origin)
C#で配列をカンマ区切りで出力する

# 1. はじめに
* C#で配列をカンマ区切りで出力したい

# 2. 開発環境
* C#
* .NET 6
* Visual Studio

# 3. サンプルコード
```Csharp:
var values = new String[] {"A", "BB", "CCC", "DDDD", "EEEEE" };

Consolo.WriteLine(string.Join(",", result));
```

# 4. 出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/bf626cd6-e2bc-bf49-a298-8fa91744f292.png)
visual studio code でコメントを書くときのショートカット

# Ctrl＋/ でコメントアウトしてくれる
　Vscode上で「Ctrl＋/」すると各プログラミング言語に合わせてコメントアウトしてくれます。またすでに書いてあるコードをコメントアウトしたい場合対象のコードを選択した上で「Ctrl＋/」をおすとコメントアウトされます。
　私はVscodeを使い始めた時このショートカットを知らなかったので毎回各言語のコメントアウトの仕方を調べていました…（早く知りたかった！）
 # 注意点
 HTMLにCSSを直接書いていくなどもとのファイルとは違う言語のコメントアウトする場合ショートカットは元のファイルに合ったコメントの仕方になるので注意が必要です。
ベイズ統計モデリング 4_5

正規分布のグラフ

``` r
# Graph of normal probability density function, with comb of intervals.
meanval = 162              # Specify mean of distribution.
sdval = 15                 # Specify standard deviation of distribution.
xlow  = meanval - 3.5*sdval # Specify low end of x-axis.
xhigh = meanval + 3.5*sdval # Specify high end of x-axis.
dx = sdval/10               # Specify interval width on x-axis
# Specify comb of points along the x axis:
x = seq( from = xlow , to = xhigh , by = dx )
# Compute y values, i.e., probability density at each value of x:
y = ( 1/(sdval*sqrt(2*pi)) ) * exp( -.5 * ((x-meanval)/sdval)^2 )
# Plot the function. "plot" draws the intervals. "lines" draws the bell curve.
df = data.frame(x,y)
g = ggplot() + geom_line(data=df, mapping=aes(x=x, y=y))
print(g)
```

![](https://i.imgur.com/yF8QBpm.png)
PC-9801の非公式OSメモ

もはや手に入らなくなった情報等を個人的に載せておく場所です

## MEG-DOS
S.P.S.から開発されたゲーム用ブートローダ。提供されるのはIPLとMSDOS.SYSとIO.SYSに相当するもののみで、インタプリンタは存在しない。

最終バージョンは不明。
MEGDOS.DOC内の詳細な記述は公開してはいけない可能性があるので当たり障りのない程度に紹介。

### 機能
MEG-DOSはMS-DOS 2.11のINT 21H系に準拠しているが、FCBを利用したファイルアクセスには未サポート。よってMS-DOSのCOMMAND.COMをSHELLに指定すると盛大にバグる。

ファンクションキー未対応・未実装

SHELLとして起動するアプリケーションを製作する際に気を付けるべき点が２つ存在する

* プロセスを終了してはいけない(インタプリンタシェルがないため)
* 致命的エラーの処理ルーチンを持つ必要がある(インタプリンタシェルがないため)

### MEG-DOS for PC-9800 内容物
```
\
IO98.SYS
MEGDOS.SYS
CONFIG.SYS

\IPL
IPL98.2DD
IPL98.2HD
SAMPLE.ASM
SAMPLE.EXE

\DOC
MEGDOS.DOC
CHANGES.LOG
PC9801.DOC
SYSGEN.DOC
SAMPLE.DOC

\SYSGEN
SYSGEN.EXE
```

### システムファイル
* IO98.SYS --- IO.SYSに相当　IO98.SYS以外にも他機種対応バージョンが存在するらしい
* MEGDOS.SYS --- MSDOS.SYSに相当

### CONFIG.SYS
以下の4つをサポート。構文はMS-DOS準拠だが、デバイスドライバがMEGDOSに対応しているかは運。AUXレジスタとCONレジスタに対応しているとあるので、プリンタやRS232Cのドライバはあたるかもしれない。

```
FILES=
BUFFERS=
DEVICE=
SHELL=　←必須。COMMAND.COMではなく自作アプリケーションを指定。
```
### IPLについて
IPL98.2DD <- 2DD 512bytes 9sectors
IPL98.2HD <- 2HD 1024bytes 8 sectors

これをSYSGENなる専用アプリで書き込むが、SYMDEBでIPLを書き込んだ後にIO98.SYSとMEGDOS.SYSをコピーしても同等の機能が得られる。MEGDOSのIPLはバージョンによって異なるが、手持ちのMEGDOSのIPLサイズは0000 - 01B6まで。手持ちのゲームにMEGDOSがのっかっていたらIPLを抜き出せるかもしれない（最後がCBで終わるはず)

※SYMDEBを使ったIPLの転送方法例

```
A>SYMDEB
-F 100 5FF 0
-N IPL98.2xx
-L
-N
-W 100 1 0 1 <- Bドライブに転送する。Dドライブに転送したかったら100 3 0 1
-Q
```

SYMDEB（MS-DOS 3.3以降は拡張機能セットに付属）持ってない人とか、そもそもエミュレータ前提で動かす人はフロッピーイメージの先頭領域をバイナリエディタで直接書き換えると良い

### 対応デバイス
フロッピードライブは4台まで認識可能、フォーマットは以下の4種類のみ
* 2DD 512bytes 8sectors
* 2DD 512bytes 9sectors
* 2HD 1024bytes 8sectors
* 2HD 512bytes 15sectors

## GR-DOS 2.1
グリーンシステムが開発したゲーム用ブートローダ。MEG-DOSと異なり簡易インタプリンタが付属する一方、フロッピーは2HD限定。
最終バージョン2.10Lはサポート廃止後フリーウェアになった。

http://www.geocities.jp/nokox666/k2/gr_dos/gr_dos.htm

リンク切れなのでwebarchiveで検索すると良い

仕様はgr960305/Gr_dos30.txtに書いてあるので割愛

### FORMATG
GR-DOSのフロッピーを作るプログラムなのにGR-DOS上で実行しなければならないという卵が先か鶏が先か問題を抱えている。

ドキュメントを見る限り、MS-DOS上では1枚作る毎にリセットをかける必要があるらしい。つまりMS-DOS上でも1枚までならセーフ。実機で1枚作って問題なく起動できたんだから大丈夫

FORMATGではIPLとGR_DOS.SYSが書き込まれ、GR_DOS.SYSがインタプリンタを兼用する。

### 他のユーティリティはどこ？
ドキュメントに記載されている他のユーティリティはアセンブラのみの収録であるため、TASMかMASMでコンパイルする必要アリ

ソースコードはgr9603t1, t2に収録されている。
テストの自動化 CI/CDについて

## テスト自動化
テスト自動化とは
> 「テスト自動化」とは支援ツールを用いてソフトウェアテストのプロセスを自動化することをいいます。
 https://products.sint.co.jp/obpm/blog/test_automation

## CI/CDとは
開発と運用を一体として考えるDevOpsの中が普及した中で、そのためのツールとして、CI/CD（継続的インテグレーション／継続的デリバリー）が注目を集めた。

> 　CI/CDとは「Continuous Integration（継続的インテグレーション）/ Continuous Delivery（継続的デリバリー）」の略称。CI/CDは、何か特定の技術を指すものではなく、ソフトウェアの変更を常にテストし、自動で本番環境に適用できるような状態にしておく開発手法のこと
https://www.sbbit.jp/article/cont1/81640

### CIとは
>　CIとは継続的インテグレーションという名の通り、開発者にとっては自動化のプロセスを指す。
　アプリケーション開発で言えば、バラバラに稼働している複数エンジニアのソースコードを継続的に統合（インテグレーション）し、正常に動作することを確認するために検証する取り組みのことである。

### CD
> CDとは継続的デリバリーという名の通り、ユーザーに継続的にアプリケーションを提供することを指す。提供とはすなわち、本番環境にアプリケーションを載せ、顧客がいつでも新たなアプリケーションを利用できるようにすることである。
 　CDでは、検証済みコードのリポジトリへのリリースを自動化する。コード変更のマージから本番環境に対応するためのビルドのデリバリーまで、すべての段階でテストとコードリリースを自動化する。これにより、運用チームは本番環境にアプリケーションをすぐにデプロイできる。


>継続的デプロイとは、ソフトウェア開発において、開発あるいは修正したプログラムを自動的に利用環境に展開・導入する仕組み。
https://e-words.jp/w/%E7%B6%99%E7%B6%9A%E7%9A%84%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4.html


CI→開発段階で複数の作業者のコードを統合したときに自動テストが行われる,
テストが頻繁に行われることによって問題を早期発見できる。

CD→本番環境までのリリースを自動化すること
ベイズ統計モデリング 4_4

``` r
library(ggplot2)
# Graph of normal probability density function, with comb of intervals.


xlow  = 0 # Specify low end of x-axis.
xhigh = 1 # Specify high end of x-axis.
dx = 0.01               # Specify interval width on x-axis
# Specify comb of points along the x axis:
x = seq( from = xlow , to = xhigh , by = dx )
# Compute y values, i.e., probability density at each value of x:
y = 6*x*(1-x)
# Plot the function. "plot" draws the intervals. "lines" draws the bell curve.
df = data.frame(x,y)
g = ggplot() + geom_line(data=df, mapping=aes(x=x, y=y))
print(g)
```

![](https://i.imgur.com/wD90Aku.png)
AnyとAnyObjectについて

## Any型

Any型の変数や定数にはどんな型の値も代入することができる。

異なる型のデータが混在する可能性があり、配列に数値(Int型)が存在するか確認する。

<details><summary>コード例</summary>

```swift
var mixedArray: [Any] = [1, "soccer",2,3, "baseball",4]

for element in mixedArray {
    if let number = element as? Int {
        print("数値：\(number)")
    } else {
        print("数値ではありません。")
    }
}
```
</details>


## AnyObject
AnyObjectは全てのクラス型のインスタンスを表すことができる。

Animalクラス、Dogクラス、Catクラスのインスタンスを同じ変数に格納できる。

<details><summary>コード例</summary>

```swift
class Animal {
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    func makeSound() {
        print("Animal sound")
    }
}
//Animalを継承
class Dog: Animal {
    override func makeSound() {
        print("Woof!")
    }
}
//Animalを継承
class Cat: Animal {
    override func makeSound() {
        print("Meow!")
    }
}

// AnyObject型の変数に異なるクラスのインスタンスを代入できる
var anyObjectInstance: AnyObject

// Animalクラスのインスタンスを代入
anyObjectInstance = Animal(name: "Generic Animal")
anyObjectInstance.makeSound()  // Animal sound

// Dogクラスのインスタンスを代入
anyObjectInstance = Dog(name: "Buddy")
anyObjectInstance.makeSound()  // Woof!

// Catクラスのインスタンスを代入
anyObjectInstance = Cat(name: "Whiskers")
anyObjectInstance.makeSound()  // Meow!
```


</details>

:::note info
Class-only Protocolは": class"じゃなくて": AnyObject"で宣言らしい
:::
Class-only Protocolとは。。
android端末のネットワーク接続を確認する

# はじめに
今回は端末がネットワークに繋がっているかどうかで処理を分けたい時に使える確認部分の実装を紹介していきます
### 本文
```kotlin
//　メンバでContextを取得
val context: Context = LocalContext.current
// 可読性を上げるために関数化
private fun isNetworkAvailable(context: Context): Boolean {
    val connectivityManager = context.getSystemService(CONNECTIVITY_SERVICE) as? ConnectivityManager
    connectivityManager?.let {
        val nw = it.activeNetwork ?: return false
        val actNw = it.getNetworkCapabilities(nw) ?: return false
        return when {
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) -> true
            else -> false
        }
    } ?: run {
        return false
    }
}
```
### 最後に
基本的には接続エラーの表示を出せばいいとは思いますが、何か特別な処理をしたいときなどに使えると思うのでどなたかのお役に立てれたら幸いです
ラズパイにとりあえずIMG段階の設定など記録

2021年に購入したラズパイですが、とりあえず今までのことは簡単に記し、
これからのことをできるだけ備忘録がてら記載していきたいと思います。

このラズパイは、私の母校の元先生が経営されている模型店で購入しました。
とあることから、2022のバックアップを復元しました。
依存関係をぶっ壊してしまったことを機に、必要な設定などを記載していきます。

現在のメイン機
    ref:https://raspberrypi.akaneiro.jp/archives/2366
    まずはモデル名の確認します。
    
    $ more /proc/device-tree/model
    Raspberry Pi 3 Model B Rev 1.2

OSの確認
    ref:https://qiita.com/Colours/items/f38aac187c5ddc8f879e

    $ lsb_release -a
    No LSB modules are available.
    Distributor ID: Raspbian
    Description:    Raspbian GNU/Linux 10 (buster)
    Release:        10
    Codename:       buster


サーバー名
    
    各種サーバーには、日本の山々の名前を命名しています。
    （スーパーコンピューターっぽいので。笑）

すでにインストールしているもの

ufw：ファイアウォール
        ref:https://qiita.com/yoh-nak/items/46935af3c5c4036e93b3
    
softether：OPENVPN
        ref:https://qiita.com/tkyonezu/items/00311e2285366984891c
    とか。
Watchdog:安定化用
        ref:https://www.my-hacks.info/2019/05/16/post-682/
SMB：ファイル共有
    USB HDDを適宜繋いでいます。LAN内で画像や動画の共有に使っています。
    ref:https://t-dilemma.info/make-home-nas-on-raspberrypi/
    
    $ sudo blkid /dev/sda
    /dev/sda: UUID="39a40168-235e-4bab-b1d7-adce615111dd" TYPE="ext4"

これをmedia内にマウントさせています。
こういうのを復元させたとき、SMBのパスワードが分からなくなりました。

    $ sudo pdbedit -a -u hogehoge
    $ service smb restart


・IPアドレス固定
ref:https://qiita.com/tkyonezu/items/00311e2285366984891c

    $ sudo vi /etc/dhcpcd.conf
・SSHのポート番号変更（ufwポート開放）
・sodtetherは、適宜ポート設定

とりあえず、この状態で、SDカードのIMGとっておきます。
Qiitaの投稿を始めます

# 決意
Reactの学習を始めます！！
# 現状
新卒一年目エンジニアで未経験入社（いわゆるド文系）。運用保守案件を担当中。
メイン業務はアプリの監視、Excel資料作成。コードに触れたことはない。
学習した言語はJavaのみ（新卒研修にて）全然研修についていけず。。もはや学習したとは言えないレベル。
フロントエンドに興味を持ち、Reactのチュートリアルを独学で実施するも挫折。
（JavaScriptさえも触ったことない）
# 学習を始めるきっかけ
「さすがにこのままではやばい」と思い、エンジニア交流イベントに複数参加していく中で、自分の学習をサポートしてくれるエンジニアさんと出会えたから。

# 目標
短期：土台から学習して、挫折したチュートリアルを最後までやり切る！
中期：Reactで自分の実現したい処理を再現できるようにする！かつ楽しむ！
長期：Reactで自分のサービスをつくる！（ゆくゆくは収益化もしたい）
AWS CLF (-C02) 勉強方法&メモ

# はじめに

エンジニア2年目の冬に受験しました

応用情報を取得していて、業務ではAWS をほぼ使わない（使ったことがない）状態で勉強を始めました

# 購入したもの
- [AWSの基本・仕組み・重要用語が全部わかる教科書 (見るだけ図解)](https://amzn.asia/d/2sPFSgp)

ネットで評判の良い本を探して、その候補の中から実際に本屋で読みやすそうなものを選びました

- [【CLF-C02版】これだけでOK! AWS認定クラウドプラクティショナー試験突破講座（豊富な試験問題300問付き）](https://www.udemy.com/share/103mIg3@rHvQb6URaiQDTJUv7IUvzQKs8JfX9LzezwME1DTNHYQUwvrEyeITDSidYsP9L-kpJA==/)

- [【CLF-C02版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（6回分390問）](https://www.udemy.com/share/101I2O3@AO4s84R_SIx9pEmtqkfBUq79UKHA-pY7lSiYY-7oPRLHs68eUFOTjBPevc-G9-ab0A==/)

※通常7600円のところセールの時は1600円で買えるので、セールの時を狙うのがおすすめです。

書籍の問題集と迷いましたが、C01やC02 と出題範囲や内容が変わるので、その部分に対応できるUdemy の教材を選びました

# 勉強方法
## ながれ
1. 参考書を使って、AWS サービス全体の把握
2. Udemy の動画で一通り学習
3. Udemy の問題集を周回

## 参考書を使って、AWS サービス全体の把握
- [AWSの基本・仕組み・重要用語が全部わかる教科書 (見るだけ図解)](https://amzn.asia/d/2sPFSgp)

AWS について、まったくの知識ゼロだったので、参考書を使ってざっくり全体像の把握しました
理解するよりは、読み進めることを優先して一通り読みました。
図解もあって、読みやすく概要把握には使いやすかったです
読み終わるまで大体3週間くらい？かかりました


## Udemy の動画で一通り学習
- [【CLF-C02版】これだけでOK! AWS認定クラウドプラクティショナー試験突破講座（豊富な試験問題300問付き）](https://www.udemy.com/share/103mIg3@rHvQb6URaiQDTJUv7IUvzQKs8JfX9LzezwME1DTNHYQUwvrEyeITDSidYsP9L-kpJA==/)

具体的なテスト対策です。
すごくボリューミーな内容で、しっかり小テストを受けながら受講しました
全体で、2週間くらいかかりました


## Udemy の問題集を周回
- [【CLF-C02版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（6回分390問）](https://www.udemy.com/share/101I2O3@AO4s84R_SIx9pEmtqkfBUq79UKHA-pY7lSiYY-7oPRLHs68eUFOTjBPevc-G9-ab0A==/)

基本的な進め方としては、
1回分の問題を解く -> 間違った問題を確認 & ノートにサービス説明をメモ　-> 1日後に、再度問題を解く

を繰り返していました

1回目は正答率50％とかになり、2回目以降70％を超えていきました
大体どの回も3周くらい行って、正答率80％以上を目安に取り組みました

## その他
- [AWS認定資格 無料WEB問題集＆徹底解説](https://aws-exam.net/clf/)　

あまりにも、Udemyの問題集の初回テストで合格点に行かなかったので、不安になり上記にも少し手を付けました

closeしたサービスが出題されていることや、十分な解説が載っていなかったりと（無料なのである程度は仕方ない）そこまで使い勝手は良くなかったです


ネット上の評判通り、Udemy の問題集は難しい問題を集めているので、間違った内容をしっかりつぶしていけば問題ありませんでした

# まとめ
テストセンターの受験が初めてもあり、とりあえず、合格できて一安心でした
Udemy の動画視聴が終わってから、受験申し込みをして緊張感が出たのが良かったのかなと思っています（締め切り効果）
最悪、3日前までなら受験キャンセルが無料でできるので、その安心もありましたが（笑）

2024年4月から受験料金が値上げするみたいなので、それまでにSAA の試験合格を目指そうと思います
AWS stepfunctions で S3 の prefix を指定してオブジェクトを削除するステートマシンの作成

備忘録も兼ねたメモです。

## 概要
### やりたいこと
stepfunctions で S3 の特定の prefix のオブジェクトを指定してそのオブジェクトをすべて削除する。

追記：オブジェクトが1000を超えるとページネーションが必要になるのですが、stepfunctions では NextContinuationToken を使うことができないのでオブジェクト数が多いときは Lambda を使用したほうがよいです。

### 結論
次の Code で実現可能です。

```json
{
  "Comment": "A description of my state machine",
  "StartAt": "ListObjectsV2",
  "States": {
    "ListObjectsV2": {
      "Type": "Task",
      "Next": "Map",
      "Parameters": {
        "Bucket": "icpcgs3cdc",
        "Prefix": "prefix"
      },
      "Resource": "arn:aws:states:::aws-sdk:s3:listObjectsV2",
      "ResultSelector": {
        "Delete.$": "$.Contents[*].Key"
      }
    },
    "Map": {
      "Type": "Map",
      "ItemProcessor": {
        "ProcessorConfig": {
          "Mode": "INLINE"
        },
        "StartAt": "リストからマップへの変換",
        "States": {
          "リストからマップへの変換": {
            "Type": "Pass",
            "End": true,
            "ResultPath": "$",
            "Parameters": {
              "Key.$": "$"
            }
          }
        }
      },
      "Next": "DeleteObjects",
      "ItemsPath": "$.Delete",
      "InputPath": "$"
    },
    "DeleteObjects": {
      "Type": "Task",
      "Parameters": {
        "Bucket": "BucketName",
        "Delete": {
          "Objects.$": "$"
        }
      },
      "Resource": "arn:aws:states:::aws-sdk:s3:deleteObjects",
      "End": true
    }
  }
}
```

prefix 部分は他のステートマシンから呼び出して柔軟に変えられるようにする場合は ` "Prefix.$": ".$prefix"` のようにします。

デザインは次のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415560/dfcc5203-5c59-0531-4825-2e90c9de5057.png)

## ポイント

### DeleteObjects API
AWS の stepfunctions からは S3 の DeleteObjects API を呼び出すことが出来ますが、DeleteObjects は prefix を渡しての削除はできず、オブジェクトを複数渡す必要があります。
そのため一旦 ListObjectsV2 API を使って特定の prefix のオブジェクトを取得して、 DeleteObjects にわたします。

### ListObjectsV2
ListObjects は prefix を指定するとその prefix のオブジェクトの一覧をリストで返します。
次のようにしてオブジェクトの名前の一覧を取得します。
```
 "Delete.$": "$.Contents[*].Key"
```

結果としては次のようになります。
```json
{
  "Delete": [
    "prefix_object1",
    "prefix_object2",
    ]
}
```

### Map
DeleteObjects に渡す値は次のような形式にする必要があります。

```json
[
  {
    "Key": "prefix_object1",
  },
  {
    "Key": "prefix_object2",
  }
]
```

リストから JSON の形式にするには Map を利用します。

Map の使い方は JSON の定義の通りです。

## 感想
stepfunctions に慣れていないためちょっと苦労しました。
同じことをやろうとしている方の役に立てたら幸いです。
【気まぐれ】メンタルヘルスと2024年の抱負について

# はじめに

あけましておめでとうございます。Qiitaのブログを書き始めて1年と少し？が経過したように思いますが、今年もよろしくお願い致します。一昨年くらいにメンタル的に辛かった時期があり、2024年はそういったことがないようにしたいと思いまして、改めてメンタルヘルスについてまとめてみます。

# Who am i ?

しがないエンジニアです。Qiitaでは資格の合格体験記や数学・化学関連の記事を主に書いています。たまに無線も勉強しています。

# なぜわざわざ記事にしたのか？

普段はこういったことは記事にしないのですが、今後の自分の頭の整理も兼ねて、モチベーション向上に繋げていきたいと思ったからです。

# 背景

私はあまり人間的にちゃんと出来ていない部分があり、モチベーションが低下してしまうと頭がぼーっとして、作業の質に影響してしまうという悪い癖があります。幼いころからそうなので何か精神的な障害をもっているんだろうと推測しているのですが、病院には何回か行ったものの未だにはっきりせずという感じです。わりと好奇心旺盛なほうではあるので、興味を持てることは比較的長続きするのですが、そうでないことは何か手をつけることすら困難な場合があります。感情のアップ・ダウンが極端です。

※特に年配の方だと精神論で鼓舞してくれる方が一定数いて気持ちは大変嬉しいのですが、逆にその期待が重たくなってしまいますよね。「気合と根性でガンガンいこうぜ！」タイプの方は悪気はない方が多いのですが「やればできる！！You can do it !」は重たく感じてしまいます。。

# 本題

私の課題としては以下があると思います。

```
興味を持てないことに対してどうやって対処するか
興味を持てることでどうやって優位性を確保するのか
```
メンタルヘルスを確保するためには、「案外やってて楽しい」とか「これは自分にもできそう」とか「これだったら少々つらいことがあってもがまんできる」とかそういったことは実感する必要があるのですが、こういったことは結局やってみないとわからないことが多いのも問題ですよね。日常生活の中に、モチベーション向上に繋がることを見出す習慣をつけていきたいです。

# 最後に

メンタルヘルスについては日本社会でも鬱病などで問題になっているので、早めに精神科などで診療が必要です。話を聞いてもらうだけでもだいぶ楽になるのでオススメ。職場の人だと門前払いに合う可能性が高いので個人的にはオススメしません。
ベイズ統計モデリング 4.2

表の出る確率0.8のコインを投げ続けるとどうなるか。
``` r
N = 1000 # Specify the total number of flips, denoted N.
pHeads = 0.8 # Specify underlying probability of heads.
# Flip a coin N times and compute the running proportion of heads at each flip.
# Generate a random sample of N flips (heads=1, tails=0):
flipSequence = sample( x=c(0,1), prob=c(1-pHeads,pHeads), size=N, replace=TRUE )
# Compute the running proportion of heads:
r = cumsum( flipSequence ) # Cumulative sum: Number of heads at each step.
n = 1:N                    # Number of flips at each step.
runProp = r / n            # Component by component division.
# Graph the running proportion:
plot( n , runProp , type="o" , log="x" , col="skyblue" ,
      xlim=c(1,N) , ylim=c(0.0,1.0) , cex.axis=1.5 ,
      xlab="Flip Number" , ylab="Proportion Heads" , cex.lab=1.5 ,
      main="Running Proportion of Heads" , cex.main=1.5 )
# Plot a dotted horizontal reference line:
abline( h=pHeads , lty="dotted" )
# Display the beginning of the flip sequence:
flipLetters = paste( c("T","H")[flipSequence[1:10]+1] , collapse="" )
displayString = paste0( "Flip Sequence = " , flipLetters , "..." )
text( N , .9 , displayString , adj=c(1,0.5) , cex=1.3 )
# Display the relative frequency at the end of the sequence.
text( N , .8 , paste("End Proportion =",runProp[N]) , adj=c(1,0.5) , cex=1.3 )
```

![](https://i.imgur.com/leX2jo3.png)
AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'? の解決

## 遭遇環境
OS: Windows 10
version: Python 3.12
IDE: PyCharm2022
開発環境: PycharmでのNewProjectによる仮想環境

## 状況
Python3.12で開発を行おうとしたところ、pipコマンドでエラー発生

## 結論
PyCharm2023でNewProjectを作成

## 考察
これまでのPyCharm2022とPyCharm2023では仮想環境を作成するプロセスが違うのだと思います。

参考記事
[Python3.12のpipがバグってる件&とりあえずの修正方法](https://chacha-py.hatenablog.com/entry/2023/10/24/000537)

こちらの方が示してくれている通り、
`
python3.12/site-packages/pip
`
の中のコードが違っています。


PyCharm2022でNewProjectを行う際にインタプリタを3.12に指定してもなぜかインタプリタ名が3.10になっていたので、試しに3.12のPython.exeを直接指定したところ、仮想環境の構築に失敗しました...
(´・ω・｀)
UserDefaultsを使用したデータ保存・読み込み時のエラー　でつまづいた


# UserDefaultsを使用したデータ保存・読み込み時のエラーとその解決策

## 概要
UserDefaultsを使用してカスタムオブジェクトを保存・読み込む際、データ型の不一致が一般的な問題として挙げられます。ここでは、間違った実装例とその修正例を示します。

## UserDefaultsとは
UserDefaultsは、iOSのキーバリューストアで、アプリの設定やプリファレンスなどの軽量なデータを保存するために使用されます。主にString、Integer、Booleanなどの単純なデータ型を保存するのに適しています。

了解しました。以下は、UserDefaultsでのデータ保存と読み込みに関して、ダメな例とその修正例を挙げた内容です。



## ダメな例
以下は、`MyCustomObject`型のデータをUserDefaultsに保存し、読み込もうとした際の間違った実装例です。

### モデル定義（間違った例）

```swift
struct MyCustomObject: Codable {
    var name: String
    var value: Int
    // 他のプロパティ...
}
```

### 保存処理（間違った例）

```swift
let myObject = MyCustomObject(name: "Test", value: 1)
let encoder = JSONEncoder()
if let encoded = try? encoder.encode(myObject) {
    UserDefaults.standard.set(encoded, forKey: "myObjectKey")
}
```

### 読み込み処理（間違った例）

```swift
if let savedData = UserDefaults.standard.data(forKey: "myObjectKey"),
   let loadedObject = try? JSONDecoder().decode([MyCustomObject].self, from: savedData) {
    // オブジェクトの使用
}
```

ここでの問題は、保存したデータが`MyCustomObject`型の単一オブジェクトであるにも関わらず、読み込み時に`[MyCustomObject]`（オブジェクトの配列）としてデコードしようとしている点です。

## 修正例
問題の原因は、保存されたデータ型と読み込み時のデータ型が一致していないことです。以下は、この問題を修正した例です。

### 保存処理（修正例）

```swift
// 変更なし
```

### 読み込み処理（修正例）

```swift
if let savedData = UserDefaults.standard.data(forKey: "myObjectKey"),
   let loadedObject = try? JSONDecoder().decode(MyCustomObject.self, from: savedData) {
    // ここでloadedObjectを使用
}
```

この修正では、保存されたデータを単一の`MyCustomObject`型としてデコードしています。

## そもそも

`[MyCustomObject]`（オブジェクトの配列）と単一の`MyCustomObject`型は、Swiftにおいて全く異なるデータ型です。

- **単一の`MyCustomObject`型**:
  これは一つの`MyCustomObject`インスタンスを意味します。例えば、ある特定のユーザーの情報や一つの商品の詳細など、単一のデータエンティティを表すのに用います。

  ```swift
  struct MyCustomObject {
      var name: String
      var value: Int
  }

  let singleObject = MyCustomObject(name: "Test", value: 1)
  ```

  この例では、`singleObject`は一つの`MyCustomObject`型のインスタンスです。

- **`[MyCustomObject]`（オブジェクトの配列）**:
  これは`MyCustomObject`型のオブジェクトを複数含む配列です。各要素が`MyCustomObject`型のオブジェクトで、それらを一つのリストまたはコレクションとしてまとめています。

  ```swift
  let arrayOfObjects = [
      MyCustomObject(name: "Test1", value: 1),
      MyCustomObject(name: "Test2", value: 2)
  ]
  ```

  この例では、`arrayOfObjects`は二つの`MyCustomObject`型のインスタンスを含む配列です。

データの保存や読み込みを行う際には、これらの型の違いを意識することが重要です。たとえば、UserDefaultsに単一のオブジェクトを保存した場合、読み込み時には同じ単一のオブジェクト型としてデコードする必要があります。配列として保存した場合は、配列として読み込む必要があります。これらの型の不一致は、デコード時のエラーの一般的な原因です。
## 結論
UserDefaultsを用いたカスタムオブジェクトの保存・読み込みにおいては、保存時と読み込み時のデータ型が完全に一致していることが重要です。型の不一致はエラーの原因となるため、注意深く確認することが必要です。
AWS API Gateway の主要な認証方法の比較表

| 認証方法               | 特徴                                                                                       | 利点                                                         | 制限・注意事項                                               |
|------------------------|--------------------------------------------------------------------------------------------|--------------------------------------------------------------|--------------------------------------------------------------|
| IAM ロールとポリシー     | - AWS クレデンシャルが必要。<br>- ロールとポリシーによるアクセス制御。                       | - ネイティブ AWS インフラストラクチャの利用。<br>- 細かいアクセス制御。 | - クレデンシャルの管理が必要。<br>- クライアント側の実装が必要。 |
| API キー                | - API キーを使用してアクセスを制御。<br>- トラフィックの追跡とモニタリングが可能。           | - シンプルで導入が容易。<br>- 制限付きのアクセスを提供。         | - API キーが漏洩するとセキュリティリスク。<br>- キーの管理が必要。 |
| Lambda オーソライザー    | - カスタム認可ロジックを AWS Lambda 関数で実装。<br>- カスタマイズ性が高い。                | - カスタム認可ロジックの柔軟性。<br>- サーバーレスなアーキテクチャ。 | - Lambda 関数のデプロイと管理が必要。<br>- レイテンシーの影響。   |
| Cognito ユーザープール | - ユーザー管理、認証、認可を Cognito で実行。<br>- ソーシャルプロバイダーのサポート。     | - ユーザーの管理が容易。<br>- ソーシャルログインのサポート。     | - ユーザープールの設定が必要。<br>- Cognito のコストが発生。   |
| カスタムオーソライザー  | - カスタムサーバーレス関数や OAuth プロバイダーを使用。<br>- カスタム認可ロジックの柔軟性。  | - サーバーレスなアーキテクチャ。<br>- カスタム認可ロジックの実現。 | - サーバーレス関数のデプロイと管理が必要。<br>- レイテンシーの影響。 |
| クライアント証明書      | - SSL/TLS 接続においてクライアントとサーバーが証明書を交換して認証。                     | - セキュアな通信。<br>- クライアント証明書に基づく強力な認証。   | - クライアント証明書の配布と管理が必要。<br>- サーバーの設定が必要。 |
xlsxがGitHubでメンテナンスされなくなり、npmにも最新が公開されない件

# 1.背景
npm audit でxlsxの脆弱性があることを知った為です。

```terminal
xlsx  *
Severity: high
Prototype Pollution in sheetJS - https://github.com/advisories/GHSA-4r6h-8v6p-xvw6
No fix available
node_modules/xlsx
```

# 2.内容

https://github.com/advisories/GHSA-4r6h-8v6p-xvw6

>SheetJS CE 0.19.2までのすべてのバージョンには、特別に細工されたファイルを読み込む際の「プロトタイプ汚染」の脆弱性があります。任意のファイルを読み込まないワークフロー（例えば、表計算ファイルへのデータのエクスポート）は影響を受けません。
GitHub でホストされているリポジトリと npm パッケージ xlsx はもはや保守されていないため、脆弱性のないバージョンを npm 経由で見つけることはできません。

# 3.対応策

https://docs.sheetjs.com/docs/getting-started/installation/nodejs#legacy-endpoints

```terminal
npm rm --save xlsx
npm i --save https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz
```

```terminal
pnpm rm xlsx
pnpm install https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz
```

```terminal
yarn remove xlsx
yarn add https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz
```

# 4.参考
- [XLSX Package vulnerabilities found but there is no newer package](https://stackoverflow.com/questions/76101101/xlsx-package-vulnerabilities-found-but-there-is-no-newer-package)
Docker ✖️ Javaのシンプル開発環境

# 背景
アルゴリズムを勉強しようかなと思ったら、Javaで書かれているのでJavaの環境がサクッと作りたかった。

# 参考
https://qiita.com/A-Kira/items/0dda255e00771f556e2a
基本はこの記事通りにやれば環境できます。

# 環境
```zsh
# MacOSのバージョン
$ sw_vers
ProductName:		macOS
ProductVersion:		14.2.1
BuildVersion:		23C71
# Dockerのバージョン
$ docker -v
Docker version 20.10.21, build baeda1f
# docker compose のバージョン
$ docker compose version
Docker Compose version v2.13.0
```

# 追加ファイル
* .gitignore
* Makefile

いずれもルートディレクトリに追加してます。

## .gitignore
classファイルはgit管理から除外。バージョン管理しても意味ないので。

```:.gitignore
*.class
```

## Makefile
コンテナに入ってからコンパイルとかするのも面倒なので追加。
```:Makefile
bash:
	docker-compose exec java bash

version:
	docker-compose exec java java -version

javac:
	docker-compose exec java javac $(FILE)
```

```:実行結果
🔰algorism  (main)  $ make bash
docker-compose exec java bash
root@1ea859550e81:/usr/src# 
root@1ea859550e81:/usr/src# exit
exit

🔰algorism  (main)  $ make version
docker-compose exec java java -version
openjdk version "11.0.16" 2022-07-19
OpenJDK Runtime Environment 18.9 (build 11.0.16+8)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.16+8, mixed mode, sharing)

🔰algorism  (main)  $ make javac FILE=Main.java
docker-compose exec java javac Main.java
```

* `make bash`でコンテナに入る
* `make version`でjavaのバージョン確認
* `make javac FILE=<ファイルパス>でコンパイル

とりあえずでこれで環境は十分！！さーやるぞー
go で巨大 slice を作ると遅い

# これは何？

先日、go で巨大な slice を作ると遅いことに気がついたので、どれぐらい遅いのかを調べようと思い、今日も楽しいマイクロベンチマーク。

# 登場人物

コンピュータは
* MacBook Pro M1 (非Max)。
* Raspberry Pi 3B+ with 32bit Raspberry Pi OS
* Raspberry Pi 3B+ with 64bit Raspberry Pi OS

の三者。

go は、どこでも go 1.21。
C++ も使うんだけど、こちらは macOS では Apple Clang 15。ラズパイでは gcc-10。

# 調べたこと

`make([]uint8, n)`、`malloc(n)`、`std::vector<char>(n);` などの方法でメモリ確保っぽい処理をおこない、その時間を測り、グラフにした。代表値は 5回やって中央値を採用。

## メモリの確保っぽい処理

メモリの確保っぽい処理は、以下の通り。

* `make([]uint8, n)` on go
* `make([]uint8, 0, n)` on go
* `malloc` on C++
* `calloc` on C++
* `vector<char>(n)` on C++
* `vector<char>()` → `reserve(n)` on C++
* `vector<char>()` → `resize(n)` on C++
* `new char[n]` on C++

# 調査結果

縦軸は時間。単位はミリ秒。対数目盛注意。
横軸は確保したメモリの指数。例えば 10 だったら 2の10乗 バイト。

## C++ on macOS
![cpp_clang_macm1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/f349c134-7970-3b5b-f619-c266f2cb2cb1.png)

2の14乗 バイト前後で上に行っているのがゼロで埋める人たち。下に行っているのが 値が不定で良いと思っている人たち。

それはいいんだけど、2の18乗 バイト付近で `calloc` が下に行く。これは OS に「初めからゼロで埋まっていることがわかっているメモリを提供する」という機能があるから。この機能はある程度大きなメモリブロックでしか使えないのでそれまではチマチマゼロ埋めするんだけど、ある大きさ以上はチマチマゼロ埋めしなくて良くなるので `calloc` が急に速くなる。

`vector` の `reserve` は、メモリの確保するだけで値は未初期化で放置になる。
`vector` は末尾以降へのアクセスが違法なのでこれでよい。

あと。 `vector<char>(n)` が `calloc` にならないのはちょっと残念。

## Go on macOS
![go_macm1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/11a47946-f4a2-d016-1c7f-522fb8f58abf.png)

一方 go は、`make([]uint8,0,n)` でも `make([]uint8,n)` と同じだけ時間がかかる。

これは、メモリ確保済みであれば スライスの末尾より先のメモリへのアクセスが合法だから仕方ない。C/C++ の `malloc` に相当するような「メモリ確保はするけど値の初期化はしないでね」に相当する処理は言語機能としては存在しないと思ってるんだけどどうだろう。

そして `calloc` を使ってくれるということもないので、巨大スライスの確保はどうやっても遅い。

## C++ on ラズパイ64bit

![cpp_gcc_rp64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/3574b55b-c3b8-d773-8c5b-bfa94c57e72b.png)

macOS ほど見やすくはないけど、同じ傾向。

## Go on ラズパイ64bit

![go_rp64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/a018d110-56f0-54f4-10b0-84ffaa5779c1.png)

mac と同じ。サイズが大きいと時間はサイズに比例する感じ。

## C++ on ラズパイ32bit

![cpp_gcc_rp32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/80f8edfa-5d47-2acf-f322-826e5c502e9c.png)

やはり mac と同じ。`calloc` が途中で ゼロ初期化必要チーム から離脱して `malloc` の仲間になる。

## Go on ラズパイ32bit

![go_rp64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/e72320b2-a99e-a0e0-ebe2-106acb0adcfe.png)

こちらも mac と同じく、サイズゼロにしてもキャパシティが大きいと遅くなる。

# まとめ

go で巨大スライスを確保する場合。
ゼロ埋めが要素数分走るので、どうやっても遅い。ということだと思う。

C/C++ だと `malloc` の様に未初期化で放置という手段もあるし、`calloc` の様に OS の不思議な力で一瞬で終わらせるという手段も（OSによっては）ある。go にはそういう選択肢はない。

こういうところで、go はスピード狂向けじゃないんだなと思う。

あと。
コードは
https://github.com/nabetani/allocbench
に置いた。
Expoでeas buildのad-hocのprovisioning profileに新しい端末を追加できない時

# 前提
- Expoのmanaged workflow
- expo-dev-clientを利用している
- eas buildを利用している
- iOSむけにad-hocビルドを配信したい


# 問題
- 新しいiOS端末を検証端末として登録したかった
- そのために`eas device:create`をして、新しい端末のUUIDを登録した
- その後`eas build --profile development --platform ios`でad-hocのビルド実行した(--profile developmentのdevelopmentのところは各自のeas.jsonの設定によって異なります)
- eas cliから`The provisioning profile is missing the following devices`と尋ねられるので、さっき`eas device:create`で登録した端末を選択して続行
- `Failed to provision 1 of the selected devices:0000xxxx-000359960C21xxxx (iPhone)`という警告メッセージが表示されて、そのままビルドが続行される
- ビルドしたアプリを新しい端末にインストールしようとすると「このAppは、整合性を確認できなかったためインストールできません。」と表示されてインストールできない

ちなみに、Apple Developerの[devices](https://developer.apple.com/account/resources/devices/list)でには新しい端末はちゃんと登録されている。

# 解決方法
- [Expoのコンソール](https://expo.dev/)から、provisioning profileを削除して、もう一度`eas build`する（その時にeas cliの指示に従って新しい端末含めてprovisioning profileを作り直す）
- 念の為Apple Developerからも今使っているprovisioning Profileを削除しておく(しなくてもいいかも)

# provisioning profileの削除の方法
Expoのコンソールトップ
↓
Projectsからprovisioning profileを削除したいprojectを選択
↓
左ペインからProject settingsの中のCredentialsを選択
↓
iOSを選択
↓
Ad-hocを選択
↓
Provisioning Profileの欄から削除したいprovisioning profileを削除

![スクリーンショット 2024-01-14 17.52.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268579/87b8c272-b977-58e8-4a6b-efe300939d8c.png)


# 参考情報
https://github.com/expo/eas-cli/issues/2107

# おわりに
この問題に遭遇した個人開発アプリは↓です
[【個人開発】「後で」返事ができる文通チャットアプリ「レイター」を作った話](https://note.com/0ba/n/n10ea38136202)

XやThreadsでも個人開発について発信しています
→https://twitter.com/ObataGenta
→https://www.threads.net/@g.0bt
Python試験をコンプリートしました

# 1.はじめに
[一般社団法人Pythonエンジニア育成推進協会](https://www.pythonic-exam.com/)が実施しているPython試験に全て合格しました。[^本記事除外試験]
そこでせっかくなので各試験を受験しての所感等を記載します。
各試験で合格体験記も投稿しているので、併せて見ていただければと思います。[^合格体験記除外試験]
本記事では主に合格体験記に記載していないことを記載します。


# 2.PythonZen & PEP 8 検定試験
### 2-1.試験詳細

https://pythonzen-pep8-exam.jp/

### 2-2.所感
試験を通じてPythonでコードを書く際のお作法等が学べました。
この試験に関連した問題が「Python 3 エンジニア認定基礎試験」や「Python 3 エンジニア認定実践試験」で出題され、それらの対策にもなるので最初に受験すると良いと思いました。

ちなみに、ブラウザ上でいつでも何回でも無料で受験でき、問題数も少ないので気軽に受験出来ます。


# 3.Python 3 エンジニア認定基礎試験
### 3-1.試験詳細

https://www.pythonic-exam.com/exam/basic

### 3-2.テキスト(主教材)

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

### 3-3.合格体験記

https://www.pythonic-exam.com/archives/4574

### 3-4.所感
試験の難易度感は「[PRIME STUDY](https://study.prime-strategy.co.jp/)」の模擬試験が近い感じだったと思います(うろ覚え)。

テキストはほぼ読んでいませんが、少し読んで良さそうな感じがしたので、読んだり不明点をテキストで調べたりしても良かったかもしれません。


# 4.Python 3 エンジニア認定データ分析試験
### 4-1.試験詳細

https://www.pythonic-exam.com/exam/analyist

### 4-2.テキスト(主教材)

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

### 4-3.合格体験記

https://www.pythonic-exam.com/archives/5702

### 4-4.所感
試験の難易度感はこちらも「[PRIME STUDY](https://study.prime-strategy.co.jp/)」の模擬試験が近い感じだったと思います(うろ覚え)。

テキストはPythonを用いてのデータ分析・機械学習について内容がまとまっており、とても良かったです。
試験対策だけでなく、学習や開発する際の参考書としても良いと思いました。
ただ数学に関しては内容が不足していると感じたので、他のサイトや書籍等で補いました。

ちなみに、個人的には今後を見据えて数学の勉強はしっかりと行った方が良いと考えています(この試験に合格するだけであれば不要かもしれませんが)。


# 5.Python 3 エンジニア認定実践試験
### 5-1.試験詳細

https://www.pythonic-exam.com/exam/jissen

### 5-2.テキスト(主教材)

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

### 5-3.合格体験記

https://www.pythonic-exam.com/archives/7124

:::note info
合格体験記に記載の通り「[ディープロ](https://diver.diveintocode.jp/dive_into_exam/36)」の模擬試験も受験しましたが、試験対策には主に「[模擬試験WEBアプリ](https://python-basic.com/#panel-menu03)」の模擬試験を受験しました。[^模擬試験WEBアプリ]
「模擬試験WEBアプリ」の各問題には、解説だけでなくテキストのページ番号も記載されているので、非常にありがたかったです。

ちなみに、今後「PRIME STUDY」の模擬試験も公開予定とのことです。[^実践試験PRIME_STUDY模擬試験]
試験勉強をしていて模擬試験の数が少ないと感じたので、公開されたらこちらも受験すると良いかもしれません。
:::

### 5-4.所感
試験の難易度感は「模擬試験WEBアプリ」の上級と同程度かそれ以上、といった感じでした。
模擬試験の数が少なかったこともあり、試験本番は結構不安でしたが、無事合格出来て良かったです。

テキストは内容がかなり充実しており、網羅性も高いので非常に良かったです。
試験対策だけでなく、学習や開発する際の参考書としても良いと思いました。


# 6.終わりに
どの試験もPythonやPythonを用いたデータ分析・機械学習の知見を深めるのに良い試験でした。
試験勉強を通じて学んだ事が実際の開発にも役立っているので、受験して良かったです。

「[Python 3 エンジニア認定データ分析実践試験](https://www.pythonic-exam.com/archives/news/cpda)」も2024年中に実施予定とのことなので、開始されたら受験しようと思います。


[^本記事除外試験]:本記事では以下2試験は除外。
・「[Pythonとネットワークの自動化基礎検定](https://network-engineer.jp/pynet_basic)」:外部提携試験のため。
・「[Python 3 エンジニア認定データ分析実践試験](https://www.pythonic-exam.com/archives/news/cpda)」:本記事投稿日の2024/01/14時点で未実施のため。
[^合格体験記除外試験]:「PythonZen & PEP 8 検定試験」は合格体験記応募の対象外のため除外。
[^模擬試験WEBアプリ]:有志の方が作成した非公式のWEBアプリなので、合格体験記には記載しませんでした。
[^実践試験PRIME_STUDY模擬試験]:本記事投稿日の2024/01/14時点では未公開。