OmniAICreator/Qiita-1.07M huggingface dataset:
進捗会で使うテンプレ資料が使いづらそうだったので少し工夫してみた

エンジニアのみなさま、日々の学習本当にお疲れ様です！
また本記事まで足を運んでいただき本当に感謝です。
約3分程度で読めるので最後まで読んでもらえると幸いです。

# はじめに
案件でプロジェクト管理のサポートをしております。
案件ではタスクの進捗を把握するための「進捗会」なるものを設けております。
今回は進捗会で使用するテンプレ資料（Excel）を工夫した体験談を記事にしてみました。

「もっとこうした方が良いよ！」 や 「うちの会社ではこの様な考えで取り組んでます！」 があれば、ぜひぜひコメントで教えていただけますと幸いです。


# 前提

**進捗会で報告してもらう内容は以下の通り**
1. 対応したタスク
    - 対応したタスクは「作業時間」と「進捗率」も合わせて入力
2. 明日対応すること
    - 対応するタスクを入力
3. 相談事項・困っていること
    - あれば詳細を入力。無ければ「特になし」と入力

**進捗管理のツールとしてはExcelの他に「Backlog」と「WBS」を活用している**
- Backlog
    - 担当者がどのタスクを持っているかを把握してもらう
- WBS
    - プロジェクトリーダー以上へ報告するときに使う


# 工夫する前の資料

![スクリーンショット 2024-06-23 16.30.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/0d516126-e88d-8190-fb25-38d856dbb8fa.png)

スクロールするとこんな感じ
![20200623.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/0073c727-03f8-f3ed-0a73-f876dca89818.gif)

今まではWordを使って進捗管理をしていたのですが、以下の煩わしさを改善したいなと思い進捗管理のテンプレをExcelに変更しました。Excelの方がパッと見てプロジェクトメンバーの進捗がどの程度進んでいるのかが分かるため個人的にはこっちの方が好きです。

### ただこのテンプレには課題が多くて使いづらい...！

その理由としては以下になります。

#### 1. フリーワードのため、人によって入力内容の粒度が変わる

なんでも書けるのがメリットの一方で、管理側からすると入力の粒度が違うとプロジェクトリーダー以上に報告をするときに結構苦労します。特に対応したタスクはBacklogのタイトルを入力して欲しいものの、かなりの確率でタイトルとは違う内容が入力されてしまいます...

#### 2. 入力漏れが発生する

1にも関連しますが、「どのタスク」に「どれだけの時間」がかかって「何%進んだのか？」が知りたい情報になります。しかしながら、プロジェクトメンバーによっては作業時間や進捗率が書かれていない状態で報告をされる時が多々ありました。これも困る...

#### 3. シンプルに入力しづらい

1つのセルに入力をしてもらっていたので、改行するためにはMacだと **「option + Enter」**、Windowsだと **「Alt+Enter」** をしなければいけません。
開発に集中して進捗会の資料が入力できていない。そして急いで入力をしないといけない状態で押し間違えたりすると、プロジェクトメンバーとしては結構ストレスかなと感じてました。

上記をふまえ、テンプレ資料に少し工夫を加えました。その資料がこちら


# 工夫した後の資料

![スクリーンショット 2024-06-23 17.14.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/c67069c8-b84f-5c9f-777e-a13dbad2f05b.png)

スクロールするとこんな感じ
![20200623.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/c328bab2-2c18-efd0-aa35-c39ee99079c7.gif)

どこを工夫したかと言うと

### セルごとに対応したタスク・作業時間(h)・進捗率(%)の枠を設けた

たったこれだけですw
効果が出たらラッキーくらいの思いでプロジェクトメンバーに使ってもらうと以下の効果が出ました。

#### 1. Backlogのタイトル・作業時間・進捗率の入力漏れが無くなった

これに関しては感動レベルの効果でした。
不思議なもので枠を設けると「入力しないといけない」という心理が働くのか、入力漏れがなくなりました。
※そんな効果が実際にあるのかは調べてはいない

#### 2. 相談事項・困ったことの入力内容が端的になった

こちらもセルの枠の関係があるのか分かりませんが、聞きたいことだけを入力してもらえるようになったため、どう対策して欲しいのかがより明確になりました。

#### 3. 予実管理がしやすくなった

日々の進捗を抜け漏れなく入力してもらえる様になったため、どの作業にどれだけ時間がかかっているかの確認がしやすくなりました。


# 今回の気づき

内容自体はQiitaの記事にしても良いのか？甚だ疑問視するレベルのものですがw
個人的には少しの工夫で改善できたことが多かったことはかなり良い体験でした。
いつも何気なくやってしまっていることもたくさんあると思いますが、常に疑問を持ちながら

#### **「もう少し改善できないか？」** 
#### **「もっと良くなる方法や手順は無いか？」** 

を考える癖をつけることが大切だと改めて感じることが出来た内容でした！


# おまけ

あと追加で左上のセルには「今月の稼働時間」を追加しました。
例えば6月の場合、平日稼働は20日あるため、8時間勤務だと残業無しでも160h働くことになります。契約における稼働上限が180hの場合、この数値があるだけで **「あまり残業ができないな」** とか **「計画的に稼働するようにしよう」** という心理が働いてくれることを期待しています...！


# さいごに
記事の内容ショボくてすみません！w
こんな記事でも最後まで読んでいただいた方、本当にありがとうございました！

弊社のご紹介になります。

▼ コーポレートサイト

https://prum.jp/

▼ Wantedly求人

https://www.wantedly.com/projects/626662

弊社メンバーは学習した内容を日々Qiitaの記事にアウトプットしております。
弊社にご興味のある方、まずは求人を見てみてください！
ご応募お待ちしておりますー！
ラプラス変換を信号処理の観点から理解する


# ラプラス変換を信号処理の観点から理解する

フーリエ編はこちら

[フーリエ変換を信号処理の観点から理解する](https://qiita.com/soranjiro/items/08a05f9188a88b12741e)


## 1. ラプラス変換とは？

ラプラス変換は，フーリエ変換の一般化です．

### 高レベルの説明
ラプラス変換は，時間領域（t軸）で定義された関数を複素数平面の周波数領域（s軸）に変換する手法です．この変換により，微分方程式の解を求める際に便利な形式に変換されます．

### 数式
ラプラス変換は次のように定義されます：
```math
 \mathcal{L} \{ f(t) \} = F(s) = \int_0^\infty e^{-st} f(t) \, dt
```

ここで，
- $ f(t) $ は時間領域の関数
- $ F(s) $ は周波数領域の関数
- $ s $ は複素数（$ s = \sigma + j\omega $）

よってフーリエ変換に実部$ \sigma $を加えたものがラプラス変換です．
その代わり，範囲が$ [0, \infty) $となります．

:::note info
$e^\sigma$があると$\sigma$は[0, \infty)の範囲より，$\lim_{\sigma → 0}e^\sigma = 0$よりラプラス変換の値が収束する．

フーリエ変換の時は収束するかどうかが問題になるが，ラプラス変換は収束するため，フーリエ変換よりも広い範囲で使われる．

:::

## 2. ラプラス変換の基本性質

ラプラス変換にはいくつかの重要な性質があります．これらの性質を理解することで，信号処理の応用に役立ちます．

### 線形性
```math
 \mathcal{L}\{a f(t) + b g(t)\} = a F(s) + b G(s)
```

### 微分
```math
 \mathcal{L}\{f'(t)\} = sF(s) - f(0)
```

### 積分
```math
 \mathcal{L}\left\{ \int_0^t f(\tau) \, d\tau \right\} = \frac{F(s)}{s}
```

---

## 3. 信号処理への応用

### システムの解析
ラプラス変換はシステムの伝達関数 $ H(s) $ を求めるために使用されます．伝達関数はシステムの入力と出力の関係を表すもので，次のように定義されます：

```math
 H(s) = \frac{Y(s)}{X(s)}
```

ここで，
- $ Y(s) $ は出力のラプラス変換
- $ X(s) $ は入力のラプラス変換

### 安定性の評価
システムの安定性を評価するために，伝達関数 $ H(s) $ の極（ポール）を調べます．ポールがすべて左半平面にある場合，システムは安定です．

### インパルス応答とステップ応答
インパルス応答 $ h(t) $ は，システムの伝達関数 $ H(s) $ を逆ラプラス変換することで得られます．ステップ応答は，ステップ関数を入力としたときのシステムの応答で，インパルス応答を積分することで求められます．

---

## 4. 具体例

### 1次RC回路
1次RC回路の伝達関数を求める例を考えます．この回路の微分方程式は次のようになります：

```math
 \tau \frac{dV_{out}(t)}{dt} + V_{out}(t) = V_{in}(t)
```

ここで，$ \tau = RC $ です．この微分方程式のラプラス変換をとると：

```math
 \tau (s V_{out}(s) - V_{out}(0)) + V_{out}(s) = V_{in}(s)
```

初期条件 $ V_{out}(0) = 0 $ として解くと：

```math
 V_{out}(s) = \frac{V_{in}(s)}{\tau s + 1}
```

これにより，伝達関数は：

```math
 H(s) = \frac{1}{\tau s + 1}
```

---

## まとめ
ラプラス変換は信号処理において強力なツールであり，システムの挙動を周波数領域で解析するのに役立ちます．特に，システムの安定性の評価や応答解析において重要です．基本的な性質と応用を理解することで，複雑なシステムの解析がより容易になります．
【Docker】Seleniumでブラウザ操作ログの保存アプリ

## はじめに
Dockerについて学習したので､とりあえず動くものを作ってみましたメモ｡

Dockerを使用してPython環境を構築し、Seleniumでブラウザ操作を行い、Google検索結果のヒット数を取得し、MySQLにログを保存します。

Dockerが立ち上がったらSeleniumのヘッドレスモードでブラウザ操作を行うので､GUI操作はないです｡

↓このアプリのリポジトリ

https://github.com/kabikira/seliniumApp

## ディレクトリ構成
```
seliniumApp/
│
├── Docker/
│   ├── web/
│   │   ├── app.py
│   │   ├── Dockerfile
│   │   └── requirements.txt
│   └── init.sql
├── docker-compose.yml

```

## 実行手順
プロジェクトのルートディレクトリに移動
```sh
cd seliniumApp
```

Dockerコンテナをビルドして起動
```sh
docker-compose up --build
```
## 結果の確認
下記コマンドでコンテナIDを確認して
```
docker ps
```
MySQLに接続して、ログが正しく保存されているか確認します。
```
docker exec -it <db_container_id> mysql -u root -p
```
```sql
USE web_logs;
SELECT * FROM logs;
```
## healthcheckについて
このアプリを作成するにあたって一番詰まったところ｡
DBサーバーが完全に立ち上がる前に､Webサーバーが立ち上がって検索数をDBに保存しようとしてしまうので､DBにうまくアクセスできず以下のログがでていました｡
```
seliniumapp-web-1  | ブラウザを起動中...
seliniumapp-web-1  | データベースに接続中...
seliniumapp-web-1  | データベースエラー: 2003 (HY000): Can't connect to MySQL server on 'db:3306' (111)
seliniumapp-web-1  |     if cursor is not None:
seliniumapp-web-1  | NameError: name 'cursor' is not defined
```
DBサーバーが完全に立ち上がってからWebサーバーが立ち上がるようにhealthcheckの設定をおこないました｡

docker-compose.yml

```yaml
version: '3'

services:
  web:
    build:
      context: ./Docker
      dockerfile: ./web/Dockerfile
    volumes:
      - ./Docker/web:/app
    ports:
      - "8000:8000"
    environment:
      TZ: "Asia/Tokyo"
      DB_HOST: db
      DB_USER: root
      DB_PASS: mysql_pass
      DB_NAME: web_logs
    depends_on:
      db:
        condition: service_healthy
  db:
    image: mysql:5.7
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      MYSQL_ROOT_PASSWORD: mysql_pass
      MYSQL_DATABASE: web_logs
    ports:
      - "3307:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
```

### test
```
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
```
意味: コンテナの健康状態をチェックするために実行するコマンドを指定します。
mysqladmin ping -h localhost コマンドを実行し、MySQLサーバーにpingを送り、応答をチェックします。
### interval
```
interval: 10s
```
意味: ヘルスケアチェックを実行する間隔を指定します。
10秒ごとにヘルスケアチェックが実行されます。
### timeout
```
timeout: 5s
```
意味: ヘルスケアチェックのコマンドが実行される際のタイムアウト時間を指定します。
コマンドが5秒以内に完了しない場合、チェックは失敗と見なされます。
### retries
```
retries: 5
```
意味: コンテナの状態が不健康と見なされる前にヘルスケアチェックが連続して失敗する回数を指定します。

ヘルスケアチェックが連続して5回失敗した場合、コンテナはチェック失敗と見なされます。



```
    depends_on:
      db:
        condition: service_healthy

```
depends_on 設定で condition: service_healthy を使用することで、DBサーバーがヘルスケアチェックをパスした後にWebサーバーが起動するようにしています。これにより、WebサーバーがDBサーバーの起動を待ってから動作を開始するため、DBサーバーがまだ起動中であるために発生する接続エラーを防ぐことができました｡



## 参考

https://zenn.dev/sun_asterisk/articles/b4b17681d08018
生成AIでブラウザゲームを作ってみました。Claude3.5Sonnet使用

# はじめに
Claude3がすごいと聞いていたところ、Claude3.5をローンチしたと聞き、早速やってみました！

# 作ったブラウザゲーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155165/1a4f6877-5181-44b4-3ab7-0ff1aa82eeec.png)

手札から、同じマークか数字のカードを出せます。
なるべく多くのカードを出したら勝ちというものです。

https://d9nx570ssp66t.cloudfront.net/cardchain/poker-solitaire-game-html.html

こちらからアクセスできるようにしてあります。
（ドメインを買っていないです😢）

# 作り方
Claudeにユーザ登録をして、ブラウザで作成しました。Claudeのchatsで作成できます。
Googleアカウントで登録しました。
Future PreviewのArtifactsを有効にしました。

https://claude.ai/login

↑ここからClaudeに登録、ログイン


### 作成中画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155165/365a6c34-9143-5ae8-3699-57856d148ffc.png)

日本語で指示をしていきます。
まずルールを説明して、あとはひたすら指示をしていきました。24回の指示でここまで出来ました！

### 手順いくつか
```
「上に、出したカードを一覧にしてください。行にカードのマーク、列にカードの数字を表示します。同じマークか同じ数字は出せるようにしてください。」
「ラベルの列と、各マークごとの表示の列がずれないようにしてください。最初カードを出す前は、カードを出す場所を白紙のカードにしてください。」
「上の表で、置ける場所を薄い黄色い背景色にしてください。」
「手札の上にマウスカーソルがあるときは、上の表の対応するマスをハイライトしてください。マスの背景色を黄色にしてみてください。」
```
かなり適当ですね、、、

# 作成したもの
S3+CloudFrontに置いて、公開状態にしています。
html+js+cssを1枚のhtmlで作成しました。「html, js, cssで作ってください」と書いたらそうなったまでです。
（再掲）
https://d9nx570ssp66t.cloudfront.net/cardchain/poker-solitaire-game-html.html
ブラウザのデバッグツールからソースを見ることが出来ます。

# 感想
- **ClaudeブラウザのArtifactsがすごく便利！** 左側のチャットで指示をして、右側で動作を確認しながら作っていけます。
- 無料枠はすぐなくなりました。Pro登録しました。
- アウトプットがVersionで管理されています。右画面の左下に選択があります。 **指示がうまくいかなかったときに、「Version14に戻してください」と、ロールバック出来ました。**
- Pro枠でも制限があり、途中からあと何回使えるのかが出ていることに気づきました。「もう少し黄色を濃くして」とかで１ターン使っていたのはもったいなかった。
- 画面レイアウトは、頑張って言葉で伝えるのではなく、ラフなスケッチを描いてインプットしたほうが早かったです。
- このゲームは難しくてクリアできないので、少々ルールを変更しようと思います。
- **結局、伝える力、日本語力が大事だと思いました。**

# さいごに
これ、使いこなせば生産性が爆上がりしますね。もっと使いこなせるように精進していきます。
6/20のAWS Summit Japanの基調講演で、Anthropicの方の話も聞けました。同社のブースでデモ展示も見ることが出来て、興味が高まりました。ありがとうございます！
[AWS SUMMIT2024 セッションレポート]ソニーグループにおける生成 AI の社内活用と今後の展望

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

# 概要
> ソニーグループでは、生成 AI の Enterprise での活用が Global で始まっています。 生成 AI の民主化、企業内での活用、法令の異なる Global での活用、進化の早い生成AI関連技術に対するアプローチ、経済性と生産性のバランスの観点から、Amazon Bedrock を中心とした AWS の GenAI リソースを含むマルチクラウドでの多様な LLM の活用と RAG/Fine-tuning の戦略・アーキテクチャについて説明します。

# 所感
AI人材を育てるという、いろんな企業がこの課題に直面していると思います。
そんな中での、ソニーさんの取り組みということで、
まずは生成AIを使って慣れる、AIを民主化する、という取り組みはなるほどなと思いました。

それを自社用に作って使う、という点においても流石の一言。

同じことやりたいけど、開発リソースがない中では中々取り組めない。
なので、既存の生成AIを使いながら、どう上手くソニーさんと同じように、AI人材を育てる事を考えるか、
だと思いました。

他のセッションでも出てきた言葉で、「責任あるAI」をどう考えるか。
これも課題だなぁ。

# 聴講メモ
- 生成AI戦略
- AI民主化スタック
- エンタープライズLLM
    - チャット形式
    - 安心して業務で生成AIを活用できる体験と実践の場
    - 複数のクラウド、マルチLLM
    - 社内情報をセキュアに利用
    - データドリブンな活用分析
        - 入力されたプロンプトをAIが分析
    - テキスト生成、翻訳、画像生成
    - テキスト分析、コード補助、アイデア発案

## ビジネス適用を支えるアーキテクチャ
![PXL_20240620_030102724.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1458753/c0eb0f5c-b86d-e1e6-2ab4-fc006dc6b40d.jpeg)
Go: ヘッダーを考慮した csv ファイルの読み込み

こちらのプログラムを[リートン](https://wrtn.jp/)で変換しました。
[Python3: ヘッダーを考慮した csv ファイルの読み込み](https://qiita.com/ekzemplaro/items/aabc6e3b9ac71e242d06)

## プログラム

```go:csv_header.go
package main

import (
	"encoding/csv"
	"encoding/json"
	"fmt"
	"os"
)

func main() {
	if len(os.Args) < 3 {
		fmt.Println("Usage: go run csv_to_json.go <input_csv_file> <output_json_file>")
		return
	}

	inputCSVFile := os.Args[1]
	outputJSONFile := os.Args[2]

	// Open the CSV file
	csvFile, err := os.Open(inputCSVFile)
	if err != nil {
		fmt.Println("Error opening CSV file:", err)
		return
	}
	defer csvFile.Close()

	// Create a CSV reader
	csvReader := csv.NewReader(csvFile)
	header, err := csvReader.Read()
	if err != nil {
		fmt.Println("Error reading CSV header:", err)
		return
	}

	// Read CSV data into a slice of maps
	var records []map[string]string
	for {
		row, err := csvReader.Read()
		if err != nil {
			break
		}
		rowMap := make(map[string]string)
		for i, field := range row {
			rowMap[header[i]] = field
		}
		records = append(records, rowMap)
	}

	// Convert CSV data to JSON
	jsonData, err := json.Marshal(records)
	if err != nil {
		fmt.Println("Error converting to JSON:", err)
		return
	}

	// Write JSON data to output file
	err = os.WriteFile(outputJSONFile, jsonData, 0644)
	if err != nil {
		fmt.Println("Error writing JSON file:", err)
		return
	}

	fmt.Println("CSV to JSON conversion completed successfully.")
}
```

## 実行

```bash
go run csv_header.go cities_header.csv cities.json
go run csv_header.go cities_ex02.csv cities_ex02.json
```

## 確認したバージョン

```text
$ go version
go version go1.22.2 linux/amd64
```
Databricks生成AIクックブック - 4. RAGの品質の評価

[4\. Evaluating RAG quality — Databricks Generative AI Cookbook](https://ai-cookbook.io/nbs/4-evaluation.html) [2024/6/23時点]の翻訳です。

:::note warn
本書は著者が手動で翻訳したものであり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

> [Databricks生成AIクックブック](https://qiita.com/taka_yayoi/items/36c51bce8f33a70cf204)のコンテンツです。


# 4. RAGの品質の評価

古い諺"計測できないことは管理できない"は、RAGを含む全ての生成AIアプリケーションの文脈においても信じられないくらい当てはまります。あなたの生成AIアプリケーションが高品質で正確なレスポンスを提供するためには、あなたのユースケースにおいて"品質"が何であるのかを定義し、計測できるように**ならなくてはいけません**。

このセクションでは、評価における3つの重要なコンポーネントにディープダイブします:

[4\.1\. "品質"の定義: 評価セット](https://qiita.com/taka_yayoi/items/8f4c2777a1151e1d7b6a)
[4\.2\. パフォーマンスの評価: メトリクスが重要です](https://qiita.com/taka_yayoi/items/05f650df667ffca3e92d)
[4\.3\. 計測の実現: サポートするインフラストラクチャ](https://qiita.com/taka_yayoi/items/e8c2b711a2ebe5bd1d1d)

<br>

- [目次](https://qiita.com/taka_yayoi/items/36c51bce8f33a70cf204#%E7%9B%AE%E6%AC%A1)
- 前のセクション: [3.2. 収集、拡張、生成(RAGチェーン)](https://qiita.com/taka_yayoi/items/7097a738ea8e014d86f2)
- 次のセクション: [4\.1\. "品質"の定義: 評価セット](https://qiita.com/taka_yayoi/items/8f4c2777a1151e1d7b6a)

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
open liberty事始め②

https://qiita.com/XYZXYZXYZ/items/43a4d1df54619aa1282e

## アプリの配置から

## index.jspファイルを配置する

こんな便利な方法があるなんてびっくり

https://qiita.com/TTakakiyo/items/bb122f513a1bdf618adc


### 実際にやってみます

```
[root@docker163 server1]# cd /opt/wlp/usr/servers/server1/dropins/
[root@docker163 dropins]# ll
合計 0
[root@docker163 dropins]# mkdir test.war
[root@docker163 dropins]#
[root@docker163 dropins]#
```

### dropins

この場所へのデプロイは推奨されないみたいです。
きちんとserver.xmlに記載した場所にデプロイする方法がよいそうです。

https://www.ibm.com/docs/ja/was-liberty/base?topic=deploying-applications-in-liberty

### ディレクトリを作成するとログに出力される。。スゲー

```
[AUDIT   ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://docker163:9080/test/
[AUDIT   ] CWWKZ0001I: アプリケーション test が 1.483 秒で開始しました。
```

### 以下のサイトにあるindex.jspをコピーします。

https://qiita.com/Kazunori-Kimura/items/a15a011485ac92074d6f

### ファイルを配置します 

```
[root@docker163 ~]# cp -pi index.jsp /opt/wlp/usr/servers/server1/dropins/test.war/
[root@docker163 ~]# ll /opt/wlp/usr/servers/server1/dropins/test.war/
合計 4
-rw-r--r-- 1 root root 368  6月 23 17:47 index.jsp
[root@docker163 ~]#
[root@docker163 ~]#
```

### アプリケーションが問題なく表示できました。

### 次回はsnoopアプリケーションデプロイから
【Flutter】ドラえもんシリーズ第１弾！　ドラえもんの世界で見るコンストラクタとインスタンス

# 目次

* はじめに
* インスタンス
* コンストラクタ
* コード説明
* 最後に

# はじめに
こんにちは！
今日は、私が最近学んでいるFlutterのインスタンス、コンストラクタについてドラえもんを用いて理解を深めていきたいと思います！

# インスタンス

【例え】 
ドラえもんはタイムマシンを使って過去や未来に行くことができます。想像してみてください、ドラえもんがある日、自分と同じ姿・能力を持つ「コピー・ドラえもん」を作りました。この「コピー・ドラえもん」一体一体がそれぞれインスタンスです。
【ポイント】
各「コピー・ドラえもん」はドラえもん（クラス）から作られた具体的な存在であり、それぞれ独立して動くことができます。

# コンストラクタ
【例え】 
ドラえもんが「コピー・ドラえもん」を作るとき、未来の工場で設計図（クラス）に基づいて作ります。この工場が「コンストラクタ」です。
【ポイント】 
コンストラクタは「コピー・ドラえもん」を作るために必要な手順を定義しています。具体的には、どのような道具（属性）を持たせるか、どのようなプログラム（メソッド）をインストールするかを決めています。


# コード
【ドラえもんを例にした、クラス、コンストラクタ、インスタンスを表すDartコード】

``` dart
// ドラえもんのクラスを定義
class Doraemon {
  // 属性を定義
  String name;
  int productionYear;

  // コンストラクタを定義
  Doraemon(this.name, this.productionYear);

  // メソッドを定義
  void sayHello() {
    print('こんにちは、私は${name}です。生産年は${productionYear}年です。');
  }
}

void main() {
  // インスタンスを作成
  Doraemon doraemon1 = Doraemon('ドラえもん1', 2112);
  Doraemon doraemon2 = Doraemon('ドラえもん2', 2114);

  // メソッドを呼び出し
  doraemon1.sayHello(); // 出力: こんにちは、私はドラえもん1です。生産年は2112年です。
  doraemon2.sayHello(); // 出力: こんにちは、私はドラえもん2です。生産年は2114年です。
}
```
【コードの説明】
1. Doraemonクラスを定義
nameとproductionYearという2つの属性を持っています
Doraemonというコンストラクタを定義し、インスタンスを作成するときにこれらの属性を初期化します

2. sayHelloメソッドを定義
sayHelloメソッドはドラえもんの名前と生産年を出力します

3. main関数でインスタンスを作成:
Doraemonクラスのインスタンスであるdoraemon1とdoraemon2を作成します
それぞれのインスタンスでsayHelloメソッドを呼び出して出力します



簡単にまとめると、
インスタンスは具体的な「コピー・ドラえもん」（ドラえもんの複製）で、
コンストラクタはその「コピー・ドラえもん」を作成する工場や手順（未来の工場での製造プロセス）です。

# 最後に
いかがでしたか？
インスタンスとコンストラクタを理解し活用できるようになれば、コードの再利用が可能になり、効率的にコードを書くことができるようになります。また、読む側の可読性の向上も見込め、修正作業もしやすくなります。
一緒に理解を深めて書きやすく読みやすい人に好かれるコードを追求していきましょう！
Ruby: ヘッダーを考慮した csv ファイルの読み込み

こちらのプログラムを[リートン](wrtn.jp)で変換しました。
[Python3: ヘッダーを考慮した csv ファイルの読み込み](https://qiita.com/ekzemplaro/items/aabc6e3b9ac71e242d06)

## プログラム

```rb:csv_header.rb
#! /usr/bin/ruby
#
#	csv_header.rb
#
#						 Jun/23/2024
# ------------------------------------------------------------------
require 'csv'
require 'json'
require 'fileutils'

# ------------------------------------------------------------------
def file_write_proc(file_name, str_out)
	File.write(file_name, str_out)
end

# ------------------------------------------------------------------
file_csv = ARGV[0]
file_json = ARGV[1]

rows = CSV.parse(File.read(file_csv), headers: true).map(&:to_h)
out_str = JSON.dump(rows)
file_write_proc(file_json, out_str)

# ------------------------------------------------------------------
```

## 実行

```bash
./csv_header.rb cities_header.csv cities.json
./csv_header.rb cities_ex02.csv cities_ex02.json
```

## 確認したバージョン

```text
$ ruby --version
ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux-gnu]
```
CloudFrontでのBasic認証とCognito認証

## はじめに

本記事では、CloudFrontでユーザ認証を実装する際のBasic認証とCognito認証の比較について、それぞれの特徴、メリット・デメリットを説明します。

## Basic認証
◆特徴
・HTTPプロトコルに組み込まれた単純な認証方式
・ユーザー名とパスワードをBase64エンコードして送信

◆メリット
・実装が容易
・ほとんどのブラウザでサポートされている
・追加のインフラストラクチャが不要
・低コスト

◆デメリット
・暗号化されていない平文で送信されるため、セキュリティレベルが低い
・パスワード管理が煩雑
・パスワードリセット、多要素認証などの高度な認証機能がない
・スケーラビリティに制限がある

## Cognito認証

◆特徴
・AWSのマネージドサービスで、ユーザ管理や認証フローを提供
・OAuth、OpenID Connectなどの標準プロトコルをサポート
・Google、FacebookなどのソーシャルIDプロバイダーとの連携が可能

◆メリット
・多要素認証、適応型認証などの高度なセキュリティ機能
・スケーラビリティが高く、大規模なユーザベースに対応可能
・AWSの他のサービスとの統合が容易
・カスタマイズ可能なUI

◆デメリット
・設定や実装が複雑
・ユーザ数やリクエスト数に応じて課金されるため、コストが比較的高い

## 比較

|                        | Basic認証 | Cognito |
|------------------------|----------------------|-----------------------|
| セキュリティ | △ | ◎ |
| スケーラビリティ | △ | ○ |
|実装の容易さ | ◎ | △ |
|コスト | ◎ | △ |
|機能性 | △ | ◎ |
|AWSサービスとの統合 | △ | ○ |

①**セキュリティ**
Basic認証は平文でパスワードを送信するため、セキュリティリスクが高くなります。。
Cognitoは多要素認証や適応型認証などの高度なセキュリティ機能を提供し、OAuth/OpenID Connectなどの標準的なセキュリティプロトコルをサポートしています。

②**スケーラビリティ**
Basic認証は単純な仕組みのため、大規模なユーザ管理には向いていません。
Cognitoは大規模なユーザベースに対応できる設計になっています。

③**実装の容易さ**
Basic認証は非常にシンプルで実装が容易です。
Cognitoは機能が豊富な分、設定や実装が複雑になる傾向があります。

④**コスト**
Basic認証は追加コストがほとんどかかりません。
Cognitoはユーザ数やリクエスト数に応じて課金されるため、コストが高くなる可能性があります。

⑤**機能性**
Basic認証は単純なユーザ名/パスワード認証のみです。
Cognitoは豊富な機能（ソーシャルログイン、パスワードリセット、多要素認証など）を提供します。

⑥**AWSサービスとの統合**
Basic認証はAWS固有の機能との統合が限定的です。
CognitoはAWSの他のサービスとシームレスに連携できます。

## まとめ
簡単な保護が必要で、コストを抑えたい小規模なプロジェクトの場合はBasic認証が適しています。
一方、セキュリティとスケーラビリティが重要な場合や高度な認証機能が必要な場合はCognitoが適しています。

ただし、最終的な選択はプロジェクトの要件、規模、予算、セキュリティニーズに基づいて行うべきです。

## 参考
https://qiita.com/Haruki-N/items/82ff2ade2bb433df6a5e

https://qiita.com/Haruki-N/items/bfd75bc0d5d09f9f95ba
デザイン基礎(2)

# 1.概要
[デザイン基礎(1)](https://qiita.com/saburo555/items/e2f659376c3691cf67c8)に引き続き、Udemyを視聴して学んだことを書いていきます。

視聴Udemyは以下です。
[【グラフィックデザインの教科書】デザインの基本と知識を学ぶ、デザイナー1年生のための初心者講座](https://www.udemy.com/course/g-design/?couponCode=KEEPLEARNING)

# 2.写真と画像の基礎知識
## 2.1.ビットマップ画像
色付きの微小な正方形の集合体です。
この正方形は「ピクセル」と呼ばれ、ビットマップ画像を構成する。

ビットマップ画像とは、ピクセルで構成された画像のこと。
表示の細かさ（単位：ppi）を解像度という。
ppi：pixcel per inch 1センチあたりに並んでいるピクセルの数。
→解像度が高いと画像が滑らかになる！
![スクリーンショット 2024-06-23 17.20.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889120/afc39e4d-1133-4ac0-c1f3-64a8ea752311.png)
出典：[解像度](https://www.well-corp.jp/solution/kaizoudo/)

:::note info
印刷で必要なのは350ppi以上！
:::


## 2.2.ベクター画像
イラストやロゴは、ベクター画像が多い。
解像度の概念がなく、拡大しても変わらない！

画像のカラーモードの設定が必要。
RGB：モニターに表示させるために使うもの。WEBや映像の現場。
CMYK：印刷に使われるもの。
グレースケール：無彩色（白、グレー、黒）で、写真をモノクロにしたい時のもの。
モノクロ2階調：1色印刷。黒い線明けのイラストに使う。

# まとめ
次回が文字と書体についてのセクションで一旦キリがいいので、書き終えます。
「写真」のセクションは、Webサイトデザインには不可欠ですが、一旦システム開発での活かしたいと思ったので、さらっとUdemyを流し見しました。
もし気になった方は、最初にもご紹介しました「[【グラフィックデザインの教科書】デザインの基本と知識を学ぶ、デザイナー1年生のための初心者講座](https://www.udemy.com/course/g-design/?couponCode=KEEPLEARNING)」をご購入ください。
自走式VWを作りたい（1日目）：ロボットの質量上限の見積

# これまでの経緯
前回投稿の記事を参照ください↓

https://qiita.com/ogabk/items/770cd0cd9b43cbf6b0b0

# 最初に何から検討すべきか
ロボット本体のサイズと重量の目標をまず決めようと思いました。

各部品をどのくらいのスペースに収めて、かつ、ロボット全体でどのくらいの重さに抑える必要があるのか。これがスタート地点な気がしたからです。

最もスペースを食う部品は、タイヤやホイールです。また、最大重量を考えておかないと、最悪モータのトルク不足でロボットが動かない事態に陥ってしまいます。

手持ちのモータ（1717T006SR）を流用しようと決めていたので、まずはそのモータの最大トルクなどの仕様からロボットの質量上限を見積もってみることにしました。

# 検討方法
幸い？にもGPT-4oに対応したCursorエディタさんが手元にあるので、このエディタのプロンプトにモータの仕様表を貼り付けて、4oさんに見積もってもらう方式を試してみました。

以下のようなイメージです↓
![モータの仕様表を4oに入力しトルク見積に使用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781638/e9c2e67c-a6a7-d944-937b-0b4eab27b152.png)

![モータの仕様表を4oに入力しトルク見積に使用2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781638/dc4f870e-278a-7748-fc99-51859c36e80a.png)

質量が質力になっていますね…（苦笑
でもこのくらいの誤字なら、4oさんが空気読んで解釈してくれます（爆

# 検討結果
最終的には最大トルクをストールトルクの半分以下の2mNm、加速度を仮で最大1G、ギア比を10:36、タイヤ直径を25mm（昔作ったロボットの設計値を流用）と仮定して見積もってもらいました。

以下のような見積結果がプロンプト上に出力されました。見積結果をプロンプト右上のApplyボタンでmdファイルに適用したところ、自動でmarkdown形式で出力されました。便利。

>ロボットの質量を見積もるためには、モータのトルク、ギア比、タイヤの半径、そして必要な加速度を考慮する必要があります。以下の手順で計算を行います。
>
>### 1. ギア比の計算
>ギア比は、駆動ギアの歯数を従動ギアの歯数で割ることで求められます。
>```math
>\text{ギア比} = \frac{\text{従動ギアの歯数}}{\text{駆動ギアの歯数}} = \frac{36}{10} = 3.6
>```
>### 2. 出力トルクの計算
>モータの最大出力トルクをギア比で増幅します。
>```math
>\text{出力トルク} = \text{モータの最大出力トルク} \times \text{ギア比} = 2 \, \text{mNm} \times 3.6 = 7.2 \, \text{mNm}
>```
>### 3. タイヤの半径の仮定
>タイヤの半径は12.5 mm（0.0125 m）です。
>
>### 4. タイヤの出力力の計算
>タイヤの出力力は、出力トルクをタイヤの半径で割ることで求められます。
>```math
>\text{出力力} = \frac{\text{出力トルク}}{\text{タイヤの半径}} = \frac{7.2 \, >\text{mNm}}{0.0125 \, \text{m}} = 576 \, \text{mN} = 0.576 \, \text{N}
>```
>### 5. ロボットの質量の計算
>ロボットの質量を求めるためには、最大加速度を考慮します。最大加速度は1G = 9.81 m/s²です。
>```math
>\text{質量} = \frac{\text{出力力}}{\text{加速度}} = \frac{0.576 \, \text{N}}{9.81 \, \text{m/s}^2} = 0.0587 \, \text{kg}
>```
>したがって、ロボットの質量は約0.0587 kg以下に設計する必要があります。

# まとめ
考えてみれば当たり前っちゃ当たり前なのですが、現状のホイール径とギア比ではまともに動くロボットにはならなそうです。全体で59gとか、このモータ2個で既に18*2=36g使っているのでどう頑張っても実現不可能ですね。。。

ホイール径を大きくしかつギア比を上げて、ロボットの移動速度をある程度犠牲にしてトルクを稼ぐ必要性が見えてきました。ルンバの移動先に先回り可能な範囲で、移動速度と加速度をどこまで下げられるかを見積もる必要がありそうですね。

早くも壁にぶちあたりましたが、このような初期検討にもAIが活用できることが分かって便利だな～と思いました。今回はCursorエディタを使いましたが、プロンプトで指示すればmarkdown形式にもすぐできますし、Qiita記事作成との相性もよさそうです。

最後まで読んで下さりありがとうございました。
Wordpress.comのアプリケーションパスワードは2段階認証をONにしないと使えないよ

:::note warn
【注意書き】
皆さんがよく知っているWordpressはサーバを自分で用意するタイプのWordpress「`Wordpress.org`」であり、自分が今回話す`Wordpress.com`はまた別のサービスです。
:::

`Wordpress.org` のアプリケーションパスワード（WordpressのREST APIを使うために必要な認証パスワード）は、ユーザ一覧からすぐ作成することができます。
しかし、`Wordpress.com` のアプリケーションパスワードは、作成したばかりの状態では設定できません。
設定しなくても、ログインパスワードを使ってREST APIの認証をすることもできますが、セキュリティ的によろしくないです。
ということで、アプリケーションパスワードの設定方法を紹介します。
# 手順　
## 右上のユーザアイコンをクリック
![スクリーンショット 2024-06-23 17.07.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/0bd914a7-7cab-ad5b-175f-80149cc95913.png)

## セキュリティタブをクリックして、2段階認証をクリック
![スクリーンショット 2024-06-23 17.11.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/4e0a99a5-dee7-7aa6-0b50-7098b7e458dc.png)

## 認証アプリかSMSのどちらかで認証するようにする
![スクリーンショット 2024-06-23 17.13.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/dab2679e-b524-f6a6-bb56-43edbd53b1b5.png)

## 以下のように表示されたら2段階認証の設定できている
![スクリーンショット 2024-06-23 17.16.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/81c68eeb-28e5-6ec5-0891-9abc04b8ced8.png)

## セキュリティタブの一番下のページに行くとアプリケーションパスワードの項目があるので「追加する」をクリック
ここが本当にどこにあるかわからなかった。

![スクリーンショット 2024-06-23 17.24.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/77162450-4109-9c63-67bb-9cf51921b456.png)

「app password」という名前で登録してみると、４桁の英数字とスペースが続く以下のようなパスワードが表示される。これがアプリケーションパスワードです。

![スクリーンショット 2024-06-23 17.26.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/ea82973b-d2f1-d03e-c722-877bb7c0696a.png)

以上でアプリケーションパスワードが使えます。
Raspberry Piでlibcameraとpicamera2を仮想環境でセットアップする

picamera2のインストールがうまく行かなっかたけど、環境変数設定してやるとうまく行きました。

## 前提条件
Raspberry Pi 4B
OS:Bookworm
Python 3.11

## 手順
### 1. 仮想環境の作成と有効化
まず、Pythonの仮想環境を作成、有効にする。
```python:mushi.py
bash
python3 -m venv /home/username/myproject/myenv
source /home/username/myproject/myenv/bin/activate
```

### 2. 必要な依存関係のインストール
libcamera のビルドに必要な依存関係をインストール。
```python:mushi.py
bash
sudo apt-get update
sudo apt-get install -y libboost-dev libgnutls28-dev openssl libtiff-dev pybind11-dev
sudo apt-get install -y qtbase5-dev libqt5core5a libqt5gui5 libqt5widgets5
sudo apt-get install -y meson cmake
sudo apt-get install -y python3-yaml python3-ply python3-jinja2
sudo apt-get install -y libglib2.0-dev libgstreamer-plugins-base1.0-dev
sudo apt-get install -y libdw-dev libunwind-dev libudev-dev
```


### 3. libcamera のソースコードをクローン
次に、libcamera のソースコードをクローン。
```python:mushi.py
bash
git clone https://git.libcamera.org/libcamera/libcamera.git
cd libcamera
```

### 4. libcamera のビルドとインストール
meson を使用してビルドディレクトリを設定し、ninja を使用してビルドおよびインストール。
```python:mushi.py
bash
meson setup build
ninja -C build
sudo ninja -C build install
```

### 5. 環境変数の設定
libcamera が正しくインストールされたことを確認するために、環境変数 LD_LIBRARY_PATH を設定。
```python:mushi.py
bash
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
```

### 6. picamera2 のインストール
仮想環境内で picamera2 をインストール。
```python:mushi.py
bash
pip install picamera2
```

### 7. Python スクリプトの実行
仮想環境内で Python スクリプトを実行します。以下のスクリプトを使って、カメラのプレビューを開始。
```python:mushi.py
python
from picamera2 import Picamera2, Preview

picam2 = Picamera2()
picam2.start_preview(Preview.QTGL)
picam2.start()
```

## まとめ
6.以降がうまくいかなかったけど、環境変数設定してやるとインストールできた。
めもでした。

## 追記
・GitHub Issue #218では、同様の問題が報告されており、libcameraのバージョンに依存することが確認されている。
　https://github.com/raspberrypi/picamera2/issues/218

・Arducamフォーラムでも、libcameraのバージョンを調整することで問題が解決された事例が報告されている。
　https://forum.arducam.com/t/importerror-cannot-import-name-controltype-from-libcamera-unknown-location/3414
[AWS SUMMIT2024 セッションレポート] DAY1 基調講演 AWS と創る次の時代

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

# 概要
>AWS はお客様視点および長期的視野に立ち、お客様のイノベーションに向けた包括的な支援を続けてきました。「生成 AI」は次の時代を創り出すキー・テクノロジーであり、すでに多くのお客様が AWS を活用し新たな価値を生み出しています。AWS はこれまでと変わりなく自社のイノベーションを加速し、お客様と共にイノベーターとして社会、地球環境をより良くし、次の時代を創り出します。

# 所感
初日の基調講演です。
AIやMLが登場し、AWSにもML向けのサービスが登場したのは最近の話ではなく、（いつか忘れたけど）結構前から既に存在していたと思います。

生成AI、chatGPTの登場で一気に流れが加速したように感じていて、
AIという言葉を至る所で見かけるようになりました。

自社内でもAIの利用は様々な角度から検討されていますが、
この基調講演を経て、AIが今、世界に与えている影響を改めて知ることが出来たと気がします。

端的に、正直にいうと、自分が思っていた以上に遥かに大きなスケールで、AIは社会に影響を与えていた。

作業の効率化や、高度な分析ももちろん素晴らしいことですが、
食や医療など、世界が、人間が抱える問題の解決のために、人類の未来のためにその活用を考え技術を発展させる、という大きなスケールの話は、とても興味深かったです。

まだまだとりあえずは足元や近くを見ながらエンジニアをやっていきますが、
思考する観点、視点として、もっと先もあるという事を知ることが出来たように思います。

# 聴講メモ

## AIの潮流

- **トップダウン**: 命令を処理する
- **ボトムアップ**: センサー（触覚）による判断
  - 物流ロボット

## 今、何ができるか

### AI for Food

#### ジャカルタのHARA
- 農家は社会的信用がなく、銀行に借りられない。
- AIを使って土地の情報を収集し、保証する。このデータが変え難いものになる。

#### IRRI
- 世界で最も多様な品種の米を研究
- 未処理の収穫物は貯蔵できる時間が短い
- 世界中から集まる多様な種を仕分けする必要がある
- カメラを使ってAIで判別し、自動で仕分ける
- 小さな農家におけるITリテラシーは低い。文字が読めないこともある。

#### YAMMAR
- 温室の管理
- カメラ、温度、湿度を通じて温室内の状態を管理し、最適化

#### Proteinについて
- 魚介の養殖：1kgの餌で1kgのタンパク、牛だと7kgの餌が必要

##### Aquabyte
- 魚の健康状態を管理
- 生簀の中の魚を1匹ごとに管理
- 10億以上の魚類を分析

### 医療

#### AI for Healthcare
- 発展途上国にどうやって医療を届けるか

#### Swoop Aero
- AIとドローン技術で感染症のインパクトを抑制
- 障害物の回避など自動化し、安全にワクチンを届ける

#### CEREGENV
- EEGデータをAIにより解釈し、異常をほぼ一瞬で検知
- 新生児の脳損傷の発見には時間がかり、数年後に見つかっていた
    - AIの力で早期発見が可能になった

**これらをAIで実現する上で、重要なのが「DATA」**

#### Open Street Map
- 地図のオープンソースプロジェクト

ビジネスにならない対象には、データが提供されていなかった

---

大量データを保存することはできるようになった反面、その中から必要なデータを見つけることが困難になった
→AI 、MLで解決

#### THORN
- 児童を人身売買から守る
- 行方不明者の画像データを学習し、ネット上から捜索する
- 6,000人以上の児童を含め18,000人以上が見つかる
- 児童ポルノの検知（画像や会話など）


## AWS アップデート

- 機能アップデート: 3,410
- サービス数: 240以上
- 値下げ: 130以上の項目で実施

### クラウドの基本要素

- 信頼性
- セキュリティ
- コストパフォーマンス
- 俊敏性
- 拡張性

#### docomo
- 5Gコアをクラウドとのハイブリッドにする試み

#### 関西電力
- クラウドインフラを利用し、電力データの管理

#### AEON
- イオンカード、ペイのデータ基盤
- セキュリティ強化を目的

### クラウドと生成AI

- データ量、入力数の増加にクラウドのスケーラビリティが貢献

#### Anthropic
- どのようにして責任を果たしながら生成AIモデルの変革を行うか
- AIに安全性を

- AIが自らの能力を超えないようにするフレームワーク
- 安全性と倫理性を重視するAI専門家

##### Clade3
- ユーザーのデータは使わない

変革的な未来に向けて今始める。進化を待っている企業はすでに遅れている。

### AWSが考えるユーザーのレイヤー

1. **LLMと基盤モデルの学習のためのインフラ**
   - コスト、リソースを最適化したチップ

2. **LLMアプリケーションを開発するためのインフラ**
   - Bedrock
   - 様々なモデル

3. **活用するアプリケーション**

### SONY

- カメラのAF
- ゲームのAIエージェント
- ID、決済の不正検知

社内の多様な組織、機能において生成AIを活用
- ガイドライン
- 悪用防止
- 倫理
- これらを取り決めて安全に運用できるようにする必要がある

社員向けに社内専用の生成AIを提供し、体験を通じて民主化を図る
1万8000人以上が利用

全社員が使い、理解し、体験し、学ぶ

### 生成AI搭載型アプリケーション

企業内のデータ
- データレイク
- データベース
- データ統合
- ガバナンス

アプリケーション開発のステップ
- ユースケース
- モデル選択
- 責任あるAI
- カスタマイズ
- アプリ統合

### Amazon Q 日本語が提供開始

- 31の基盤モデル
- 75回のアップデート
- 28の生成AIアプリケーション

### Project Kuiper

- 衛星通信: 世界どこでもネットワークを提供
- 地上と宇宙からプライベートリンクをユーザーに

### Ispace

- 月にある水資源を燃料に


# 関連
- [AWS SUMMIT2024 参加レポート](https://qiita.com/yukiMiyoshi_fcafe/items/220bf886aa94ea552d3e)
VS CodeでjQueryの導入方法（HTML,CSS,jQuery）

今回静的ページを作成する際にHTML,CSS(SCSS),jQueryの環境を作る必要があったため、その時の構築の手順をまとめます。

## 静的ページとは
静的ページとは、HTML、CSS、JavaScript（例：jQuery）で構成され、サーバーサイドの処理を必要としないウェブページのことを指します。

逆に動的ページとは文章や画像がアクセスする毎に変わり、ユーザーに適したHTMLファイルが都度サーバ側で作られるWEBページのことを「動的ページ」と呼びます。

## 構築環境
・VS Code
・MacBook

## 手順
#### １.　Node.jsのダウンロード
まず、公式サイトから必要なバージョンのNode.jsをダウンロードします。
https://nodejs.org/en


#### ２.　npmコマンドでjQueryをインストール
```
npm install jquery
```
インストールが完了したら下記のコマンドでインストールができたか確認
```
node -v
```

#### ３.　プロジェクトの初期化

次に下記のコマンドを打ってプロジェクトの初期化を行います。
```
npm init -y
```
このコマンドは、Node.jsプロジェクトをすぐに初期化して、プロジェクトの設定ファイル（package.json）を自動的に作成します。　噛み砕いて説明するとプロジェクトの基本情報を自動的に設定してくれます。

設定した場合には、下記のような内容がpackage.jsonに記述されます。
```
{
  "name": "my-project",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
```

しかし設定をしなくても、機能はしますが、package.json にスクリプトを設定することで、scripts セクションを簡単に追加して npm run コマンドで実行できるスクリプトを設定することができます。


#### ４.　パスをheadタグに設定

実際にjsファイルを作成し、そのファイルに対してパスをheadタグに設定してあげることでjsがjQueryが機能するようになります。
```
<script src="js/jquery.min.js"></script>
```
Bun: ヘッダーを考慮した csv ファイルの読み込み

こちらのプログラムを bun で実行させました。
[TypeScript: ヘッダーを考慮した csv ファイルの読み込み](https://qiita.com/ekzemplaro/items/e5e22a8428c4cb873ee6)

ライブラリーのインストールは、Bun が行います。

## プログラム

```ts:csv_header.ts

import * as fs from 'fs';
import * as csv from 'csv-parse/sync';

function fileWriteProc(fileName: string, strOut: string): void {
  fs.writeFileSync(fileName, strOut);
}

const [, , fileCsv, fileJson] = process.argv;

const csvData = fs.readFileSync(fileCsv, 'utf8');
const rows = csv.parse(csvData, { columns: true, skip_empty_lines: true });
const outStr = JSON.stringify(rows);

fileWriteProc(fileJson, outStr);
```

## 実行

実行前のファイル

```text
$ tree
.
├── cities_ex02.csv
├── cities_header.csv
└── csv_header.ts
```

実行

```bash
bun run ./csv_header.ts cities_header.csv cities.json
bun run ./csv_header.ts cities_ex02.csv cities_ex02.json
```

実行後のファイル

```text
$ tree
.
├── cities.json
├── cities_ex02.csv
├── cities_ex02.json
├── cities_header.csv
└── csv_header.ts
```

## 確認したバージョン

```text
$ bun --version
1.1.15
```
HelmでMinioがアップグレードできなくなった

# はじめに

しばらく前からMinioをHelmから導入していますが、このChartは公式のガイドからはなくなっているようです。

```bash:
$ sudo helm repo list
NAME                            URL
minio                           https://charts.min.io/     
```

公式ガイドではOperatorが推されているようです。

どこかでOperatorに移行しないとなのかもしれませんが、とりあえず最新版にアップグレードしようと思います。

しかし作業を進めると``helm upgrade``がうまく動作しなくなってしまいました。最終的には下記のように成功していますが、しばらくはどうしてか良く分からずhelmのREVISION番号が増えていくままでした。

```text:sudo helm -n minio history staging-minioの出力抜粋
2               Wed Jul 12 05:07:08 2023        superseded      minio-5.0.13    RELEASE.2023-07-07T07-13-57Z Upgrade complete
3               Fri Jun 21 05:12:41 2024        failed          minio-5.2.0     RELEASE.2024-04-18T19-09-19Z Upgrade "staging-minio" failed: cannot patch "staging-minio" with kind StatefulSet: StatefulSet.apps "staging-minio" is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'ordinals', 'template', 'updateStrategy', 'persistentVolumeClaimRetentionPolicy' and 'minReadySeconds' are forbidden
...
9               Fri Jun 21 07:12:48 2024        deployed        minio-5.2.0     RELEASE.2024-04-18T19-09-19Z Upgrade complete   
```

# 原因

メッセージにあるとおりStatefulSetを利用している場合に、以下のフィールド以外の値が更新されているためエラーが発生しました。

* 'replicas'
* 'ordinals'
* 'template'
* 'updateStrategy'
* 'persistentVolumeClaimRetentionPolicy'
* 'minReadySeconds'

問題はどこが変更されているのか良く分からない点でした。

幸いgitでvalues.yamlファイルを管理していたので履歴を辿っていくと、手動でMinioのPVを拡張した時にvalues.yamlにも同様の変更を反映していました。

```diff:
@@ -159,7 +162,7 @@ persistence:
   storageClass: "rook-ceph-block"
   volumeName: ""
   accessMode: ReadWriteOnce
-  size: 1024Gi
+  size: 10Gi
 
   ## If subPath is set mount a sub folder of a volume instead of the root of the volume.
   ## This is especially handy for volume plugins that don't natively support sub mounting (like glusterfs).
```

今回の問題自体はvalues.yamlの内容を管理していれば比較的簡単に解決できますが、helmは様々な利用例があるので場合によってはエラー時の原因追求が少し難しいかもしれません。

## 今回感じた問題点

例えば``helm get values``を利用しても得られたものはエラーが発生したvalues.yamlの内容を反映したものでした。

helmの利用に慣れていれば説明なしに使いこなせるのかもしれませんが、戸惑った点です。

本来は``--revision``を指定して``deployed``ステータスの値を取り出すべきでしたが、Minio公式ガイドをみてもそこまでの記述はありませんでした。

[本来のアップグレード手順](https://artifacthub.io/packages/helm/minio-official/minio)は、次のようなものでした。

```bash:本来のminioのアップグレード手順
$ helm get values my-release > old_values.yaml
## Then change the field image.tag in old_values.yaml file with MinIO image tag you want to use. Now update the chart using
$ helm upgrade -f old_values.yaml my-release minio/minio
```

次のような手順であれば問題なくアップグレードできたのだと思います。

```bash:
$ sudo helm get values -n minio staging-minio --revision 2 > old_values.yaml
## Change the image: values for new minio charts
$ sudo helm upgrade -f old_values.yaml -n minio staging-minio minio/minio
```

将来的にminio内部の構造が変更されない限りはこの構成で問題ないとは思いますが、良くテストされているOperatorが使えるのであればそちらに移行するべきかもしれません。

以上
【gcloud】あっという間に gcloud コマンドを使えるようにする方法

業務中に Google Cloud Functions のデプロイをやらなアカンとなって導入した。
詰まりポイントとかぶっちゃけないけど、備忘録的に記事にしておく（決して投稿数稼ぎではない

尚、Mac での作業を前提としています。

## 以下、手順

公式ドキュメントに沿って進める。

https://cloud.google.com/sdk/docs/install?hl=ja


まず、Python を使用していることを確認します。

```
MAC ~ % python3 -V
Python 3.11.6
```

:::note info
サポートされているバージョンは Python 3.8～3.12 です。
:::

Cloud クライアントライブラリ をダウンロードします。
マシンのハードウェア名を以下コマンドで確認の上、適切なものを選択し、ダウンロードしてください。

```
MAC ~ % uname -m 
x86_64
```

自分の場合はこれをダウンロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531606/d33a1d1e-f1fb-c85b-5d79-71908fcdc4d4.png)

落としてきたら、システム上の任意の場所に展開します。

あとはインストールスクリプトを実行するだけ。

```
./google-cloud-sdk/install.sh
```
いくつか問いがあるのですが、
`Modify profile to update your $PATH and enable shell command completion?`
という感じで、PATH を更新するか聞かれるので、こだわりなければ、Yes しておきましょう。

これも必要に応じてですが、初期設定などしておいてもいいかもです。
```
gcloud init
```

`--help`オプションなど実行してみて、`gcloud`コマンドが生えているか確認しましょう。
```
gcloud --help
```

お疲れ様でした。
Dify公式ガイドのご紹介

## はじめに
こんにちは、みなさん！

今回は、Difyの公式サイトにあるガイドを紹介したいと思います。Difyを活用するにあたって、公式のドキュメントを参考にすることは非常に有益です。以前に私が投稿した記事でもDifyについて触れましたが、今回はその公式ガイドについて詳しく紹介します。いままで、その存在を知りませんでした。

https://qiita.com/Tadataka_Takahashi/items/ba832511bd4fd5cd46f1

## Dify公式ドキュメントのトップページ

まず、Difyの公式ドキュメントのトップページはこちらです。

https://docs.dify.ai/v/japanese

このページには、Difyの基本的な使い方や設定方法、様々なガイドが揃っています。初めてDifyを使う方や、さらに深く理解したい方にとって、非常に役立つ情報が満載です。

## Ollamaに関する設定ガイド

特に注目したいのは、Ollamaに関する設定ガイドです。
[Ollamaに関する設定ガイド](https://docs.dify.ai/v/japanese/guides/model-configuration/ollama)

このガイドでは、Ollamaモデルの設定方法について詳しく解説されています。具体的には、モデルの選択、設定オプション、トラブルシューティングなど、Ollamaを最大限に活用するための情報が詰まっています。

## まとめ

公式ガイドを利用することで、Difyの利用がよりスムーズに、そして効果的になります。興味のある方は、ぜひ公式ドキュメントをチェックしてみてください。
CloudFrontでのCognito認証

## はじめに
本記事では、Amazon CloudFrontとAmazon Cognitoを使用した認証について説明します。

## Lambda@Edge

CloudFrontでCognito認証を実装する場合、Lambda@Edgeを利用します。
Lambda@Edgeは、CloudFrontのコンテンツ配信ネットワークと統合されており、エッジロケーションでサーバーレス関数を実行できるサービスです。
これにより、低レイテンシで応答を提供し、動的コンテンツの生成やキャッシュのカスタマイズ、セキュリティヘッダーの追加などを実現します。

※**Lambda@Edge関数は、us-east-1リージョンで作成する必要があります。**

◆料金
・100 万件の呼び出しあたり 0.60USD (1 回の呼び出しごとに 0.0000006 USD)
・GB - 秒ごとに 0.00005001 USD

https://aws.amazon.com/jp/cloudfront/pricing/?nc1=h_ls

## Amazon Cognito

Amazon Cognitoは、ユーザー認証、認可、およびユーザーデータの管理を行うためのサービスです。
これにより、ウェブおよびモバイルアプリケーションのユーザーを簡単にサインアップ、サインイン、およびアクセス制御できるようになります。

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/what-is-amazon-cognito.html

## まとめ
CloudFrontとCognitoを組み合わせることで強力な認証システムを実装できます。
ユーザー管理やソーシャルログインなどの高度な機能も利用可能になります。

## 参考
https://qiita.com/Haruki-N/items/82ff2ade2bb433df6a5e
Python PEP8 ~その参 コメント~

# これまで
[Python PEP8 ~その壱 import~](https://qiita.com/i-am-misaki/items/5eccdb9498110ba9c62a)
[Python PEP8 ~その弐 無駄な空白は削除~](https://qiita.com/i-am-misaki/items/6d80464f4af460e9f2ee)


https://peps.python.org/pep-0008/



# 意識すべき点
その１
>コードと矛盾するコメントは、コメントしないことよりタチが悪いです。


その２
>コメントを書くときは、あなたが今書いている言葉の他の話者から見ても、明快かつわかりやすいコメントにしましょう。

その３

:::note warn
コードを変更した時は、コメントを最新にすることをいつも優先させてください！
:::

コード変更後、コメント変更するのいつも忘れがち...気を付けよ。

# ブロックコメント
>ブロックコメントは、一般的にその後に続くいくつか（またはすべて）のコードに適用され、そのコードと同じレベルにインデントされます。

>ブロックコメントの各行は (コメント内でインデントされたテキストでない限り) # とスペースひとつではじまります。
###### スペース忘れずに。
```python
num_list = [1, 2, 3, 4, 5]


for num in num_list:
    # 2で割り切れるならeven_listに追加
    if num % 2 == 0:
        even_list.append(num)
    else:
        odd_list.append(num)
```

# インラインコメント
>インラインコメントは控えめに使いましょう。

>インラインコメントは、文と同じ行に書くコメントです。文とインラインコメントの間は、少なくとも二つのスペースを置くべきです。インラインコメントは # とスペースひとつから始めるべきです。
###### スペース忘れずに。
```python
a = 5  # 5をaに代入
```

# ドキュメンテーション文字列(別名 "docstrings")
###### docstringとは
>モジュール、関数、クラス、またはメソッド定義の最初のステートメントとして出現する文字列リテラル

>通常、すべてのモジュールには docstring が必要

```python
import pandas as pd

"""csvからデータを読み取る"""
def read_data():
    data = pd.read_csv('data.csv')
```
###### docstringに関しては下記のリンクで別途詳しく記述してあります。
https://peps.python.org/pep-0257/

# 英語を話さない国出身の Python プログラマの方々へ
>あなたのコードが、自分の言葉を話さない人に 120% 読まれないと確信していなければ、コメントを英語で書くようにお願いします。

# 最後に
コードを書くことで一所懸命だった。
これからはコード規約を頭に入れ、コードを書いていく！
【第2章】達人プログラマー --上達に向けたあなたの旅--　読書メモ

## 読書箇所
第一章　達人の哲学 1~7節


## よくわからなかった点
| 記載箇所 | 内容 |
|:-:|:-:|
| デメテルの法則  |「知らない人とは話さないで、親しい人とだけ話して🥰？」ということらしい 要は「親クラス.子クラス.子クラスのメソッド/プロパティ」の様な形で、メソッド/プロパティを呼び出すのはNGということです。|
| イントロスペクション  |  プログラミング言語においてのintrospectionは、プログラムの実行時にオブジェクトの性質や型を調べることです。 dir()やtype()やisinstance()はそのオブジェクトの型が何なのか調べることができ、hasattr()はオブジェクトの属性を調べることができる|
|   |   |

## 気になった点　印象に残った点
| 記載箇所 | 内容 |
|:-:|:-:|
| 常に「簡単に変更できる」という究極の選択肢を採用するようにします。記述するコードを交換可能なものにしてください | 簡単にコードを変更できるようにしたらほかのどこかで依存とかで問題になったりするときはあるのでそこが難しいところ |
|  DRY原則が達人プログラマーの道具箱の中に入れておく道具のうちで最も重要なものの1つであると考える|   |
|  開発者間の2重化 | プロジェクト内の様々な開発者間で発生するというものであるが、コード数が多くなってくると全体を把握しきれずに重複してしまうということは発生しそうだと思った。  |
|直行性を念頭に置いた設計、実装されたシステムは、テストが簡単になります。システムのコンポーネント間の対話が定型化され、制限されるため、システムの多くが個別モジュールレベルで実行できるようなる。 |テストをしようにも依存関係が強すぎてテストできないっということによくかまっていたのでこれはよくわかる|


## 参考
- https://zenn.dev/miya_tech/articles/b59916140347e2
【Go言語】go run main.goを使うな

# はじめに

一番初歩的な話ですが、海外の記事で話題になっていたのでまとめました。

# 結論

`go run main.go` より `go run .` を使いましょう。

# なぜ`go run .`の方がいいのか？

`go run main.go`だと、以下のようにmainパッケージが2つに分かれているとコンパイルエラーになる可能性がある。あと、短い。

```go:main.go
package main

func main() {
	hello()
}
```

```go:hello.go
package main

import "fmt"

func hello() {
	fmt.Println("Hello!")
}
```

```shell-session
$ go run main.go
# command-line-arguments
./main.go:4:2: undefined: sayHello
```

`go run .`を使うと、正しく実行される。

```shell-session
$ go run .
Hello!
```

ファイルを指定する場合は、以下のようにする。

```shell-session
$ go run main.go hello.go
Hello!
```

# 元ネタ

[Stop using `go run main.go` - YouTube](https://www.youtube.com/watch?v=ucT5erjGua0)
【nodenv】ついに nodebrew を辞めて nodenv に乗り換えました

手に馴染んでいるという理由でこれまで nodebrew の世話になってきたのですが、
複数のフロントエンドプロジェクトを行き来する中で、基本的に .node-version ファイルでバージョン管理しているプロジェクトが大半であり、デフォルトだと、いちいち `nodebrew use` するのが怠かったので、自前の Node.js バージョン管理ツールを見直すことにしました。

Node 16 は既に EOL を迎えていますが、一時期は 16・18・20 までを日に何回も往復することがとても億劫でした。（今はそんなこともないのですが

昨今、nodenv 以外にも fnm 、 Volta 、　asdf など色々選択肢あるなあと思いつつ、お気持ちとして高速かどうかは気にしないし、とにかく設定が楽だといいなあ、ん、Volta とか最近更新されとらんな？が気になり、結局 nodenv で十分か、となりました。

この辺で、nodenv 以外のツールでおすすめポイントとかあったら是非教えて欲しいです。

FYI：

https://github.com/nodenv/nodenv

https://github.com/Schniz/fnm

https://volta.sh/

https://asdf-vm.com/

乗り換えは簡単です。Mac で brew を使う前提です。

## 以下、雑に手順メモ

必要に応じて、現在の Node.js バージョンを確認し、控えておきます
```
nodebrew list
```

nodebrew をアンインストール
```
brew uninstall nodebrew
```

シェル設定ファイル（.zshrcや.bash_profile）から以下の行を削除
```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

:::note info
.nodebrew ディレクトリが残っている場合は適宜削除しましょ
:::


nodenvをインストール
```
brew install nodenv
```

シェル設定ファイルに以下を追加
```
eval "$(nodenv init -)"
```

シェルを再起動するか、設定を再読み込み
```
source ~/.zshrc
```

必要な Node.js バージョンを片っ端からインストール
```
nodenv install <version>
```

各プロジェクトの .node-version を参照出来ているかを確認
```
cd <各プロジェク>
node -v
```
JavaScriptで文字列のformat()

## はじめに

こういう風に文字列をテンプレート化して後から値を埋め込みたいことがあると思います。

```js
const greetTemplate = "Hello, {name}!";

format(greetTemplate, { name: "world" }); // -> "Hello, world!"
```

何番煎じかわかりませんが、JavaScriptでこれをする方法を思い付いたので記事として残しておきます。

## コード

TypeScriptで書かれていますが、型情報を取り除けばJavaScriptでも使えます。

```ts
const format = (
  template: string,
  placeholders: Record<string, string> = {},
): string =>
  template.replaceAll(/([{}])\1|\{([^{}]+)\}/g, (_, braces, name) =>
    braces ?? placeholders[name] ?? "",
  );
```

### 使い方

基本的な使い方は`{フィールド名}`を含む文字列を第1引数に渡して、対応するフィールド名を持つオブジェクトを第2引数に渡すだけです。

```js
format("Hello, {name}!", { name: "world" }); // -> "Hello, world!"
```

また、`{{name}}`という風に書くと波括弧をそのまま出力することができます。

```js
format("Hello, {{name}}!", { name: "world" }); // -> "Hello, {name}!"
```

何番煎じかわからないと最初に書きましたが、波括弧のエスケープ処理までできる記事は少ないかもしれません。

### 解説

基本的にreplaceを使用して正規表現で置換していくだけです。
まず`([{}])\1|\{([^{}]+)\}`という正規表現は`([{}])\1`と`\{([^{}]+)\}`の二つを組み合わせたものであり、それぞれ`{{`や`}}`のような波括弧が連続する場合と`{name}`の場合にマッチします。
前者にマッチした場合は`(_, braces, name) =>`のbracesにマッチした波括弧が入り、後者にマッチした場合はnameのほうにマッチしたフィールド名が入ります。
つまり`braces ?? placeholders[name] ?? ""`はマッチした波括弧がある場合はそのまま波括弧を返し、フィールド名にマッチした場合はplaceholdersから対応フィールドの値を取り出して返し、対応するフィールドがない場合などで取り出せなかった場合は空文字に置換するコードです。
初めてAWS Summit Tokyoに参加してみた

## 初めてAWS Summit Tokyo 2024に参加してきました
忘れないうちにまとめたいと思います。
![IMG_4034.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821192/5f05d3a9-abe4-7955-8b08-fe6bd6120360.jpeg)



## 事前準備
### 1. AWS Summit公式サイトでアカウント登録
まずAWS Summitの公式サイトで事前にアカウントを作成しておきます。

### 2. セッションの申し込み
ここで大事なのが**気になるセッションはとりあえず申し込んでおくこと。**
なぜならセッションの申し込みは**公聴するための席が確保されるわけではない**ですが、**当日優先的に受け付けてくれる**からです。
AWS Summit当日はたくさんの来場者数で、ほぼ全てのセッションが満席＋立ち見有りだったので、忘れずに。

### 3. Xでハッシュタグ #awssummit をチェック
当日の有益情報が流れてくる可能性があるので、Xアカウントをお持ちであればぜひ。

### 4. 身分証明証と、会社の名刺を持っていく！
私は職場姓は旧姓を使っていることもあり、AWS Summit公式サイトでのアカウント登録も旧姓で登録していました。
当日、受付を済ませようとしたところ、うっかり名刺を忘れてしまい身分証明に時間がかかってしまいました。私のように旧姓を使われている方はご注意ください。

## いざ、AWS Summitの会場（幕張メッセ）へ
AWS Summit Tokyoは例年幕張メッセで開催されているようで、今年2024年も幕張メッセでの開催でした。
最寄駅は海浜幕張で、幕張メッセまで徒歩で約5分です。
海浜幕張駅からのルートは下調べせずに行きましたが、海浜幕張の改札出口は一つしかなく、改札出口に「幕張メッセはこちら」と案内が出ているのでそれに従えば現地に着きます。（男性がぞろぞろ向かう流れにのって歩けばいつの間にか幕張メッセに着きます。笑）
途中にコンビニ（確かミニストップ）もあるので、そこで飲み物や軽食を買っておくと良いです。

![IMG_3938.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821192/707683c3-d25b-d09e-cd03-3bbdca767ca6.jpeg)
幕張メッセに着きました！
まずは受付をします。

各セッションは開始前から長蛇の列ができるので、聞きたいセッションが開始する20〜30分前には会場に到着しておいて、受付完了次第セッション受付の列に並ぶことをお勧めします。
AWS Summit公式サイトでアカウントにログインし、QRコードを提示→端末で読み取ります。そして会社の名刺を提示すると本人確認が完了し、自分の名前が印字された紙と事前に予約していたセッションの開催場所が印字された紙を渡されます。（この紙をみて初めてどのセッションがどの場所で開催されるのかを知りました。）
![IMG_4054.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821192/bb0e2afb-1136-0f97-47fa-90c431e1cc6d.jpeg)
渡される紙はこんな感じ。

受付後、いざ会場へ！・・・と思いましたが、受付後、会場への入り口がどこかいまいち分からず（T＿T）
「Ask me!」と書かれている黄色いTシャツを着ているスタッフの方に入り口を聞いて案内していただきました。


## セッション公聴＆ブース巡り
午後から参加してセッション3つ、ブースをいくつか周りました。
（業務ではAWSの保守運用をしているのでセキュリティやIaCをメイン）
みんな目がキラキラしていて、参加してとてもモチベーションが上がりましたし、業務に活かせそうなこともAWSの方にお伺いできたので満足です！

![IMG_4033.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821192/adb9cb36-1c17-5e7f-99c4-22ae0049b331.jpeg)
セッションの様子どこも満席ですね。

![IMG_4055.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821192/5b91eaa4-a4c3-ebf4-7672-6c3475123c57.jpeg)

AWSおみくじも引きました。大大吉！

![IMG_4040.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821192/ee5592c5-df43-4771-b74c-8e8b1a612af9.jpeg)

色々ブースを見て周りましたが、どこも大混雑＆大盛況！
特にIndustryと生成系AIセクションが盛り上がっていたのが印象的でした。

13時に会場入りして、17時ごろには足腰がバキバキになってきたので退場しました。セッション公聴時に座るパイプ椅子はほんと腰に悪いですね。笑

## おわりに
コンテンツ盛りだくさんで、来年も参加したいと思えるイベントでした。
次回は密かに憧れていた「Ask an expert」ブースで質問してみたいです。（今回は大混雑で話せなかった）
今後はブースでAWSさんに教えていただいたCDKの活用方法を業務に生かそうと目論んでおります。

初めてAWS Summitに参加する方の一助になればと思い、この度記事化してみました。誰かのお役に立てますように。

![IMG_4034.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821192/a9a9a97a-120f-bab1-605b-dfa0f0703d8b.jpeg)
IBM Cloud: 作成したリソースのCRNおよびGUID(インスタンスID)の取得方法

RESTAPIなどで、IBM Cloudの作成したリソースのCRNおよびGUID（インスタンスIDという場合もあり）の指定が必要になった場合の取得方法です。

一般的には[IBM CloudのWebコンソールのリソースリストから取得](#1-ibm-cloudのwebコンソールのリソースリストから取得)します。
製品によってはそのWeb管理画面から取得できたりもするので、私がわかっているもの2つ記載しておきます。
- [watsonx.data](#2--watsonxdataの場合-watsonxdataのwebコンソールから取得)
- [Db2 on Cloud](#3--db2-on-cloudの場合-db2-on-cloudのwebコンソールから取得)

# 1. IBM CloudのWebコンソールのリソースリストから取得

### 1-1. IBM CloudのWebコンソールのリソースリストを表示
　ダッシュボードの左側のナビゲーションメニューから、リソース・リストのアイコンをクリック
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/9bc163bf-96d9-2a0d-bc10-b09ddaba9862.png)

リソースリストが表示されます：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/263fd7b9-bbce-c1eb-dec4-bdb78957d654.png)

### 1-2. 取得したいリソースを表示
対応するセクションをクリックして、 CRNおよびGUID(インスタンスID)を取得したいリソース名を表示させます。
以下watsonx.dataを例とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/19f0fec0-cc74-292c-49fa-19244cddaeb6.png)

### 1-3. 取得したいリソース行の真ん中あたりをクリック
正確には取得したいリソース行のリソース名リンク以外の部分ならどこでもいいのですが、真ん中あたりなら間違いないです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/e29dd35e-9fd2-d1e8-d241-eb1df2ebcd94.png)


### 1-4. 右側に表示されたCRNおよびGUIDの値をコピーアイコンをクリックして、コピーし取得する
全部は表示されないので、値の右側のコピーアイコンクリックして、クリップボードにコピーすることで取得してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/8e90fa96-8b14-55c3-025d-5f145affae84.png)

コピーが終わったら右上の「X」をクリックして、閉じてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/4f751229-8e39-fe17-cab8-840b68e17d78.png)

IBM CloudのWebコンソールのリソースリストから取得する方法は以上です。

# 2.  watsonx.dataの場合: watsonx.dataのWebコンソールから取得
### 2-1. watsonx.dataのホーム画面から、　左側のナビゲーション・メニュー上のインフォメーションアイコン(インスタンスの詳細)をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/0f07a7d8-7640-9227-4a25-d9f89fb413a8.png)

### 2-2. 表示されたグラウド・リソース名(CRN)およびインスタンスID（=GUID）の値をコピーアイコンをクリックして、コピーし取得する
全部は表示されないので、値の右側のコピーアイコンクリックして、クリップボードにコピーすることで取得してください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/04cc64ee-e9a4-f1ad-9447-c85d78b446ec.png)

コピーが終わったら右上の「X」をクリックして、閉じてください。
 watsonx.dataの場合のwatsonx.dataのWebコンソールから取得する方法は以上です。

 # 3.  Db2 on Cloudの場合: Db2 on CloudのWebコンソールから取得
 ### 3-1.　Db2 on Cloudのホーム画面から、　左側のナビゲーション・メニュー上の製品情報アイコンをクリックします。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/9193d133-f4a4-c4ac-bdf2-93ed007f2839.png)

### 3-2. 表示された名前のCRNから始まる文字列がCRNです

- **CRN**: crnから始まる文字列マークしてコピーして取得してください
- **GUID(インスタンスID)**: CRNの文字列の最後の`:`と`::`で囲まれた値がGUIDです。
    - 　CRNが`crn:v1:bluemix:public:dashdb-for-transactions:us-south:a/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy::`だったら、`yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy`部分がGUIDとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/cb8013da-4590-2132-0104-78bdcb284be5.png)

コピーが終わったら右上の「X」をクリックして、閉じてください。
Db2 on Cloudの場合: Db2 on CloudのWebコンソールから取得する方法は以上です。