OmniAICreator/Qiita-1.07M huggingface dataset:
クローンアプリを作ってみたーNetflixクローン②

# はじめに
初めまして！
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい！自分が学んだ足跡を残していきたい！と思い記事を書きました！
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:
その中でもこれってどういう意味？とかつまづいたところを念入りに書いていこうかと思います。:fist:

# 今回の目的
nextjsはまだですが、実際のアプリ開発からどう作られていくかを学んでいくためにクローンアプリを開発します。
とは言っても自分で考えることは特になくYoutubeを見てやっていきます。
その中で覚えておきたい部分を分類ごとに記載していきます。なので、その時々に知ったことを小出しにしていく形になります。

前回

https://qiita.com/mr_noppo/items/9ddbe9ca6b69b8c1829f

# 使用したものや事前準備
・Macbook Pro
・Visual Studio Code

# 使用にさせていただいた動画

https://www.youtube.com/watch?v=mqUN4N2q4qY&t=4201s

# Next.jsの知識
### 更新用関数
set関数内でpropsを受け取るようにすれば現在のstate値を受け取れる（スナップされた値ではない）
```tsx
setVariant((currentVariant) => currentVariant === "login" ? "register" : "login")
```
# Prismaの知識
### 拡張機能
Prismaでinstall、コード補完、書式設定、定義へのジャンプなど。

### 設定
#### npm install -D prisma
インストール

#### npx prisma init
prismaフォルダ生成,providerは好きなものに変更
![スクリーンショット 2024-06-29 12.32.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/7594c991-c388-7ffa-34e4-635f13f85896.png)

#### npm install @prisma/client
データベースに対するクエリを簡単かつ効率的に実行するための自動生成される型安全なクエリビルダー

#### gloval.d.ts
globalオブジェクトを使ってアプリケーション全体で共有される変数を保持することができる。
追加するには下記
```ts
declare global {
  namespace globalThis {
    var prismadb: PrismaClient
  }
}
```
#### Atlas
MongoDBのデータベースをクラウドでホストするためのフルマネージドサービス
無料プランでプロジェクト（スキーマ？）を一つ作れる。
ソースコードからの接続方法は「Connect」ボタンを押してVsCodeの項目参照
![スクリーンショット 2024-06-29 14.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/0d4b12e4-eb33-c616-3fd3-c531b45cbc15.png)
URIの末尾にデータベース名を追加すること。下記のエラーが出る
![スクリーンショット 2024-06-29 14.35.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/cc101de8-0009-a188-4f9d-5d7d726ea55d.png)

#### schema.prisma
modelはテーブル定義が作れる

#### ＠＠unique([provider, providerAccountId])
provider と providerAccountId の組み合わせが一意であることを保証する。

#### id String ＠id ＠default(auto()) ＠map("_id") ＠db.ObjectId
一意であり、デフォルトでObjectIdを自動生成。
mongoDBの実際のカラム名は_idで、idで紐付けている。

#### ＠updatedAt
レコードの更新時に自動で値を現在日時に更新

#### user User ＠relation(fields: [userId], references: [id], onDelete: Cascade)
userIdとUesrモデルのidを紐づける。Userモデルの関連するレコードが消えた場合、紐づいているuserIdレコードが削除される

#### npx prisma db push
Databaseにmodel情報をpush

# 次
まだ
知識ゼロからLpicレベル１に合格する勉強法 

## 初めに
以前、知識ゼロの状態からLpicレベル１を取得いたしました(Linuxがなんなのかも知りませんでした)。
その際の勉強方法をまとめさせていただきました。
拙い文章ですがよろしくお願いします。

## Lpicとは
一言で言えばLinuxの技術者認定資格です。
レベル１〜レベル３まであり、私はレベル１を受験いたしました。
平均勉強時間は100時間〜150時間ぐらいになります。

## 勉強方法
### ①あずき本を１周する
あずき本と呼ばれるLinux教科書 LPICレベル1を一通り読みます。
ここでは完璧に覚える必要はなく書いてあることが理解できるぐらいで大丈夫です。

### ②Ping-tをひたすら行う。
Ping-tというサイトで模擬問題に挑戦します。
ここで間違った箇所をあずき本で復習するまでがワンセットです。
また、間違った問題は記録しておきましょう。
同じ問題で何回間違ったかによって苦手箇所を判別できます。
全ての問題で90%以上答えることができればこの段階は終了です。

### ③スピードマスターの問題を解く。
Ping-tで出てこない問題が割とあるので絶対にやった方がいいです。
ここでも間違った問題は記録しておきましょう。
一周して不正解だった箇所を再度行い90%以上の正答率になるまで勉強します。

### ④試験日まで苦手箇所をひたすら行う。
今まで間違った問題の中で間違った回数が上位のものから率先して復習しましょう。

## 試験日の決め方
試験日は勉強を開始する前に決めて、予約した方がいいです。
試験日を決めることによって計画を立てやすいですし、何より焦ります。
焦ることによって勉強をサボれなくなるのでおすすめです。
また、勉強時間に関しては101よりも102の方が難しいので102の方を長めに取ることをおすすめします。

## まとめ
ここまで偉そうに書いてきましたが実は一回102の試験で一回不合格になっています。
というのも、その時はスピードマスターでの勉強をしていなかったからです。
試験日によってはPing-tの問題が多く出る時もありますが逆にスピードマスターの問題が多く出る時もあるのでできる限りスピードマスターも忘れずにやりましょう！
ここまで読んでいただきありがとうございます。
この記事が何かの参考になれば幸いです。
GoでJSONレスポンスに含めたくないデータがあるときの対処法

ユーザーデータをJSONで返すとして、その中にパスワードなどの返す必要のないデータが含まれていたときに、簡単に除外する方法がある。

たとえば、User構造体にパスワードが含まれていて、それをJSONレスポンスに含めたくない場合は、構造体のJSONタグに`json:"-"`と書くと除外してくれる。

```go
package main

import (
	"encoding/json"
	"net/http"
)

type User struct {
	ID       int    `json:"id"`
	Name     string `json:"name"`
	Age      int    `json:"age"`
	Email    string `json:"email"`
	Password string `json:"-"`
}

func main() {
	user := User{
		ID:       1,
		Name:     "Test Test",
		Age:      25,
		Email:    "test@example.com",
		Password: "password",
	}

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		// userをJSONに変換
		userJSON, err := json.Marshal(user)
		if err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}

		// JSONをレスポンスとして返す
		w.Header().Set("Content-Type", "application/json")
		w.Write(userJSON)
	})

	http.ListenAndServe(":8080", nil)
}
```
RDSの中にデータベースをつくるとは

## はじめに
Amazon Relational Database Service（RDS）は、AWSが提供するリレーショナルデータベースの管理サービスです。
RDSを使用することで、データベースのセットアップ、運用、およびスケーリングが簡素化され、時間とコストを節約できます。

## RDSについて疑問に思ったこと
RDSはデータベースだと理解していました。
考えていたイメージでは管理画面でデータベースを作成した後は、中にテーブルを作成するイメージでした。
実際に使ってみると、MySQLではデフォルトで「mydatabase」というデータベースが存在していて、追加でデータベースを作る必要がありました。
RDSでデータベースを作成した後に下記のようなコマンドで中にさらにデータベースを作る必要があるということが疑問に思いました。

## 少し深ぼってRDSについて調べてみた結果
### RDSとデータベースの関係
RDSインスタンス：RDSは、リレーショナルデータベースの管理サービスです。RDSインスタンスは、データベースが動作する仮想サーバーのようなものです。インスタンス内で実際にデータを管理するためのデータベースを作成します。

データベース：RDSインスタンス内には、複数のデータベースを作成することができます。例えば、MySQLやPostgreSQLなどのRDSインスタンスを作成した後に、そのインスタンス内でアプリケーションごとにデータベースを作成して使用することが一般的です。

### データベース作成の手順
1.RDSインスタンスの作成：AWS管理コンソールを使用して、RDSインスタンスを作成します。このときに指定するのはデータベースエンジン（例：MySQL、PostgreSQLなど）、インスタンスのサイズ、ストレージなどです。

2.データベースの作成：RDSインスタンスを作成すると、その中に初期データベースが自動的に作成されます（例えば、MySQLではmydatabaseなど）。しかし、追加でデータベースを作成したい場合は、以下のようなSQLコマンドを使用して新しいデータベースを作成します。

## データベース作成の例
### RDSインスタンスへの接続：
RDSインスタンスに接続するためのクライアントツールを使用します。ここでは、MySQLクライアントを使用します。
```bash
mysql -h <エンドポイント> -P <ポート> -u <マスターユーザー名> -p
```
<エンドポイント>：RDSインスタンスのエンドポイント。
<ポート>：デフォルトでは3306（MySQLの場合）。
<マスターユーザー名>：作成時に指定したマスターユーザー名。

### 新しいデータベースの作成：
```sql
CREATE DATABASE mynewdatabase;
```
これにより、RDSインスタンス内にmynewdatabaseという新しいデータベースが作成されます。

## まとめ
RDSインスタンスはデータベースが動作する環境を提供します。
そのインスタンス内に、アプリケーションごとに複数のデータベースを作成して使用することが一般的です。
RDSインスタンスを作成した後に、新しいデータベースを追加で作成するには、データベースクライアントを使用してSQLコマンドを実行します。
これにより、データの管理、組織化、セキュリティ、スケーラビリティを向上させることができます。
[Laravel]ルーティングについてまとめてみました

## はじめに
Laravelを勉強中です。勉強をしていることを復習も兼ねてまとめてみました。

## 環境
macOS Sonoma14.5
Docker Desktop
Laravel11

## ルーティングとは

一言で言えば、ルートを管理する機能のことです。
ルートとはアクセスを設定している情報のこと。
つまり、コレコレのURLにアクセスしたらこういう処理をしてねー！という命令をしています。


## どうやって設定するの？

routesフォルダの中のweb.phpファイルに設定します。


◉必要なものは

*URL(アドレス、パスとも言う)
*GETとかPOSTメソッド
*割り当てたい処理(関数やコントローラ)


|書き方|
|:-----------
|Route :: get ('URL', function() {割り当てたい処理} );

(例)Laravelのトップページ
 ```Laravel:web.php
 Route::get('/', function () {
    return view('welcome');
});
 ```
 これは「get形式で '/'、URLに何も付けずにアクセスしたら実行してねー！welcomeファイルの内容をview(表示)してねー！」という命令をしています。
 
## おわりに
何度も記述する処理なので確実に抑えていきたいと思います。
また、名前付きルートnameや正規表現ルートWhereについてもまとめたいです。

## 参考記事
[【しっかり身につける】PHP基礎の学習後に見てほしいLaravel入門(Laravel11対応)
](https://www.udemy.com/course/laravel9/learn/lecture/31437906#content)
Proxmox/Cockpit で OS が起動しなかったりライセンス認証が行われなかったりする

メモです。以前 Proxmox をv8.1 に (ホスト OS のクリアインストールして) バージョンアップした際ゲスト OS が起動しなかったり一部商用サーバーのライセンスに失敗するという事象が起こりました。ここで議論されているものと原因が一致しているかは不明ですがこの対処法で私の問題も解決しました。

https://forum.proxmox.com/threads/problems-booting-from-iso-when-using-i440fx-latest.139948/

Promox の場合 v8.1 にバージョンアップすると私の環境では machine type が pc-i440fx-8.1 となっていました。OS が古い場合などにこれが悪さをするようで pc-i440fx-8.0 に変更することで問題が解決しました。Proxmox の場合は Web GUI から Hardware > Machine で変更ができます。

これと同じ問題が Ubuntu 24.04 上の Cockpit でも発生しました。手元の環境ではバージョンは 314-1 となっていますがこの環境では machine type は pc-q35-8.2 となっていました。

```
<type arch='x86_64' machine='pc-q35-8.2'>hvm</type>
```

こちらは恐らく Cockpit 上からは変えらることができないので virsh を使って該当の箇所を pc-q35-8.0 とすることで問題が解決しました。

```
# virsh edit bigip1
  <os>
    <type arch='x86_64' machine='pc-q35-8.0'>hvm</type>
```

Proxmox (KVM?) などのバージョンをアップデートして特に古い OS が起動しないなどの問題が発生した場合は試してみるのも良いかもしれません。
Laravelの「mapメソッド」について

## はじめに
Laravelのコレクションは、データ操作を簡単にするための豊富なメソッドを提供しています。その中でもmapメソッドは、コレクション内の各アイテムに対して指定したコールバック関数を適用し、新しいコレクションを作成するために使用されます。mapは、変換や処理を行うための強力なツールです。

## mapメソッドとは
mapメソッドは、コレクション内の各アイテムに対して指定されたコールバック関数を適用し、その結果を含む新しいコレクションを返します。元のコレクションは変更されず、処理結果を持つ新しいコレクションが返されるため、データ操作を安全に行うことができます。

### 基本的な使い方
例：コレクションの各アイテムを2倍にする例です。

#### 配列の変換
```
use Illuminate\Support\Collection;

$collection = collect([1, 2, 3, 4, 5]);

$multiplied = $collection->map(function ($item) {
    return $item * 2;
});

print_r($multiplied->all()); // [2, 4, 6, 8, 10]
```

#### データベースクエリ結果の変換
データベースから取得した結果を処理する例です。
```
$users = DB::table('users')->get();

$transformed = $users->map(function ($user) {
    return [
        'user_id' => $user->id,
        'full_name' => $user->first_name . ' ' . $user->last_name,
    ];
});

print_r($transformed->all());
```

#### ネストされたデータの処理
ネストされた配列やオブジェクトの各要素に対して処理を行う例です。
```
$nested = collect([
    ['name' => 'alice', 'hobbies' => ['reading', 'swimming']],
    ['name' => 'bob', 'hobbies' => ['hiking', 'cycling']],
]);

$transformed = $nested->map(function ($item) {
    return [
        'name' => ucfirst($item['name']),
        'hobbies' => collect($item['hobbies'])->map(function ($hobby) {
            return ucfirst($hobby);
        })->all(),
    ];
});

print_r($transformed->all());
// [
//     ['name' => 'Alice', 'hobbies' => ['Reading', 'Swimming']],
//     ['name' => 'Bob', 'hobbies' => ['Hiking', 'Cycling']],
// ]
```

## まとめ
Laravelのmapメソッドは、コレクションの各アイテムに対して指定した処理を適用し、新しいコレクションを作成するためのツールです。
mapメソッドを活用することで、効率的なデータ操作が可能になります。
npmとpackage.jsonについて

## はじめに
JavaScriptのパッケージ管理ツールであるnpmとその設定ファイルpackage.jsonについて解説します。
npm（Node Package Manager）は、JavaScriptのパッケージ管理ツールで、
package.jsonは、プロジェクトの依存関係やメタデータを管理するためのファイルです。

## npmとは
npmは、JavaScriptのパッケージ管理ツールであり、Node.jsとともにインストールされます。
npmを使用することで、JavaScriptのライブラリやパッケージを簡単にインストール、更新、削除することができます。

## npmを使う目的
### ライブラリやフレームワークの簡単なインストール
npmを使用すると、JavaScriptライブラリやフレームワークを簡単にインストールできます。例えば、ReactやExpressなどの人気ライブラリをコマンド一つでプロジェクトに追加できます。

### バージョン管理することで依存関係の管理できる
npmは、インストールしたパッケージのバージョンを正確に管理します。これにより、プロジェクトの依存関係が安定し、一貫性のある動作を保証できます。package.jsonファイルに依存関係のバージョンが記載されているため、プロジェクトの再現性が高まります。

```bash
// 例
npm install vue
npm install react
```

### ビルドやテストの自動化
npmスクリプトを使用して、ビルド、テスト、デプロイなどのタスクを自動化できます。package.jsonファイルにスクリプトを定義し、コマンド一つで実行できます。

```json
"scripts": {
  "dev": "docker-compose up -d",
}
```

```bash
npm run dev
```

### プロジェクトの一貫性と再現性
package.jsonとpackage-lock.json
package.jsonファイルにはプロジェクトのメタデータと依存関係が記載されており、プロジェクトの設定情報を一元管理できます。
また、package-lock.jsonファイルにはインストールされたパッケージの具体的なバージョンが記録されているため、他の開発者がプロジェクトをクローンしても同じ依存関係で環境を構築できます。

### モジュールの依存関係解決
npmは、パッケージ間の依存関係を自動的に解決し、必要な依存パッケージを再帰的にインストールします。これにより、依存関係の衝突やバージョンの不一致を避けることができます。
個人的にはこれが一番ありがたい機能です。

## package.jsonとは
package.jsonは、プロジェクトのメタデータ、依存関係、スクリプトなどを定義するJSONファイルです。npmを使用するプロジェクトのルートディレクトリに配置されます。

### package.jsonの構造
#### package.jsonの構造
```json
{
  "name": "my-project",
  "version": "1.0.0",
  "description": "A sample project",
  "main": "index.js",
  "scripts": {
    "dev": "docker-compose up -d",
  },
  "author": "Name",
  "license": "ISC",
  "dependencies": {
    "axios": "^1.6.1",
  },
  "devDependencies": {
    "laravel-vite-plugin": "^0.8.0",
    "vite": "^4.0.0"
  }
}

```

### 主な項目
name：プロジェクトの名前。
version：プロジェクトのバージョン。
description：プロジェクトの説明。
main：プロジェクトのエントリーポイント。
scripts：npmスクリプト。プロジェクトのタスクを定義します。
author：プロジェクトの作者。
license：プロジェクトのライセンス。
dependencies：プロジェクトの依存パッケージ。
devDependencies：開発時のみ必要な依存パッケージ。

## まとめ
npmとpackage.jsonは、JavaScriptおよびNode.jsプロジェクトの開発において重要な役割を果たします。
npmはパッケージ管理ツールとして依存関係の管理やパッケージのインストールを簡単にし、package.jsonはプロジェクトの依存関係を一元管理します。
JavaScript開発がより効率的に行えるようになります。
チーム開発で大切にしたいコミュニケーション

## まえがき

これはあくまで個人の意見であり、理想的なものとして捉えてください。
自分自身もすべてを実践できているわけではありません。

また、チームの規模や状況によっては実践が難しい場合もあるかと思います。
しかし、少しでも参考になる点があれば試験的に導入していただければ幸いです！

## チーム開発で大切にしたいコミュニケーション

それでは、過去の経験から「これをしておけばよかった」と思うコミュニケーション方法をご紹介します。

### 「報連相」の期待値すり合わせ

まずは「報連相」についてです。
これは社会人なら誰もが知っている基本的な概念ですが、その具体的な運用方法は人によって異なります。

例えば、以下のような点で期待値がズレることがあります：

- **報告のタイミング**：どの程度の段階でアラートを発するべきか
- **報告の頻度**：定期的な報告が必要か、必要なときにだけ報告するか
- **詳細さ**：報告内容はどの程度詳細にすべきか

これらの期待値がズレると問題が発生すると考えています。
そのため、チーム内で「報連相」の期待値をすり合わせることが重要でしょう。

個人的には特別な報告事項がなくても、
デイリーミーティングを設定し少しでも全員が話す機会を作ることをお勧めします。

「お互いに話をする」という心理的ハードルを少しでも下げるためです。

後述しますが、アイスブレイクを加えるとより効果的です。

### 進捗報告

こちらは「報連相」に含まれるものですが、特に重要だと思うため紹介します。

進捗報告では以下の点を確認する必要があります：

- **前回の報告からの進み具合**
- **ゴールに対しての現在地**

タスクには必ずスタートとゴールがあり、そこに期日という時間の制限が加わります。
そのため、適切な進捗管理をするためには**現在の速度**と**現在地**を把握するのが不可欠です。

例えばですが、次のようなフォーマットを使用すると効果的だと思います：

1. **進捗状況**：前回の報告からどれだけ進んだか
2. **現在地**：目標に対して現在どの位置にいるか
3. **次のステップ**：今後取り組むべきタスク

### テキストコミュニケーション

オフィス出社へ回帰する動きもありますが、リモートワークが一般的になったことでテキストコミュニケーションの重要性は一層増していると思います。

対面であれば身振り手振りやちょっとしたニュアンスの違いなどは伝えやすかったですが、
テキストコミュニケーションにおいては拾える情報はテキストだけになります。

何度もやり取りがあるとお互いにストレスですし、時間の浪費となります。

そのため、以下の点に注意して効果的なテキストコミュニケーションを心掛けましょう：

- **明確で簡潔なメッセージ**：要点を絞ってわかりやすく伝える。構造化をする
- **適切なツールの活用**：必ずしもテキストだけで完結させる必要はありません。適宜スライドや図などを用いてテキストの補足をしましょう

特に質問についてはこちらの記事がお勧めです。
質問者はもちろん、回答者が意識すべき点についても述べられています。

https://tech.classi.jp/entry/2021/12/07/120000

### ユビキタス言語の策定

こちらは以下の記事を見て自分なりに取り入れたいなと思ったものです。

https://zenn.dev/leaner_dev/articles/20210922-ubiquitous-language

チーム内での言語使用を統一することで、ビジネス理解が進みプロダクト開発の効率化が望めると思います。
また、認識齟齬が減り手戻りなどのリスク軽減にも繋がるでしょう。

詳細の取り組みは記事内でよくまとめられていますので、ぜひ参考にしてください。

### 根拠のない数値化をやめる

進捗状況を「80%完了」などといった個人の感覚で表現することはリスキーです。
根拠があればいいですが、今まで経験したものは大体が根拠のないものでした。

もしこのような報告があった場合は、次のような具体的な質問を行うと効果的です：

- **期日までにタスクが完了しそうか**
- **具体的な障害や課題があるか**

これにより、実際の状況を正確に把握することができます。

### アイスブレイク

個人的にはアイスブレイクの有無は非常に大きいと感じています。

リモートワークが増えた状況では、相手から得られる情報が限りなく少なくなります。
また、チームメンバーと「話す」ということのハードルすら上がる可能性もあると考えています。

そのような状況ではプロジェクトに影響を与える予兆をキャッチすることはできません。

**短い雑談**として2〜3分の軽い話題でリラックスする時間を設けましょう。

これにより、チームメンバー同士の理解が深まり、より良い協力関係が築けます。
アイスブレイクを積極的に取り入れ、コミュニケーションの質を向上させましょう！

## 最後に

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

もし他に工夫されているコミュニケーションの方法などあればぜひコメントなどでシェアいただけますと幸いです！

## 記事内で紹介した記事

https://tech.classi.jp/entry/2021/12/07/120000

https://zenn.dev/leaner_dev/articles/20210922-ubiquitous-language
[AWS SUMMIT2024 セッションレポート]意思決定者向けの生成 AI 入門

# はじめに
受講セッションの個人的な所感と、メモです。
メモの内容は、誤字脱字などあるやもしれませんが、ご了承ください。

# 概要
> 近年、生成 AI は多くの注目を集めています。このセッションでは、生成 AI とその応用先、およびこの新興技術の利点とリスクについて紹介します。生成 AI アプリケーションを構築するために使用できる AWS サービスを探ります。


# 所感
AI、生成AIを自社内で活用したり、自社プロダクトに組み込んでサービスの価値、ユーザーに提供できる価値を向上させたい、というのは今やどの企業も考えることだと思います。

しかしながら、エンジニアリソースが豊富で、AI分野に関する知識を十分に有する企業は、まだそう多くはない印象で、
今回のイベントの盛り上がりが、それを象徴している気がします。

結論から言うと、このお話はすごく参考になりました。
これからAIを使いたいぞ！っという方は是非に内容を確認してみてください。

そもそもの従来AIと生成AIの違い。活用事例。そして組織にAIを組み込むための心構え。

そもそもですが、AIを導入することが目的になってはいけません。
あくまでも、ビジネス課題の解決が目的であり、AIはその手段です。

自社にとって、導入することでどんなメリットをもたらすのか。
導入する上でのデメリット、懸念事項はなんなのか。
それらをクリアし、明確にし、責任をもってAIを導入する。

いいお話でした。


# 受講メモ
![PXL_20240620_075304782.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1458753/2f572f0b-40c5-7e50-fec9-76667fe7443f.jpeg)

## 顧客体験の向上
- チャットボット
- コンタクトセンター
- パーソナライゼーション
- SNS投稿監視

## 生産性を高める
- 検索
- コンテンツ作成
- テキスト要約
- コード生成

## 創造性
- アート
- ミュージック
- テキスト
- 画像
- アニメーション
- ビデオ

## 事業運営の改善
- 文書処理
- 品質管理
- 目視検査

## ヘルスケア
- 電子カルテ
  - 音声データからカルテ化
- 個別化医療
- 医療画像処理

## ライフサイエンス
- 創薬
- タンパク質構造予測
- 合成生物

## 金融サービス
- 不正検出
- ポートフォリオ管理
- 債権回収

## 製造業
- プロダクトデザイン
- プロセスの最適化
- 予防保全
- 材料科学

## リテール
- 価格最適化
- バーチャル試着
- 店舗レイアウトの最適化
- レビューの要約

## メディア
- 仮想現実

## コンピューティング
- 独自モデルの構築
  - SageMaker
- 基盤モデル
  - Bedrock

## 生成AIの活用事例
シナリオ：靴ブランドが新しい靴を製品ラインに追加
- 市場調査レポートの要約
- テーマをもとにコピーを作成
- これまでの内容をもとにSNS向けにテキストをリライトする
- 画像の背景を生成AIで作り替える
- 作成したファイルをS3にアップするためのPythonコードの作成
- ユーザーからの問い合わせ対応

## 基盤モデル
- ラベルなしのデータを事前に学習→事前トレーニング

## トランスフォーマー
- 単語の分解、単語同士のベクトルの計算

## コンテキスト
- 現在行っている会話の文脈
- 長い会話では継続しない
- 最大サイズがある

## 生成AIプロジェクトの計画
![PXL_20240620_082730282.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1458753/10f9b7fc-a540-a28a-9b73-1e57da63edeb.jpeg)

### スコープを定義する
- 収益：組織はこれをおこなうべきか？
- コスト：組織はこれが可能か？
- お客様：これを希望しているか？
- シンプルな計画
  - リテラシーのあるエンジニア向けのケース
- 強固な計画
  - 非エンジニア向けに必要なケース

### モデルの選択
- 事前学習済みのモデル（基盤モデル）
- ファインチューニング
  - 追加の学習が必要か

### モデルの適応
- プロンプトエンジニアリング
  - 入力に追加してあげるなど
- ファインチューニング

### モデルの使用
- 偏見など倫理観に欠ける回答をしないか
- ユーザーからのフィードバックをどう対応するか
- パフォーマンスの追跡
- 再トレーニングするために変更をどのように追跡するか（バージョン管理）

## リスク
### 公平性
- 偏りがない状態で全ての変数を平等に扱う

### プライバシー
- 個人情報を公開しない

### 有害性
- ハルシネーション
- 知的財産
- 盗作と不正行為
- 業務の混乱

## 生成AIを活かした組織の構築
### リーダーからはじめる
- 意思決定者から行動する
- トレーニングとリソースの提供
- 準備状況の確認
- 変化が従業員に与える影響を理解する

### 従業員の準備をする
- 教育
- 生成AIは学習モデルの一種
- 雇用の保障
  - AIが支援する未来
  - 新製品
  - 新しい役割
- メリットについて話し合う
  - タスクを自動化し、サービスを向上
  - 収益を増やす
- フィードバックするよう奨励する
  - 計画
  - 利用
  - フィードバック
- 継続的学習の重要性を強調
  - 新しいテクノロジーへの継続的な学習と適応

### チームで取り組む
- 専門家との協業
- データの品質と可搬性に重点を置く

### ガバナンスモデルの確立
- 透明性と説明責任
  - システムの責任など明確に定義する
- 倫理原則とガイドライン
  - プライバシー、公平性、透明性

## 実装
- パイロットプロジェクトから始める

## 監視と評価
- 定量的な定義
- 成功と失敗の把握

# 関連
- [AWS SUMMIT2024 参加レポート](https://qiita.com/yukiMiyoshi_fcafe/items/220bf886aa94ea552d3e)
EC2インストールにrbenv install -v 3.3.0を実行して失敗した

## 問題
EC2インスタンスに`rbenv install -v 3.3.0`を実行して失敗した。

## 原因
`fiddle`と`psych`がコンパイルされていない。

## エラー
```
*** Following extensions are not compiled:
fiddle:
	Could not be configured. It will not be installed.
	/home/ec2-user/tmp/ruby-build.20240629031939.85872.yDcKUz/ruby-3.3.0/ext/psych/tmp/ruby-build.20240629034052.97576.6eBHYO/ruby-3.3.0/ext/fiddle/extconf.rb:78: missing libffi. Please install libffi or use --with-libffi-source-dir with libffi source location.
	Check ext/fiddle/mkmf.log for more details.
psych:
	Could not be configured. It will not be installed.
	Check ext/psych/mkmf.log for more details.
*** Fix the problems, then remove these directories and try again if you want.
make[1]: *** [exts.mk:2422: note] Error 1
make[1]: Leaving directory '/home/ec2-user/tmp/ruby-build.20240629031939.85872.yDcKUz/ruby-3.3.0/ext/psych/tmp/ruby-build.20240629034052.97576.6eBHYO/ruby-3.3.0'
make: *** [uncommon.mk:398: build-ext] Error 2
external command failed with status 2

BUILD FAILED (Amazon Linux 2023 on x86_64 using ruby-build 20240612-2-g08aadf4)
```

## 試したこと
`missing libffi. Please install libffi or use --with-libffi-source-dir with libffi source location.`とあったので`libffi`をインストールしようとしたら、すでにあると言われた。
```
$ sudo yum -y install libffi
Last metadata expiration check: 2:06:48 ago on Sat Jun 29 01:44:21 2024.
Package libffi-3.4.4-1.amzn2023.0.1.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
```
psychのエラーは`ext/psych/mkmf.log for more details.`とあったので確認しにいった。
```:ext/psych/mkmf.log
pkg_config: checking for pkg-config for yaml-0.1... -------------------- not found

LD_LIBRARY_PATH=.:../.. pkg-config --exists yaml-0.1
package configuration for yaml-0.1 is not found
conftest.c:3:10: fatal error: yaml.h: No such file or directory
    3 | #include <yaml.h>
```

[Ruby 3.3.0のインストールエラー](https://book-reviews.blog/ruby-3.3.0-install-error/) こちらの記事では、`libyaml`をインストールしたら解決したとあったのでインストールしようとすると、すでにあると言われた。
```
$ sudo yum install -y libyaml
Last metadata expiration check: 2:37:40 ago on Sat Jun 29 01:44:21 2024.
Package libyaml-0.2.5-5.amzn2023.0.2.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
```

## 解決した方法
fiddleについては、`libffi`ではなく`libffi-devel`パッケージをインストールする必要があった。
```
sudo yum install -y libffi-devel
```
psychについては、`libyaml`ではなく`libyaml-devel`パッケージをインストールする必要があった。
```
sudo yum install -y libyaml-devel
```

## 参考記事
https://zenn.dev/tmtms/articles/202212-ruby32-6
[AWS SUMMIT2024 セッションレポート]大規模クラウドインフラ設計・構築案件の歩き方

# はじめに
受講セッションの個人的な所感と、メモです。
メモの内容は、誤字脱字などあるやもしれませんが、ご了承ください。

# 概要
> クラウド技術のコモディティ化により、エンタープライズ分野では近年、AWS 上での大規模なアプリケーション開発が一般的になりつつあります。これを支えるクラウドインフラ設計についても、求められる非機能要件の高度化と関連する AWS サービスの多様化に伴って、多人数でのチーム設計やアプリケーションチームとの効果的な連携が求められることが増えてきました。 本セッションでは、AWS Professional Services の豊富な実績を元に、クラウドインフラの設計・構築およびテストを円滑に進める上での実践的知見をご紹介します。

# 所感
私は、バックエンドもインフラもやるけど、フロント寄りなフルスタックエンジニアなのですが、
大規模インフラでなくとも、設計・仕様を明文化し、チーム内に落とし込み、エンジニア活動を運用していく上では、
とても参考になる話でした。

責任分解や、開発方針など、チーム運用する上ではとても大事な考え方ですね。

特に印象的な言葉としては、「人は忘れる」ですね。
当然なのですが、これを前提に考えることが大事な気がします。

# 聴講メモ

## 案件での経験に基づく大規模インフラの設計・構築案件の学び

### 何を作る？

- アプリインフラ
- 運用インフラ

### 特徴、解決すべき問題

- 関係者が増える
- 想定外が増える
- 堅牢さが求められる

### 設計

#### 骨組みづくり

どこから手をつける？

- 設計書の一覧
    - 可能な限り細分化する
    - 運用インフラは要件を精査し、全量洗い出す
    - アプリインフラは変わることがあるので as-is で
    - 主担当の明確化
- 設計書項目の整理
    - 設計事由は必ず含める
    - 人は忘れる
    - 細かな検討経緯は論点ごとに ADR を作り、設計書からリンク
- 詳細設計書の取り扱いの方針を決める
    - 初版は IaC＋文書、以降は IaC を正とする
    - 手動管理部分は設計書を継続メンテナンス
- 進捗の定義
    - 何が済んでいれば完了かを定める
    - 設計メンバーの自走、作業の並列化を促す

### アプリ、インフラチームの責任分解

アプリインフラをどちらがどこまで作るか？
CI/CD など、どちらにも関わるものは、どちらがやるか明確にする。

開発方針とガバナンスを軸に検討する。

IAM や EC2 など、どちらがどんな権限を持っていた方がいいか？など。

### コーディングルール

IaC にもルールは必要？

- 必要。ルールを定め、自動化支援コードを作成。
- 利用するツール、命名規則、関数の利用方針など

### 静的解析

セキュリティチェック、リンター

セキュリティの強制（SAST）

### コスト管理は今すぐ始める

開発時点で始めるのが鉄則。
開発環境での異常動作や残置リソースなども確認する。

例) タスク定義の問題で無限ループ、ログの異常な書き込みなど

AWS Budgets、Cost Explorer だけでも活用する。

### クリティカルパスの特定

IaC さえ書き上げれば OK?
大規模、本番環境では IaC だけでは完結しない。

手動管理の方が合理的なケース、
ルート権限など、IaC で対応できないケースなど。

### 展開手順の整備

展開手順の組み立て方
読むのは自分ではないので、ローコンテキストを心がける。

### クラウドリソースのテスト

IaC のテストはどう考えればいい？

- 実環境
- 疎通性
- 性能
に焦点を当てる。

- 単体テスト
    - 生成物が、指定した環境に書いた通りに作成されているか
- 結合テスト
    - コード、アプリインフラ、運用インフラが疎通できるか
- 負荷テスト

# 関連
- [AWS SUMMIT2024 参加レポート](https://qiita.com/yukiMiyoshi_fcafe/items/220bf886aa94ea552d3e)
plsql

```` sqlplus : plsql.sql
DECLARE
    CURSOR c1 IS
        SELECT ABC.col1, ABC.col2, BCD.col3
        FROM ABC
        LEFT JOIN BCD 
          ON ABC.col1 = BCD.col1 
          AND ABC.col2 = BCD.col2
        ORDER BY ABC.col1;
    
    v_max_col3 BCD.col3%TYPE;
    v_row_num INTEGER := 0;
    v_col3 BCD.col3%TYPE;
BEGIN
    -- 最大のシーケンス値を取得
    SELECT MAX(BCD.col3) INTO v_max_col3
    FROM ABC  left outer join BCD 
    ON ABC.col1 = BCD.col1 AND ABC.col2 = BCD.col2;
    -- シーケンス値が無い場合、開始は０
    if v_max_col3 is null then
      v_max_col3 := 0;
    end if;
    FOR r IN c1 LOOP
        IF r.col3 IS NULL THEN
            v_row_num := v_row_num + 1;
            v_col3 := v_max_col3 + v_row_num;
        ELSE
            v_col3 := r.col3;
        END IF;
        
        -- Output the result
        DBMS_OUTPUT.PUT_LINE('col1: ' || r.col1 || ', col3: ' || v_col3);
    END LOOP;
END;
/
````
【ツール】>関数を簡単に生成！ 乱数を作る関数メーカー for JavaScript

コーデイングしていて、重複しても何でもいいからとりあえず、簡単に乱数を生成したくなる時ってありますよね。
今回はツールの「関数を簡単に生成！ 乱数を作る関数メーカー for JavaScript」を紹介します！
# 概要

__こちらから使えます！__

https://randommathjavascript.calc.haruharutv.jp/

### 使用技術
```
* HTML
* CSS
* JAVASCRPIT
```


* 画面のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/79016155-adef-d726-b819-86b0d8ed028b.png)

## 使い方

すごくシンプルで、サイトを開き最小値と最大値を入力し
生成ボタンを押せば簡単に生成できます！

![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/44f72ee4-3560-5ab8-9fb1-46d57cbadada.png)

このコードを変数を使用するのと同様の方法で参照すれば、指定した範囲の乱数を生成できます！

### 試してみる

実験のために軽くさっきのコードを使ってJavascriptを組んでみます。
```html
あなたのワンタイムコードは<strong id="random"></strong>
<script>
document.getElementById("random").innerHTML=Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000;
</script>
```
![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/cff88314-0339-d61c-78ce-3f5a49c0bc58.png)

こんな感じで組んで試すと、しっかり動いているのがわかります。


## ぜひブックマーク等に入れていつでもご利用ください！
今日もエンジニアの皆さんを応援しています！

お役に立てればぜひいいねお願いします//

まあ、管理には大体UUIDが使われていますが、乱数を使う場面があればぜひお試しください！
一行のコードで済むので楽だと思います！(GASとかサーバ系言語は確かにUUIDも簡単に生成できるけど)
Cloudflare R2のオブジェクトを直接インターネットに公開してみる（カスタムドメイン使用）

## 概要

R2のオブジェクト（htmlファイル）を直接インターネットに公開し、ブラウザからアクセスしてみる。
前回はr2.devのドメインを使った公開を行った。今回はカスタムドメインを使用して公開してみる。

前回↓

https://qiita.com/miriwo/items/a67bc420d5cec926518b

## 前提

Cloudflareに DNSで管理されているドメイン、またはサブドメインがあること。筆者は下記の対応でDNSをRoute53からCloudflareDNSに移管し、R2のカスタムドメインはpublic.www.miriwo.workを用いることにする。（実はwww.miriwo.workを使いたかったけどCloudflare Works&Pagesで使ってて、）

https://qiita.com/miriwo/items/9f807c177962ea6fa304

下記のindex.htmlをアップロードして公開してみる。

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
  <h1>Hello Cloudflare R2(Custom Domain)</h1>
</body>
</html>
```

## 方法

1. 公開用バケット（筆者の場合バケット名は「public-custom-domain」）を追加
    - 位置情報： 自動
    - デフォルトのストレージ クラス： Standard
1. バケットの詳細画面で「設定タブ」を開き下部の「カスタムドメイン」の「ドメインに接続」をクリック

    ![CleanShot 2024-06-29 at 01.17.17@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/62e48fe8-d1bb-20d2-aa2d-b9b925fdba06.png)

   ![CleanShot 2024-06-29 at 01.18.25@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/75896fa5-5b54-9f6c-97ed-8a5a712f825d.png)

1. カスタムドメインを入力して「続行」をクリック

    ![CleanShot 2024-06-29 at 13.19.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d0105e19-a668-9a11-ac1a-c8a0950b7779.png)

1. CNAMEレコードを追加する案内が出るので「ドメインに接続」をクリック

    ![CleanShot 2024-06-29 at 13.20.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/11a2a77e-549e-49c0-08a4-ab75bbfba201.png)

1. ドラックアンドドロップでindex.htmlをバケットにアップロード
1. アップロードしたオブジェクトの詳細を開き、URLをコピー

    ![CleanShot 2024-06-29 at 13.22.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a0e25fa0-5ca5-19ee-164f-042a30110d8b.png)

1. コピーしたURLをブラウザに貼り付けて、下記のようなページが表示されれば完了

    ![CleanShot 2024-06-29 at 13.23.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/e73f621f-9d55-6f23-232f-20b6fce0ecef.png)

1. デフォルトで7日後にアップロードを中止？するルールが付与されている模様なので不要なら編集したりしたほうがいい

    ![CleanShot 2024-06-29 at 13.27.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/293545f6-a5e0-1d8c-7a6f-3157ee7aa440.png)

1. 本体験後には当該のバケットへのアクセス許可を無効に設定しておいた。

## 参考文献

https://developers.cloudflare.com/r2/buckets/public-buckets/#custom-domains
開発始めます

日曜大工のような感じで開発始めてみます。

今回は、ktor+thymeleaf+exposed+mysqlの構成で作ってみる。

理由は
・エンジニアだったのが2011年までなので、新しい技術を吸収したい
・ktorなのは、kotlin好きなのと、Spring等のDI以外の新しい概念に触れてみたい
・thymeleafにしたのは、SPAの重量感回避のため
　→入口での学習コスト、実装中の作りこみ・コンパイルコスト、継続するバージョンアップ回避
 ・exposedにしたのは、kotlin、ktorと同じ開発元だから

 とはいえ、途中で方向転換するかも。
 ゆるく開発します。
M34 点滅IC の応用

# M34 点滅IC とは

データシートより

![dat1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/a520ac2b-19cf-cef1-fefc-d3a1735daf71.png)

> （Google翻訳）
M34 シリーズは、LSI CMOS テクノロジで実装された低電圧シングル出力 LED 点滅コントローラ IC です。RC 発振回路が内蔵されているため、必要な外付け部品は最小限です。さまざまな点滅周波数が用意されており、さまざまなアプリケーションに対応します。

4タイプあります。

![dat2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/ba365d76-9704-ef26-69fe-3c2f9e9bcff0.png)

手元に M34-8L と 2585 があるので、実際にLEDを点滅させてみます。

<img width="240" alt="IMG_3408.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/ff3d0cc4-1520-5080-60b7-59af2d55e278.png" />

# LEDを点滅させてみる

結構な速さで点滅します。

<img width="300" alt="led.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/0c884d15-6d7a-0207-0e92-db2e8b3fca5b.png" />

マルチテスターで周波数を測定すると、8.911Hzでした（毎秒9回点滅）。
公称の8Hzより高くなりました。

他のICで測定すると、9.112Hz だったので、個体間差は2％ほどです。
データシートによると、精度は ±20％となっており、6.4Hz 〜 9.6Hz になります。



# 応用してみた

[タッチリレーボード](https://www.switch-science.com/products/2455)と組み合わせると、スマホ画面を高速にタップできます。マイコンとか不要です。

[<img width="150" alt="リレータッチボード" src="https://www.switch-science.com/cdn/shop/files/81af2a8a-c70a-428e-872c-dd7878b24e62_500x500.jpg" />](https://www.switch-science.com/products/2455) 　 <img width="100" alt="IMG_3412.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/c04e818d-b556-e30f-7af6-6ee83802e608.png" />

- 配線図

<img width="360" alt="cir.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/bc4a7a26-4806-034f-e4e1-42c376e71e22.png" />


<img width="200" alt="IMG_0007.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/72d51e77-6bfd-e622-7ede-0d002ac64b02.png" />


自作アプリで タップ周期を計測しました。
約23秒間で207回タップして、  ラスト10タップの換算周波数は 9.093Hzでした。
（マルチテスターで測定すると 8.918Hz）

今回の実験ではUSB充電器の5V電源を使用しましたが、ボタン電池の3Vでも動作しますので、屋外での使用も十分可能です。

# 編集後記

需要が無いのか、古くから有るICですが最近は見かけなくなりました。
ネットを検索すると、共立エレショップさんがヒットしました。
- M34-8L 	https://eleshop.jp/shop/g/g6CM313/
- M34-2L 	https://eleshop.jp/shop/g/g6CM311/
- M34-1L 	https://eleshop.jp/shop/g/g71C314/
品質を考えたテスト設計

# いいテストを作れば品質は上がるか？
答えはYesです。
でもそれだけでは片手落ちだと思っています。
なぜなら、どれだけいいテストを作ってもその前段の工程で崩れていたら品質なんて上がるわけないからです。
構想策定レビュー、要件定義レビュー、設計レビュー、PGレビュー...
テストに入る前に上記のようなレビューがあると思いますが、ここで障害の種を取り続けて初めて有効なテストが行えるようになります。ウォーターフォールはVではなく、Wでやらなくてはいけない理由と同じですかね。
構想策定レビューでＩＴ戦略の目的を、要件定義レビューではシステムの目的を、設計レビューでは導入する機能を、と各工程でしっかりレビューをしましょう。
 __テスト工程に入る前にはプロジェクトの成否は決まっている__ のです。

# 本題
良いテストの作り方教えろよ。と。
わかります。以下に記載します。

テスト作成の手順は以下の通りです。

1. テスト実施計画書・要領の作成
1. テストのジャンル分け
1. テストシナリオ作成
1. テストパターン作成
1. テスト仕様書作成
5.1. テスト予想結果作成
5.2. テストデータ作成

5のふたつは必須ではないです。
2~5の工程は各テストフェーズで繰り返し行います。

# テスト実施計画書・実施要領の作成
これを一から書く企業はあまりないと思うので省略します。
# テストのジャンル分け
テストを作成する前に何のテストをするのか分けていきます。
例えば...
1. 画面遷移
1. 入出力（画面）
1. 入出力（DB）
1. 機能連携
1. モックアップ比較
1. セキュリティ
1. マルチデバイス対応
などなど...各テストフェーズごとに実施するテストを選択していきます。
単体テストならホワイトボックステスト、結合テストからはブラックボックステストが望ましいです。（WAFの都合上総合テストで限界値をする場合もある）
# テストシナリオ作成
テストの分類分けができたら、各テストで「何をするか、何をしないか」を明確にします。
画面遷移の場合は、あくまで遷移できたかに着目する。モックアップは画面の表示のみに着目する。入出力では正常に結果が表示されること、準正常系が反映されていることなどを確認します。
大分あっさりですが、私は以下のように書くことが多いです。
画面遷移の例
| テストID | テスト対象 | テスト内容 |
|:-:|:-:|:-:|
| UT_1_1  | ○○画面→××画面  | 画面遷移すること。  |
| UT_1_2  |  ××画面 |  各タブ/モーダルに遷移できること。 |
| UT_1_3  | ××画面→◇◇画面  |  画面遷移すること。 |

入出力（画面）の例。
| テストID | テスト対象 | テスト内容 |
|:-:|:-:|:-:|
| UT_2_1  | ○○画面  |  ・入力内容が正常に反映されていること。・バリデーションチェックが行われていること。 |
| UT_2_2  | ××画面  |  ・入力内容が正常に反映されていること。・バリデーションチェックが行われていること。 |
| UT_2_3  | ◇◇画面  | ・入力内容が正常に反映されていること。・バリデーションチェックが行われていること。  |

# テストパターン作成
ここではテストで具体的に何をするかを作りこみます。
イメージとして、テストパターンがあれば別の人でもそれを基にしてテスト仕様書を作れるようなモノを想定しています。
例として...
画面遷移の場合は「どこの画面からどの画面に遷移するか明記。
表示されているURLは"https:..."であること。」
こんな感じです。画面表示などはあっさりでいいですが、
入出力（画面）の場合ですと、入出力の正常系で確認すべき全項目の網羅。（正しいデータが入力された際に、出力機能があるすべての項目で正常に出力されていることの確認）に加え、
準正常系で実施するバリデーションチェックのバリエーションの網羅があり、こちらが結構しんどいです。
また、例を示します。
1. 入力可能な項目の必須（必須入力のみ）
1. 文字種（半角英数のみなど）
1. 境界値（入力可能桁数など）
1. 文字水準（第三水準、第四水準）
1. 数値の場合は範囲チェック
1. 形式チェック（メアドや電話番号）
1. 項目Aが出力された時の項目Bの値の相関チェック
1. 「業務的にXの時は項目Cの値は変化する」などの業務チェック
ぱっと思いつくだけでこれだけあるので、ここら辺を網羅していきます。

なお、相関チェックで項目数が莫大な数になる場合ですが、ペアワイズ法などを利用することでバグを効率的に検出しつつ、工数削減に繋げられます。
# テスト仕様書作成
テストパターンをもとにテスト仕様書を書き起こしていきます。
1. テストID
1. テスト担当者
1. テスト実施手順
1. 想定結果（テスト予想結果を参照させる）
1. 実施結果
1. テスト実施日

などが記載できればOKですかね。
ここら辺は作業なんでそのうちAIで自動化したいところです。

# テスト予想結果作成
テスト仕様書の項番ごとにテスト予想結果を書きます。
例えば、
1. XXテーブルの●●カラムが1になること
1. 画面Aの３項目に◇◇と表示されていること

みたいな感じです。
画面遷移やモックアップは別に作らなくてもいいと思いますが、
入出力のテストでは必要になります。
ここは大分めんどくさいですが、頑張って作りましょう。

# テストデータ作成
テスト仕様書の結果がいつでも再現できるように利用するテストデータを作成します。
そうすることで、後続の工程で別の人がテストをする場合でも手間取ることなくテストができるのです。
AIが仕様書と予想結果から自動で作ってくれる未来に早くナラナイカナー！

ちなみに、テスト仕様書と予想結果、テストデータのクオリティとしては __テスターとして新規参画してきた人が特に疑問なくテストを進められること（テストの成否がわかること）__ です。

# 一通り揃ったら
レビューの時間だァ！
問題なくレビューが通ったらテスターにやってもらいましょう。（テスターも組み込み系ならともかく、WebアプリならAIにやってもらいたいですね）

そして、上述の流れを 単体、結合、総合、受入の各フェーズで回していきます。

このテスト手法はテスト準備の工数がかかりますが、質の高いテストと素早いテスト実施が見込めるので品質を考慮するなら是非行ってほしいものです。
また、 __テストデータを作成する方法や、SQLなども証跡として残して再利用可能にする__ とテストをより素早く回すことができますので周知してみてください。（テストの入りで工数がかかるので開発時にそもそも作ってもらうとなお良）

# おわりに
品質を突き詰めていくならここに書いたものでは済まない思いますが、備忘録も兼ねてテストについてまとめを書いてみました。

ぜひみなさんも（めんどくさいとは言わずに）バグを検出しまくって、ともに高品質なプロダクトを作っていきましょう。
強化mibのSNMPtrapの飛ばし方

監視設定の追加要件でSNMPtrapの受信設定をすることが多々あるけど、先日依頼された拡張mibのトラップ設定で、Variable Bind値のoidの指定があって、トラップの送受信テストをするのに苦労したのでメモっときます。

## コマンド
　snmptrap 
### コマンド全文
　snmptrap -v [バージョン] -c [コミュニティ文字列] [トラップ受信ホスト] '' [拡張mib値] [強化mib値] [強化mib値の型] [強化mib値の型の値]
 #### 記述サンプル
 　snmptrap -v 2c -c mycommunity host-hoge '' 1.3.6.1.4.1.9.9.13.3.0.9 1.3.6.1.4.1.9.9.13.1.5.1.3 i 4

# 参考
https://changineer.info/server/monitoring/monitoring_snmp.html#toc7

それではまた〜
『BIG THINGS』に学ぶ、スクラム開発におけるモジュール化と反復の重要性

# はじめに
『BIG THINGS　どデカいことを成し遂げたヤツらはなにをしたのか？』([Amazonへのリンク](https://www.amazon.co.jp/dp/B0D143YRBP))を読了し、ソフトウェア開発者として学ぶべきことが多かった。

著者によると世界中の大きなプロジェクト（鉄道建設、発電所建設、学校建設など）の99.5%は、当初に計画された費用、期間、便益を達成できないと統計的に示している。

確かにソフトウェア開発でも大きなプロジェクトになれば計画が難航し、精緻に計画しようと作られたガントチャートは、度重なるトラブルにより頻繁に見直される。

計画に十分すぎるほどの時間をかけていたのになぜうまくプロジェクトを運営できないのか、私自身よくわかっていなかった。

この本はソフトウェア開発においても大きな手助けになるものだった。

# 本書の主張
大まかに要約するならば、主張は以下の通りだ。

大きなプロジェクトが失敗する一つの要因として、大きなシステムを1つの塊として作ろうとしていることがあげられる。大きなプロジェクトをレゴブロックのように小さなモジュールの集合体として扱うことで、各モジュールの作成を一つずつ反復することが可能になり、ポジティブラーニングの効果を得る。このため、プロジェクトメンバーは反復を通して作業の習熟が図れる。また、モジュールが十分小さいことで、ブラックスワン（パンデミックなど）のような大きな障害が起こる確率を減らすことができる。

# スクラム開発におけるモジュール化と反復の重要性

スクラム開発では、プロジェクトを小さなモジュール（スプリント）に分割して、それぞれのスプリントで機能的な価値を提供することが重要である。レゴブロックのように、それぞれのモジュールが独立していて、組み合わせることで全体のシステムが構築されるイメージだ。

具体的には、以下のようなスクラムのアプローチがある：

1. **スプリントの計画と実行**: 各スプリントは通常2週間から1ヶ月程度の期間で、チームはその期間中に機能的な成果を生み出すことを目指す。各スプリントは小さなプロジェクトと見なすことができ、スプリントの開始時にはそのスプリントで達成する目標（スプリントゴール）を明確にする。

2. **モジュールの分割と優先順位付け**: プロダクトバックログから各スプリントに取り組むべきユーザーストーリーやタスクを取り出し、それを小さな作業単位（モジュール）として捉えます。これにより、大きなシステムを段階的に構築することが可能になる。

3. **反復と学習**: 各スプリントの終わりにはレビューと反省（レトロスペクティブ）を行い、チームはどうやってさらに効率的に仕事を進めるかを改善していきます。これにより、メンバーは継続的にスキルを向上させる機会を得ることがでる。

4. **リスクの管理**: 小さなスプリントでの作業は、ブラックスワンのような大きなリスクを減らす助けになる。各スプリントは短期間で完了するため、問題が発生した場合でもその影響を最小限に抑えることがでる。

このようにスクラムを適用することで、大きなプロジェクトの失敗を防ぎつつ、柔軟性を持った開発を行うことがでる。それぞれのスプリントが小さな成果を生み出すことで、プロジェクト全体の成功につながる道筋を築くことができる。
「なぜテストを書くのかは「テストを書いてよかった」という体験を通して、はじめて気づけるものです。」

## はじめに

◆この記事は何？
テストを書く理由について紹介する記事です。

◆対象は？
エンジニア
特にテストコードを書いていないエンジニア

◆この記事のねらい
- テストを書き始めるきっかけになること
- テストを継続的に書く動機づけになること

## 先に結論
- テストを書く理由は多岐にわたる
- これらの理由は、個人の心理や主観になる場合がある
- 体験を通じて「自分なりのテストを書く理由」を見つける

## 「テストを書いて良かった」という体験

「**なぜテストを書くのかは「テストを書いてよかった」という体験を通して、はじめて気づけるものです。**」は、書籍[『フロントエンド開発のためのテスト入門』](https://amzn.asia/d/0cfwOu6v)に出てくる印象的なフレーズです。本書の中で私が最も共感できた一文でした。

書籍『フロントエンド開発のためのテスト入門』の主題は、書籍名の通りフロントエンド開発ですが、第1章「テストの目的と障壁」と第2章「テスト手法とテスト戦略」は、全てのエンジニアにとって有益な内容です。

## テストを書くメリットは心理的なもの、だから体験した方がいい

テストを書く理由の説明で私がよく聞くのは、[「質とスピード」](https://speakerdeck.com/twada/quality-and-speed-2022-spring-edition?slide=69)の損益分岐点を用いた説明です。

> 「テスト自動化の損益分岐点は4回」

他にも次のようにテストを書く理由は説明できます。
> - 自分の実装の正しさを保証するた
> - PR レビューの工数を下げる
> - リファクタリングを実施しやすくするため
> - コードの品質を高めるため
> - テストそのものの工数を削減するため
> - バグを潰すため
> - 仕様書の代わりになるため

参考：　[「なぜテストコードを書くのか?」](https://zenn.dev/tis1116/articles/bef862a5754187)

上記のように様々な説明方法がありますが、私は最終的には**心理的な理由**に帰着すると考えます。

[「JJUG CCC 2024 Spring：テストコードが根付くチームを立ち上げるために考えたいこと」](https://www.docswell.com/s/Simplex/ZRXNDN-simplex_maeda01#p23)では、次のように紹介されています。

> テストを書くようになった理由を聞いてみると、「自信を持つため」「楽しいから」といった心理的なものだった

書籍『フロントエンド開発のためのテスト入門』でも、次のように言及されています。

> テストコードを書くことは、自身が書いたコード品質を見直す機会になります。（中略）様々な観点でコードを見直す機会が生まれるので、実装品質に対してより自信を持つことができます。

テストコードを書き続けると、自信や楽しさを得られます。

テストコードによって、**プログラミングの楽しさを、開発の楽しさを**増強してくれます。

テストを書く理由が心理的なものだからこそ体験が重要です。

## テストに答えがない、だから体験した方がいい

テストは、人によって言うことが異なります。

[「我々はなぜテストを書くのか / Why we write test codes」](https://speakerdeck.com/takaking22/why-we-write-test-codes)では次のように紹介されています。

> それぞれのテストコードがある
> 人によって時によって言ってることが違うように聞こえる

この資料では、テストには答えがないと指摘しながら、答えがないことへの取り組み方を紹介されています。

テストを書く理由が心理的なものに帰着するとすれば、人によって時によって言ってることが違うのは腑に落ちます。**テストを書く理由は主観的**と言えます。

テストに答えがないからこそ、テストを書く人によって理由が異なります。だからテストコードを書いて、「テストを書いて良かった」という体験した方が良いと考えます。

## おわりに

この記事では、テストコードを書く理由が様々あり、心理的なものになること、主観的になること、答えがないことを紹介しました。

自分なりの「テストコードを書く理由」を見つける一助となれば幸いです。


## 参考

- [『フロントエンド開発のためのテスト入門』](https://amzn.asia/d/0cfwOu6v)
- [「質とスピード」](https://speakerdeck.com/twada/quality-and-speed-2022-spring-edition?slide=69)
- 　[「なぜテストコードを書くのか?」](https://zenn.dev/tis1116/articles/bef862a5754187)
- [「JJUG CCC 2024 Spring：テストコードが根付くチームを立ち上げるために考えたいこと」](https://www.docswell.com/s/Simplex/ZRXNDN-simplex_maeda01#p23)
- 　[「我々はなぜテストを書くのか / Why we write test codes」](https://speakerdeck.com/takaking22/why-we-write-test-codes)
おじさんがFlutterで0から学んで開発していく　#2.5 Android Stadioの便利なプラグイン①

# Android Stadioのおすすめ拡張機能①

## 拡張機能
- Gerry Themes
- Rainbow Brackets

この2つだけで十分見やすくなりました。
以下参考記事で導入してください。
すごくわかりやすかったです。

参考記事
[【作業効率バク上がり】Android Studioの必須プラグイン（拡張機能）](https://kiyamayellow.com/blog/%E3%80%90%E4%BD%9C%E6%A5%AD%E5%8A%B9%E7%8E%87%E3%83%90%E3%82%AF%E4%B8%8A%E3%81%8C%E3%82%8A%E3%80%91android-studio%E3%81%AE%E5%BF%85%E9%A0%88%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%EF%BC%88/)

導入前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3298617/82833c5d-347f-bee5-e7cb-43cd0dfc6e6d.png)

導入後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3298617/fc69054a-19e5-6b9d-c47e-31284458d173.png)

## 注意点
UIを新しいUIなどに切り替えた場合、外観設定も解除されるので再度設定する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3298617/abb14ff2-16d7-d5b3-3857-96abf873fc14.png)
Goのインターフェイスの使い方

何らかの方法で通知をしたい場合を例に挙げる

1. インターフェイスSenderを宣言し、実装すべきメソッドを定義する
1. 送りたい手段の具体的な構造体を定義する（ここではSlackとメール）
1. その構造体にインターフェイスのメソッドを実装する
1. 使用する

```go
package main

type Sender interface {
	Send(msg string) error
}

type Slack struct {}

func (s *Slack) Send(msg string) error {
	// Slackにメッセージを送信する処理
	return nil
}

type Mail struct {}

func (m *Mail) Send(msg string) error {
	// メールを送信する処理
	return nil
}

func main() {
    var sender Sender

	sender = &Mail{}
	err := sender.Send("Hello, Mail!")
	if err != nil {
		// エラー処理
	}

	sender = &Slack{}
	err = sender.Send("Hello, Slack!")
	if err != nil {
		// エラー処理
	}
}
```

他の言語でも共通することだが、実装をインターフェイスに依存させることで、機能の差し替えがしやすくなったり、テストが書きやすくなる（モック）。

今回の例では、Slackとメールだが、LINEやChatworkなどの他の通知方法を実装する際にも、このインターフェイスのメソッドを実装すれば、既存の処理との差し替えが簡単にできるようになる。
Apple Watchのデベロッパーモードが表示されない時の対応方法

下記のやり方で「Apple Watch のディベロッパーモードが表示されない問題」が解決しなかったので、追加で試したことを共有します。

https://qiita.com/yoshitaka/items/84c85d3f023dee879242

## 環境
XCode   15.2
watchOS 10.5

## 解決方法

Apple Watch を腕につけて試しましょう。

ペアリングしたiPhoneをXcodeに接続することでディベロッパーモード設定項目が表示できませんでした。

（「このデバイスを信頼しますか？」というのもでません。）

その後、30分くらい時間をおいてApple watch を腕につけて試してみたところ、「信頼しますか？」という表示が出て、ディベロッパーモード設定項目が表示できるようになりました。

## 結論
時間をおいたこと、腕につけて試したこと、のどちらかがきっかけのようでした。

いずれにせよ、どういう条件でディベロッパーモードが表示されるのか、再現性があるのかは不明です。
3D カメラorbbec のgithubのexampleをながめる

最近の3Dカメラだと、利用例がどれだけ充実しているかが重要なポイントになる。
・物体検出プログラムとの連携
・物体検出（セグメンテーション）
・物体検出結果の３Dとしての解釈
・camera座標とworld座標
・物体の追跡機能
・人のポーズ推定
・顔検出
・SLAMなどの機能
## [比較対象とするZED SDK の場合](https://github.com/stereolabs/zed-sdk)
```
body tracking/
camera control/
camera streaming/
depth sensing/
global localization/
object detection/
plane detection/
positional tracking/
recording/
spatial mapping/
tutorials/
```

---------------------------------
# 今回の調査対象 OrbbecSDK
まずは、３Dカメラ自体としての性能が引き出せるSDKになっているのか。
いいSDKは満たすべき項目が似てくるから、
SDKの実装状況の差を見比べてみるとよい

## github [OrbbecSDK python binding](https://github.com/orbbec/pyorbbecsdk)

https://github.com/orbbec/pyorbbecsdk/tree/main/examples
### 注意点：
- orbbecは方式の異なる3Dカメラを開発しているので、提供されているスクリプトが、どの3Dカメラシリーズに対応しているのかに注意が必要。

- recorder.py: Demonstrates how to record the depth and color streams to a file.
- playback.py: Demonstrates how to play back recorded streams.

データの保存と再生がこのライブラリにも用意されている。

depth_color_sync_align_viewer.py:Demonstrates how to synchronize the depth and color streams.

ということは、工夫をしないとdepth 画像とcolor 画像の同期はとれていないのかもしれない。
それぞれのデータの取得時刻はどうなっているのか気になる。

IRのactive stereo画像とRGB画像では、カメラの取り付け位置の違い、画角の違いがある。
ある程度遠方ならば、対応点マッチングで視野角をそろえることはできる。
しかし、近距離側の場合、stereo のleft画像のカメラ位置とRGBのカメラ位置の違いが無視できなくなると予測する。

2024の時点では、まだStereolabs のZED　SDK ほどの豊富なサンプルの状況にはなっていないようだ。

https://github.com/orbbec/OrbbecSDK/tree/main/examples/cpp/Sample-DepthViewer

## [OrbbecSDK ROS2 wrapper](https://github.com/orbbec/OrbbecSDK_ROS2)
ROS2 に向けたコードもあるようだ。

## 私見（3Dカメラの選び方）
- ハードウェアやSDKのライブラリがEOLにならずに、最新のOS,C/C++、Pythonのバージョンに対してサポートし続けるのがいい。
- ユーザーが工夫しなくて使えるモジュールが多数あるものを使いたい。
- 複数の処理を実行した時に、マルチスレッドのことを考えてくれるとうれしい。
- 個々の検出処理のアルゴリズムは、今後も改定されていくことを念頭においた、インタフェースになっていてくれること。

### 自分のしたいことが既に十分に明らかになっている場合
 必要な範囲の性能・機能が既にその製品とSDKが満たしている場合、複数の選択肢の中から、量産時の導入が簡単なものを選ぶということが可能だ。
 使わない機能が実装されていないくても、なんら問題はない。
 ### 自分のしたいことに曖昧さが残っている場合
 必須であるライブラリの他に、関連するアプリケーションが動作できることを気にしてよいと思う。
 関連するアプリケーションが多い方が、使い方についての理解が進む。
 
そのため、例題が既に多数ある3Dカメラを選んで着手したほうがいい。

## 検討用の候補の購入はケチらないほうがいい
仕様上の性能と実際に達成される性能とは異なる
仕様上では明記されていない要因によって性能が制約されることは多い
例：フレームレートは出るが、遅延（レイテンシ）が大きい
例：使い方では、近距離側の測定不能領域が何10cmまで我慢できるのかを、作ってみて使ってみるまでわからないことがある。（画像計測技術の問題というよりも製品企画の問題である。）
　画像計測屋のできることとは、〇〇 cm 以遠を計測できる△△という機種を見つけましたということ。
数100ドルの価格帯で購入できる3Dカメラの場合、候補の購入はケチらないほうがいい
使ってみることで分かることは大きい。
Salesforceのインポートウィザードでのインポートから、Account Engagement経由に変更した場合の影響範囲と考慮事項


+ [最初に Pardot または Salesforce にデータをインポートしますか?](https://www.salesforceben.com/import-data-into-pardot-or-salesforce/)

----------
+ [Salesforceのインポートウィザードでのインポートから、Account Engagement経由に変更した場合の影響範囲と考慮事項](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epk3ESAQ)

こちらの内容を読むとSalesforce側でインポートしてAccount Engagementに連携する方法がいいように書かれてますね。

+ [Import Data Into Pardot or Salesforce First? ](https://www.salesforceben.com/import-data-into-pardot-or-salesforce/ )

この作業であれば、イベントリードを保存するカスタムオブジェクトを作って、このオブジェクトにデータをインポートして　あとは自動化処理でメールアドレスの突合せを行えば手動の作業よりは早いと思います。

また、今までの処理と同じ流れなので大きな問題は発生しないと思います。

すべての取引先責任者データと付け合わせる（メールアドレスで突合）
既存の取引先責任者とそれ以外に分ける
メールアドレスでの突合せの後ですが、

 ＞【それ以外】＝既存リードまたは新規データとなるはず… 

 ここで既存リードか新規データ（取引先責任者？）を区別するロジックがあれば、自動化処理にしてしまえば、かなりの工数低減が見込めると思います。

 もう少し、研究が必要と思いますが...

 **参考**

 + [Account Engagement (Pardot) Importing Prospects](https://pardotschool.com/account-engagement-pardot-importing-prospects/)
 + [How to Import Prospects Into Pardot While Ensuring Clean Data](https://thespotforpardot.com/2021/09/07/how-to-import-prospects-into-pardot-while-ensuring-clean-data/)
 + [Best way to import prospect in Pardot](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007BFFzxSAH)

:::note
If you import Prospect into Pardot that already Leads or Contact in Salesforce, it is a best practice to import both their Email and their Record ID in Salesforce to avoid duplicates. 

If you proceed that way, new Prospect will be created, existing ones will just be updated.

"Sync All Prospect" refers to a (weekly) Process you can launch to mass-synchronise existing Pardot Prospects with their Counterpart in Salesforce (Lead or Contact).

Salesforce にすでにリードまたは取引先責任者として登録されている見込み客を Pardot にインポートする場合、重複を避けるために、その見込み客のメール アドレスとレコード ID の両方を Salesforce にインポートすることがベスト プラクティスです。 

そのように進めると、新しい見込み客が作成され、既存の見込み客は更新されるだけです。

「すべての見込み客を同期」とは、既存の Pardot 見込み客を Salesforce 内の対応する見込み客 (リードまたは取引先責任者) と一括同期するために起動できる (毎週の) プロセスを指します。
:::
これだけは抑えておくGitコマンド

# はじめに
超基本のキとなるGitコマンドについて。
これだけ抑えておけばとりあえずはOKだよね、というコマンドのみ紹介していきます。

# 初期設定
```
// バージョン確認
git version

ユーザー名の設定、メールアドレスの設定
git config --global user.name "hogehoge"
git config --global user.email hogehoge@example.com
```

# Clone
```
git clone リポジトリのURL
```

# ファイル追加
```
// このファイルを反映させるんだぜ、と宣言するためにステージにファイルを追加
git add ファイル名
// 作業中のフォルダ内のファイルをすべて追加
git add .
```

# 変更確認（変更状態の確認）
```
// コミット前のワークツリー内の変更を確認
git status
```
![スクリーンショット 2024-06-29 12.18.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/2364fcf7-bddf-3d09-f2f6-bbd3b8b77ee5.png)


# 差分確認(変更内容の確認)
```
// ワークツリーとステージの全てのファイルの差分を確認
git diff
// 特定のファイルのみの差分をチェック
git diff ファイル名
```
![スクリーンショット 2024-06-29 12.18.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/cb3a26e3-8c54-5763-325c-a86aacb41ba9.png)



# コミット
```
//  変更点を表示してコミット
git commit -v 
// 変更のあったファイルすべてコミット
git commit -a 
```

# プッシュ
```
// git push リモート名 ブランチ
// 以下はmasterブランチにPUSHする時の例
git push origin master
```

# 一時退避
```
// 変更を退避
git stash -u
// 退避リストを見る
git stash list
```
stashの詳しい説明は以下ATLASSIAN公式参照
https://www.atlassian.com/ja/git/tutorials/saving-changes/git-stash

# 補足：コメントの書き方
兎に角修正理由について記載すること。
あまりにもコミット時のコメントが適当な人が多すぎるので。。

例）修正
　　Fix
  　設定を変更

意味があって修正したはずで、意味が無い修正であればコミットする意味は無いですよね？？
そのため、理由を書くべき。
概要やBackLogとかのチケットのURLを記載するでも全然OKだと思う。

以上
M1Macで.NETの環境構築

## 開発環境

- MacBook Pro (Apple M2)
- Sonoma 14.4.1
- VSCodeインストール済み

## 手順

1. VSCodeでプロジェクトを開く
1. VSCodeの拡張機能で「C# Dev Kit」をインストール
1. プロジェクトの.NETバージョンに合わせてSDKをインストール（macOSのArm64を選択）
    - https://dotnet.microsoft.com/ja-jp/download/dotnet/7.0
    - インストール確認
        ```
        $ dotnet --list-sdks
        7.0.410 [/usr/local/share/dotnet/sdk]
        ```
1. プロジェクトの依存関係をインストールする（ここは飛ばしてもbuildで自動実行されるらしい）
    ```
    $ dotnet restore
    ```
1. 正しくインストールできているか確認する
    ```
    $ dotnet build
    ```

## 参考

- https://learn.microsoft.com/ja-jp/dotnet/core/tools/dotnet-build

## よく使うコマンド

- `dotnet tool install --global dotnet-ef`
- `dotnet ef migrations add xxx` マイグレーション（事前にEntityを用意した状態で実行）
- `dotnet run --launch-profile http` ローカルでサーバー起動
- `dotnet format --verbosity diagnostic xxx.csproj` フォーマット
API、オープンソース、フレームワークってなに

# APIってなに
APIはアプリケーション プログラミング インターフェースの頭文字です
何かのプログラムを、また別の何かから呼び出すために使います。

アプリケーションの入り口をイメージします。
このURLで、アカウント名とキーワードと日付を引数(パラメータ)として実行すると、決まった物が返ってくるというのが決まっていてその決まりのことをAPIといいます。

例えばプログラムAに、Twitterで自動ツイートする機能があるとします。プログラムBは、プログラムAを使ってTwitterに12時になったら時報を送りたいと思っておるとします。
この時、プログラムBからAPIでプログラムAを呼び出して使います。その時に、どういった内容で呼び出したらいいのか、の規則が書いてあるものをAPIといいます。

![Pasted Graphic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821738/bb58f167-f7f7-7816-b839-04a913b7159f.png)


# オープンソースってなに
ソースコードのことです。（コードのことで例えばPythonで書いたものとかRubyで書いたものとか）
世の中に公開されていて、誰でもみれて誰でも使えるようになっているコードです。
誰かが書いてくれているコードをそのままダウンロードなどして、自分の作っているプログラムに使うことができます。

![Aを参考に開発.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821738/f2e0f4cf-4697-026d-5d9f-5acd6969869a.png)



# フレームワークとは
アプリを作る時の元になる基本の土台のようなものです。ケーキの方とか、レシピとかそんな感じです。
何を作るかは自分で決めますが、ここにこれを入れてこうのせると完成！みたいなもの。
あらかじめ、パーツとして準備されているものもあるのでそれらを組み合わせたりして開発します。
たとえば、このフォルダに画面のパーツを置きます、このフォルダにデータベースの設定を置きます、ここのフォルダを置きますと決まっていたり、フレームワークに搭載されている変数やメソッドを使うと簡単に実装できたりします。（テキストの読み込みとか、簡単にできたり）


# APIとオープンソース、フレームワークの違いは
APIは、コードは知りませんし、見えません。あくまでも呼び出す時には、こういう名前で、こういうパラメーターをつけて呼んでくれたら、こうやって回答するよ！というものです。
オープンソースは、コードそのものなのでクラスやメソッドをそのまま使います。オープンソースを流用して開発することができます。
フレームワークは、上にあるようなものを動かすための基盤になるものです。
ubuntu22.04(ラズパイ4)でディスプレイの解像度を変更する方法


# 1. 環境
- OS : Ubuntu22.04
- ハード: Raspberry Pi 4
# 2. 問題
テレビにHDMIで画面出力をしようとしたところ
ディスプレイの解像度が640x480で固定され、GUIで設定変更もできない

# 3. 解決策
以下の設定ファイルを編集する。
``` 
sudo nano /boot/firmware/config.txt
```
ファイル内の任意の箇所に設定を追加
```txt:config.txt
# HDMI設定
hdmi_group=1
hdmi_mode=16
hdmi_force_hotplug=1
disable_overscan=1
```
再起動
```
reboot
```


# HDMI設定の詳細説明
以下は設定内容のメモになります。
※claude3.5Sonnet に聞いた内容をそのまま貼り付けているので参考程度に見てください。

おそらくこちらが公式のドキュメントです
https://elinux.org/RPiconfig#Video_mode_options


## 1. `hdmi_group=1`

- **意味**: HDMIの出力モードのグループを指定します。
- **値の説明**:
  - `1` = CEA（消費者向け電子機器協会）規格。主にテレビで使用されます。
  - `2` = DMT（ディスプレイモニタータイミング）規格。主にコンピュータモニターで使用されます。
- **影響**: 接続されたディスプレイの種類に応じて適切な信号フォーマットを選択します。

## 2. `hdmi_mode=16`

- **意味**: 特定の解像度とリフレッシュレートを設定します。
- **値の説明**: モード16は、`hdmi_group=1`（CEA）の場合、1920x1080 @ 60Hz（1080p）を意味します。
- **影響**: ディスプレイの解像度とリフレッシュレートを明示的に指定します。

## 3. `hdmi_force_hotplug=1`

- **意味**: HDMI接続を常に有効にします。
- **値の説明**: 
  - `1` = 有効
  - `0` = 無効
- **影響**: Raspberry Piが起動時にHDMIケーブルが接続されていなくても、HDMI出力を強制的に有効にします。これにより、後からディスプレイを接続した際に正しく認識されやすくなります。

## 4. `disable_overscan=1`

- **意味**: オーバースキャンを無効にします。
- **値の説明**:
  - `1` = 無効
  - `0` = 有効
- **影響**: 画面の端が切れる問題（特に古いテレビで発生することがある）を解決します。画面全体が表示されるようになります。

# HDMI Mode Options

## For hdmi_group=1 (CEA)

| Mode | Resolution      | Aspect Ratio | Refresh Rate |
|------|-----------------|--------------|--------------|
| 1    | 640x480         | 4:3          | 60Hz         |
| 2    | 480p            | 4:3          | 60Hz         |
| 3    | 480p            | 16:9         | 60Hz         |
| 4    | 720p            | 16:9         | 60Hz         |
| 5    | 1080i           | 16:9         | 60Hz         |
| 6    | 480i            | 4:3          | 60Hz         |
| 7    | 480i            | 16:9         | 60Hz         |
| 16   | 1080p           | 16:9         | 60Hz         |
| 17   | 576p            | 4:3          | 50Hz         |
| 18   | 576p            | 16:9         | 50Hz         |
| 19   | 720p            | 16:9         | 50Hz         |
| 20   | 1080i           | 16:9         | 50Hz         |
| 21   | 576i            | 4:3          | 50Hz         |
| 22   | 576i            | 16:9         | 50Hz         |
| 31   | 1080p           | 16:9         | 50Hz         |
| 32   | 1080p           | 16:9         | 24Hz         |
| 33   | 1080p           | 16:9         | 25Hz         |
| 34   | 1080p           | 16:9         | 30Hz         |

## For hdmi_group=2 (DMT)

| Mode | Resolution      | Aspect Ratio | Refresh Rate |
|------|-----------------|--------------|--------------|
| 4    | 640x480         | 4:3          | 60Hz         |
| 9    | 800x600         | 4:3          | 60Hz         |
| 16   | 1024x768        | 4:3          | 60Hz         |
| 28   | 1280x800        | 16:10        | 60Hz         |
| 35   | 1280x1024       | 5:4          | 60Hz         |
| 36   | 1366x768        | 16:9         | 60Hz         |
| 51   | 1600x1200       | 4:3          | 60Hz         |
| 82   | 1920x1080       | 16:9         | 60Hz         |

以上