OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Data Factory にて Salesforce のアクセストークンを無効にする方法

## 概要

Azure Data Factory にて Salesforce のアクセストークンを無効にする方法を共有します。


## 手順

### Azure Data Facotry にてアクセストークンを取得するようなパイプラインを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d722aa0a-cb7b-4c8f-b015-8bb363b85e3c.png)

### アクセストークンを無効化（`Revoke`）する web アクティビティを追加

<details><summary> アクティビティの定義</summary>

```json
{
    "name": "RevokeToken",
    "type": "WebActivity",
    "dependsOn": [
        {
            "activity": "ForEach1",
            "dependencyConditions": [
                "Succeeded"
            ]
        }
    ],
    "policy": {
        "timeout": "0.12:00:00",
        "retry": 0,
        "retryIntervalInSeconds": 30,
        "secureOutput": false,
        "secureInput": false
    },
    "userProperties": [],
    "typeProperties": {
        "method": "POST",
        "headers": {
            "Content-Type": "application/x-www-form-urlencoded"
        },
        "url": "https://login.salesforce.com/services/oauth2/revoke",
        "body": {
            "value": "@concat(\n    'token=',\n    activity('GetToken').output.access_token\n)\n",
            "type": "Expression"
        }
    }
}
```

</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/799a3949-729b-ebad-0e42-ef2ff9f53a97.png)

### パイプラインを実行して正常終了することを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/45b8afd8-3a41-9e0a-4779-f6c41277d9a2.png)
【PostgreSQL】空文字をCASTするとinvalid input syntaxエラーになるので対策をする

# エラー内容
OracleからPostgreSQLへの移行作業中に以下のようなエラーに遭遇しました。PostgreSQLでは空文字とNULLは別モノ扱いなので対策する必要があります。
``` sql:エラーとなったコード
-- 変数Aには空文字('')が入っている
CAST(変数A AS FLOAT)
```
``` :エラー文
invalid input syntax for type double precision: ""
```
「FLOAT型(type double)に対する無効な入力やで」という意味

# 対策
今回は **nullif関数** を使用して対策を行います。nullif関数は第一引数と第二引数が等しい文字列であればnullを返してくれます。

CASTしたい値が変数Aだとします。以下のようにすることで変数Aに空文字が入ればnullが返り、そうでなければ変数Aの文字列がそのまま通ります。
``` sql:例
CAST(nullif(変数A,'') AS FLOAT)
```

# 参考資料
nullif関数に関しては以下を参照

https://www.postgresql.jp/document/15/html/functions-conditional.html
データベーススペシャリスト試験　受験記録

# はじめに
令和5年度秋期のデータベーススペシャリスト試験を受験し、合格しました。
得点は以下です(合格ラインギリギリでした)。

|試験区分|得点|
|:---:|:---:|
|午前Ⅰ|免除|
|午前Ⅱ|80点|
|午後Ⅰ|61点|
|午後Ⅱ|66点|

合格発表から少し時間が経ってしまいましたが、備忘録として残していこうと思います。

# 試験概要

IPAの公式サイトに記載があります。

https://www.ipa.go.jp/shiken/kubun/db.html

# 勉強を始めた時点での筆者のレベル
- IT業務歴は3年目
- 令和4年度秋期の応用情報技術者試験に合格
- 実務でのSQL使用経験あり。午後試験で出題される設計回り(概念設計など)の実務経験はほぼなし

# ・学習時間・学習スケジュール

学習時間は
- 平日：1時間~1時間半(午前Ⅱの過去問題演習・知識のインプット)
- 休日：6時間~8時間(主に午後の過去問題演習)

ほど取り組みました。
午後の過去問題演習はまとまった時間をとる必要があるため、休日に取り組みました。

事前に以下のように学習スケジュールを作成し、この通りに進めました。

|学習期間|学習内容|
|:---:|:---:|
|6月後半|データモデリング学習|
|7月前半|参考書学習|
|7月後半~10/7(土)：試験前日|午前Ⅱ過去問題演習|
|7月後半~8月1週目|午後Ⅰ過去問題演習|
|8月2週目~後半|午後Ⅱ過去問題演習|
|9月~10/7(土)：試験前日|午後Ⅰ・Ⅱ過去問題演習|

# 使用した参考書・サイト

### 業務システムモデリング練習帳　業務システムを効果的に設計するための精選45題
https://bookplus.nikkei.com/atcl/catalog/06/P82850

概念設計の業務経験がなかったため、午後Ⅰ・Ⅱ問題のイメージをつかむために読みました。業務システムから画面やER図などの設計について、実際に手を動かし学ぶことができます。内容も読みやすく、データモデリングについて学ぶことができ、とても良い参考書だと思います。



### 徹底攻略 データベーススペシャリスト教科書 令和5年度
https://book.impress.co.jp/books/1122101156

午前・午後対策の知識のインプットとして使用しました。これ一冊で試験範囲はカバーできていると思います。
購入特典として過去問題の解説PDFがついており、午後Ⅰ・Ⅱ問題の解説があるのも良い点かと思います。

### データベーススペシャリスト ドットコム

https://www.db-siken.com/dbkakomon.php

午前Ⅱの過去問題演習に使用しました。スマホでも使用できるためスキマ時間に問題演習を行うこともできます。

### 過去問題

https://www.ipa.go.jp/shiken/mondai-kaiotu/index.html

午後Ⅰ・Ⅱともに平成27年度春期~令和4年度秋期の計8回分使用しました。
問題文中にシャーペンで書き込みをしたかった&本番と同じ形式で問題演習をするために、紙に印刷して使用しました。

# 学習方法

## 午前問題

参考書で基礎知識のインプット+過去問題演習で合格ラインに十分届くかと思います。

### 午前Ⅰ

- 免除だったため、取り組みはなし

### 午前Ⅱ

- 7月前半に[徹底攻略 データベーススペシャリスト教科書 令和5年度](https://book.impress.co.jp/books/1122101156)を一周し、その後は辞書として使用
- 7月の後半以降は平日に[データベーススペシャリストドットコム](https://www.db-siken.com/)で過去問題演習
  - 1時間ほどのまとまった時間があるときは1回分の過去問題を演習
  - スキマ時間は全範囲からランダム出題で演習

## 午後問題

過去問題演習で対策していきます。
午後問題を解くときは以下を意識して取り組みました。
- **時間を計測して問題演習を行う**(午後Ⅰなら90分、午後Ⅱなら120分の制限時間を設定)
- 問題文を読むときは**回答の根拠になりそうな箇所には線を引くなどのメモをし**、問題文中の情報を整理する
  - 概念設計の場合、問題文中のエンティティや属性を洗い出しながら読み進めるなど、問題文の情報整理の方法は[徹底攻略 データベーススペシャリスト教科書 令和5年度](https://book.impress.co.jp/books/1122101156)を参考

午後Ⅰ・Ⅱともに問題文の量が多いため、最初のほうは時間内にすべて回答することが難しいと思います。他の方の受験記録にも書かれていると思いますが、とにかく過去問題演習を重ねて問題に慣れることが大事です。

### 午後Ⅰ
- 6月後半に[業務システムモデリング練習帳　業務システムを効果的に設計するための精選45題](https://bookplus.nikkei.com/atcl/catalog/06/P82850)を一周
- 7月後半~8月1週目で直近8回分の過去問題を1日1~2回分演習のペースで取り組む(前述のとおり、まとまった時間をとる必要があるため休日を使用して取り組んだ)
- 9月~試験前日までは一度解いた過去問題を再度解き、直近8回分を2周

選択問題については以下の2つに絞り学習しました。事前にER図の知識があれば概念設計は取り組みやすいと感じました。
- 概念設計：ER図に関しての知識は少しあった+午後Ⅱでも概念設計を選択予定だったため
- SQL設計：業務経験があったため

### 午後Ⅱ
- 8月2週目~後半に直近8回分の過去問題を1日1~2回分演習のペースで取り組む(こちらも同様に休日に取り組んだ)
- 午後Ⅰの学習と同様、9月~試験前日までは一度解いた過去問題を再度解き、直近8回分を2周

選択問題については概念設計に絞り学習しました。

# 試験当日

- 午前Ⅱ：例年通り過去問題の流用が多かった印象。時間に余裕をもって問題なく回答
- 午後Ⅰ：概念設計とSQL設計を選択予定だったが、当日の問題構成が概念設計2題と物理設計+SQL設計1題となっていたため、概念設計2題を選択(制限時間ギリギリでの回答だったため、見直しが最後までできず)。また午後Ⅰ終了時点で体力をかなり消費
- 午後Ⅱ：予定通り概念設計問題を選択。書く量が多く大変だったが時間が120分あるため、なんとか回答

# 最後に
受験学習を通して、データベースについての基礎的な知識・設計の考え方を学習することができ受験して良かったと思っています。
今回の試験学習で物理設計の学習はあまりできなかったため、再度学習したいと思います。

この記事が何かの参考になれば幸いです。
ComposeMultiplatformのプロジェクトを作成してみる

何年か前KotlinMultiplatformにチャレンジして挫折したのですが、調べてみると現在ならある程度出来るようになっているのではないかと思い、まずはプロジェクトを作成してみようと思います。

プロジェクト作成できたら、色々な実装をしてみようと思います。

# 開発環境確認
```
$ brew install kdoctor
$ kdoctor
```
こちらのコマンドで必要なものが揃っている前提で始めます。

```
Conclusion:
  ✓ Your operation system is ready for Kotlin Multiplatform Mobile Development!
```
このようになっていれば開発可能みたいです。

# プロジェクト作成

Kotlin Multiplatform Wizard

https://kmp.jetbrains.com/#newProject


こちらKotlin Multiplatform Wizardを使用してプロジェクトを作成していきます。

![スクリーンショット 2024-06-23 19.13.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/3ee7f093-8e43-d85e-8345-00cf459b7ecd.png)

このように致しました。

ダウンロードしたzipを解凍し、AndroidStudioでプロジェクトを開きます。


Android 
Run ConfigurationsでcomposeAppを選ぶ
緑色の▷をクリックする
![Screenshot_20240623_193831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/6b4de8ae-70b9-7191-f459-f79b0a53f8ad.png)

iOSアプリ
Run ConfigurationsでiosAppを選択します
緑色の▷をクリックする
![Simulator Screenshot - iPhone 15 - 2024-06-23 at 19.40.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/a886158e-ab0d-4a17-3195-caecba608f02.png)

Android、iOS共にビルドができたので、今後色々と実装をしていきたいと思います。

FleetというIDEが気になるのでこちらでビルドもできるのか試してみたいですね。

https://blog.jetbrains.com/ja/kotlin/2023/11/kotlin-multiplatform-tooling-in-fleet/



公式

https://www.jetbrains.com/ja-jp/lp/compose-multiplatform/
GitHub Actions で Go のテスト実行

CI の一環として、GitHub のデフォルトブランチに PR を作成した時と、マージをした時に UT　を行う GitHub Actions を作成します。

### ファイル構成
```
.github
　　├─ actions
　　│   └─ go-ut
　　|       └─ action.yml
　　└─ workflows
    　　└─ ci.yml
json
　　├─ go.mod
　　├─ go.sum
　　├─ pretty_print.go
　　└─ pretty_print_test.go
.gitignore
```
最終的にはリリースも GitHub Actions から行うため、UT　の実行は action.yml に記載しています。
今回は、Go　言語の UT　を対象にしており、json フォルダの下にコードおよび、テストコードが置かれています。

### Action
``` .github/actions/go-ut/action.yml
name: Go UT
description: Run go unit test

inputs:
  go-directory:
    required: true
  result-file:
    required: false
    default: result.txt

runs:
  using: 'composite'
  steps:
    - uses: actions/checkout@v4

    - name: Set up Go
      uses: actions/setup-go@v4
      with:
        go-version: '1.21'
        check-latest: true
        cache-dependency-path: |
             json/go.sum

    - name: Build
      shell: bash
      run: go build -v ./...
      working-directory: ${{ inputs.go-directory }}

    - name: Test
      shell: bash
      run: go test -cover ./... > ${{ inputs.result-file }}
      working-directory: ${{ inputs.go-directory }}

    - name: Summary
      shell: bash
      run: |
        echo "### UT summary" >> $GITHUB_STEP_SUMMARY
        while read LINE; do
          echo $LINE >> $GITHUB_STEP_SUMMARY
        done < ${{ inputs.result-file }}
      working-directory: ${{ inputs.go-directory }}
```
引数には、テスト対象の Go　モジュールのディレクトリ（go-directory）と、テスト結果の出力ファイル名（result-file）を定義しています。
また、テスト結果を GitHub　Action　のサマリーとして出力しています。

### Workflow
```.github/workflows/ci.yml
name: CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  UT:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Go UT
        uses: ./.github/actions/go-ut
        with:
          go-directory: ./json
```

### 実行結果
main ブランチに PR　を作成すると UT　が実行されます。
![スクリーンショット 2024-06-23 19.25.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254520/1fb84a08-8670-160e-7a9a-5669f920627f.png)

Details　から Action　を確認すると Summary にテスト結果が表示されます。
![スクリーンショット 2024-06-23 19.13.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254520/0d44de17-aa30-f6fd-a54c-9ff1f9fc8d13.png)

### 依存関係をキャッシュ（2025/04/29 追記）
参考：https://docs.github.com/ja/actions/writing-workflows/choosing-what-your-workflow-does/caching-dependencies-to-speed-up-workflows

GitHub Action に下記の3行を追加し、Go の依存ライブラリのキャッシュを行います。
```
      uses: actions/setup-go@v4
       with:
         go-version: '1.21'
+        check-latest: true
+        cache-dependency-path: |
+             json/go.sum
```

キャッシュは go.sum のハッシュをキャッシュキーの一部として使用しており、go.sum が更新されればキャッシュミスと判断され、新しい依存関係がダウンロードされます。

GitHubは、7日間以上アクセスされていないキャッシュを削除します。また、格納できるキャッシュの数に制限はありませんが、リポジトリ内のすべてのキャッシュの合計サイズは制限されています (最大 10 GB)。 リポジトリがその最大サイズに達すると、リポジトリ内の最も古いキャッシュが削除されます。

キャッシュは、Actions ⇒ Caches から確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254520/dbb6dd7a-85fa-4537-9e05-ab8305e628c4.png)
global-bundle.pemを使用しているのにfailed to verify certificate: x509: certificate signed by unknown authorityが出る

## TL;DR
使ってる`global-bundle.pem`が古かったです。
再度以下から取得しなおしたら解決しました。
https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem

## 検証方法
RDSの認証機関に`rds-ca-rsa2048-g1`を使用しています。 
 そこで、`RDS Root 2019 CA`が含まれているかを確認します。
以下を実行して、何も出力されなければダメです。

### Javaのランタイムがこちら
```console
keytool -printcert -v -file global-bundle.pem | grep -A2 "RDS Root 2019 CA"
```


### Go langでやりたい方はこちら
```go:main.go

package main

import (
	"crypto/x509"
	"encoding/pem"
	"fmt"
	"log"
	"os"
	"strings"
)

func main() {
	pemData, err := os.ReadFile("global-bundle.pem")
	if err != nil {
		log.Fatalf("Failed to read PEM file: %v", err)
	}

	// PEMファイルから証明書を抽出
	for {
		block, rest := pem.Decode(pemData)
		if block == nil {
			break
		}
		if block.Type != "CERTIFICATE" || len(block.Bytes) == 0 {
			log.Println("No certificates found in PEM data")
			return
		}

		// X.509形式の証明書に変換
		cert, err := x509.ParseCertificate(block.Bytes)
		if err != nil {
			log.Fatalf("Failed to parse certificate: %v", err)
		}

		if strings.Contains(cert.Issuer.String(), "RDS Root 2019 CA") {
			fmt.Println("Certificate Details:")
			fmt.Println("Issuer:", cert.Issuer)
			fmt.Println("Subject:", cert.Subject)
			fmt.Println("Not Before:", cert.NotBefore)
			fmt.Println("Not After:", cert.NotAfter)
		}

		pemData = rest
	}
}

```

私の場合は何も表示されなかったので、この`global-bundle.pem`には求めている`RDS Root 2019 CA`が含まれていないことがわかります。

どこで拾ってきた`global-bundle.pem`なんでしょうか。再取得しましょう。
シューア補行列の正定値性の証明 Proof of Schur Complement Lemma

# Schur Complement Lemma

```math
T = \begin{pmatrix}
Q & S^T \\
S & R
\end{pmatrix}
```
で $ Q \succ O $ とする。このとき、
```math
T \succeq O \Leftrightarrow R - S Q^{-1} S^T \succeq O
```

# Proof
よく激キモブロック行列を使って証明されているのですが、それだと思い出しずらいのでベーシックな方法で示します。
```math
x = \begin{pmatrix}
x_1 \\
x_2
\end{pmatrix} \quad\quad (x_1 \in \mathbb{R}^{q}, \quad x_2 \in \mathbb{R}^{r})
```
```math
\begin{align*}
T \succeq O &\Leftrightarrow x_1^T Q x_1 + x_2^T R x_2 + 2 x_1^T S^T x_2 \geq 0 \quad \forall x_1, x_2 \\
&\Leftrightarrow (Q^{1/2}x_1+Q^{-1/2}S^Tx_2)^T (Q^{1/2}x_1+Q^{-1/2}S^Tx_2) - x_2^T S Q^{-1} S^T x_2 + x_2^T R x_2 \geq 0 \quad \forall x_1, x_2 \\
&\Leftrightarrow \|{Q^{1/2}x_1+Q^{-1/2}S^Tx_2}\|_2^2 + x_2^T (R - SQ^{-1}S^T) x_2 \geq 0 \quad \forall x_1, x_2 \\
&\Leftrightarrow \|{Q^{1/2}(x_1+Q^{-}S^Tx_2})\|_2^2 + x_2^T (R - SQ^{-1}S^T) x_2 \geq 0 \quad \forall x_1, x_2 \\
&\Leftrightarrow R - SQ^{-1}S^T \succeq O
\end{align*}
```
最後の行は省略しています。左向きは自明です。右向きは $x_2$ を先に決めると、$x_1$ を上手く選ぶとノルムの部分を0にできるので…って感じで示せます。

# 感想
最近行列の平方完成ができるようになったので楽しくてやってみました。
この補題は最適化の文脈でSOCPをSDPで表現するときに使いました。

間違いとかあれば教えてください。
【Xcode/Swift】たかがログ、されどログ、素晴らしきos.Logger

# はじめに
iOS（Swift）では複数ログ出力する方法がある。
最新バージョンのXcodeを使用して検証してみようと思う。

# 前提
| 項目 | 内容 |
|:-:|:-:|
| Mac OS  | Sonoma 14.5  |
| Xcode  | 15.4  |
|使用言語  | Swift (バージョンは5)  |

# 結論
いきなりですが、ログ出力は<font color="Red">os.Logger</font>を使ってください！！
これが便利すぎるので、他のログ出力メソッドは使う必要ありません:thumbsup:

# ログの種類
## print
　昔からあるシンプルなログ出力メソッド。
 　タイムスタンプは自動では出力されないが、他言語と同じ使い方で出力可能。

## NSLog
　これも思いっきり昔からあるログ出力メソッド。
　自動でタイムスタンプが出力される。

## debugPrint
　これもシンプルなログ出力メソッドで、Debug時の効率が良い（らしい）

## os.Logger
　勝ち、圧倒的勝利、便利すぎる。
 　Xcode15からoslogと統合され、カテゴリなどに合わせてログをフィルタリングすることが可能となります。
　また、JumpToSource機能を使って、os.Loggerから出力したログを右クリックで"Jump To Source"を選択すると、ログ出力した該当箇所にジャンプできるます。
　はっきり言って便利すぐる:v::v::v:

 ・使い方
 　サンプルコードは以下の通り
```
import os

〜〜〜〜〜〜

    static let logger = Logger(subsystem: "com.test.debug.hogehoge", category: "Logger")

    private func testLogger() {
        ViewController.logger.trace("Logger: \(#function), \(#line)")
    }
```
![スクリーンショット 2024-06-23 19.22.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/ae2b7a67-07c6-d354-0348-020375533354.png)


# Tips
・Swiftプログラミング言語で使用される特殊な識別子がいくつか用意されている。

　#file
 　→ファイルまでのパスを出力
　#function
　　→メソッド名を出力
　#line
 　→行数を出力

・デバッグエリアのMetadataの各種設定をしないとログ出力は見にくかも（Xcode15から？）
　![スクリーンショット 2024-06-23 19.23.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/6f22715d-da03-9e4e-6830-a50790fa4e37.png)
【ローカルLLM】Ollama Python Libraryのメソッド一覧と動作例

## 準備
### Ollama Python Libraryのインストール
Ollamaは下記より入手・インストールが可能です。
https://ollama.com/

Ollamaを実際に使用するにあたっては、Ollamaのアプリケーションを起動したのちに、下記のようなコマンドを実行すれば良いです。
```
$ ollama run phi3
```

上記を実行すると、ローカルにPhi-3-Miniのモデルファイルがない場合は自動的に入手してくれます。そのため、1度目の起動時に数GBの通信が必要になります。上記ではPhi-3-Miniを入手しますが、下記を実行することでLlama 3を入手することも可能です。
```
$ ollama run llama3
```

また、Ollama Pythonは`pip install ollama`を実行することでPyPIより入手が可能です。


### メソッドのまとめにあたって
https://github.com/ollama/ollama-python
上記に記載のあるメソッドについて取りまとめを行います。

```py
import ollama
response = ollama.chat(model='llama3', messages=[
  {
    'role': 'user',
    'content': 'Why is the sky blue?',
  },
])
print(response['message']['content'])
```
上記がサンプルコードです。実行すると下記のような結果が得られます。
```
The sky appears blue to us due to a phenomenon called Rayleigh scattering. As sunlight travels through Earth's atmosphere, it interacts with gas molecules and tiny particles. Sunlight consists of different colors of light, each having varying wavelengths. Blue light has shorter wavelengths compared to other colors in the visible spectrum....
```



## Ollama Python Libraryのメソッド一覧と動作例
### メソッドまとめ
| メソッド名 | 機能 |
|:-----------|:------------|
| chat | ユーザーの入力に対し、返答を返す |
| generate | ユーザーの入力に対し、返答を返す |
| list | インストール済みのモデルの一覧を取得 |
| show | 指定したモデルの詳細を確認する |
| create | `modelfile`に基づいて新たなモデルを構築する |
| copy | モデルをコピーする |
| delete | モデルを消去する |
| pull | ollama libraryからモデルを取得する |
| push | `model library`にモデルをアップロードする |
| embeddings | 入力した文章に対応するembeddingを返す、デフォルトの次元は`phi3`は3072、`llama`は4096 |
| ps | 直前に動かしたモデルについて返す |


### 動作例
#### chat
```py
import ollama

response1 = ollama.chat(model='llama3', messages=[
  {
    'role': 'user',
    'content': 'What is the capital of France? (Only capital name)',
  },
])
response2 = ollama.chat(model='llama3', messages=[
  {
    'role': 'user',
    'content': 'And what about Germany? (Only capital name)',
  },
])

print(response1['message']['content'])
print(response2['message']['content'])
```
・実行結果
```
Paris
Berlin
```


#### generate
```py
import ollama

response1 = ollama.generate(model='phi3', prompt='What is the capital of France? (Only capital name)')
response2 = ollama.generate(model='phi3', prompt='And what about Germany? (Only capital name)')

print(response1['response'])
print(response2['response'])
```
・実行結果
```
Paris
Berlin
```


#### embedding
```py
import ollama

response = ollama.embeddings(model='llama3', prompt='The sky is blue because of rayleigh scattering')

print(len(response['embedding']))
```
・実行結果
```
3072
```

```py
import ollama

response = ollama.embeddings(model='llama3', prompt='The sky is blue because of rayleigh scattering')

print(len(response['embedding']))
```
・実行結果
```
4096
```



## 参考
・Ollama API
https://github.com/ollama/ollama/blob/main/docs/api.md

・Ollama Python Library
https://github.com/ollama/ollama-python
【個人開発】ブログ開設

# 概要

　個人開発でブログを開設した。

https://test.learnersaws.com/

　ドメイン名がサイトと合っていないので近いうちに更新予定（あと一ヵ月もしないうちに期限切れ）。

 # 技術スタック

 フロントエンド：Vue3, Laravel blade
 バックエンド：Laravel
 インフラ：AWS（EC2, ALB, Route53, ACM）
Unity学習記録 #001 型と変数

# Unity学習のメモ

Unityの学習を始めたので、継続できるように勉強しながら大事そうな内容をメモに残していく。

## 「型」と「変数」とは？
ざっくり、「型」は値の種類を定義。「変数」は値を入れる箱。
<br>

「この箱（変数）には果物（型）を入れることができます」とか、言い方を変えると、「この箱（変数）には本（型）以外は入れることができません」とか。
<br>

「変数に設定できる型は〇〇型です」みたいな表現になる。
<br>

## 型
・データとしてどのような値を持つことができるのかを定義しているのが「型」
・変数を定義するときに行の先頭に記述される文字列で、予約語が設定されている
・型を定義することで、パソコンと人との対話が円滑になり、エラーの発生率が下がる
<br>

```csharp
// 変数の記述　型 変数名 = 値;
int num = 3;  //整数
string name = "東京";  //文字列
float a = 23.4f;  //浮動小数
bool b = true;  //ブール 
```
他にも型を指定する予約語はたくさんあるみたいだけど、使われる頻度が高い４つの型の記述例。
<br>

※予約語：プログラム言語の仕様で定義された単語（文字列や記号）で、ユーザーが変数として使用できない文字
<br>

## 変数
・変数名はユーザが自由に決めることができる
・頭文字に使用できない文字がある
<br>

変数名は開発ユーザーが自由に設定できるけど、コードを見返した時や、他人にコードを見せる場合などを考慮して理解しやすい単語を記述するのが望ましい。また、頭文字に使用できない文字もあるので注意が必要。
<br>

### 変数名の頭文字に使用できない文字
・数字（ 0, 1, 2, ... ）
・<font color ="gray"><strike>アンダーラインや</strile></font>特殊文字 ( <font color ="gray"><strike>_ ,</strile></font> @, * , = , % , & ...)
　<font color="gray">※2024/06/26追記</font>
・予約語も変数名には使えない


### 変数名には一般的な書き方があるみたい
```csharp
//キャメルケース
string firstName = "";
string lastName = "";

//スネークケース
string first_name = "";
string last_name = "";
```
<br>

キャメルケース
頭文字が小文字で始まり、２つ以上の単語を使って変数名を記述する場合は２つ目以降の単語の頭を大文字にしてつなぎ合わせる記述方法
<br>

スネークケース
全ての単語をアンダーバー( _ )でつなぎ合わせる記述方法
<br>

ちなみに、関数名は頭文字を大文字から記述することが多いようです。このようなルールを決めておけば、大文字から始まる文字列は「関数」、小文字から始まる文字列は「変数」という区別ができてコードが見やすくなるようです。
<br><br>

## 追記情報
### 2024/06/26
読者さんにコメントをもらいました。
変数名の頭文字にアンダーライン（正しくはアンダーバー）は使用できます。

https://learn.microsoft.com/ja-jp/dotnet/csharp/fundamentals/coding-style/identifier-names

読者さん、コメントありがとうございます。

修正する内容はなるべく取り消し線を追加するまでに留めて、完全修正はしないスタイルにしようと思います。（何を修正した追記情報なのかが後からでもわかるように）
Azure Data Factory にて Salesforce コネクターを利用してコピーアクティビティを実施する際の client credentials flow not enabled エラーへの対応方法

## 概要

Azure Data Factory にて Salesforce コネクターを利用してコピーアクティビティを実施する際の client credentials flow not enabled エラーへの対応方法を共有します。

> {"error":"invalid_grant","error_description":"client credentials flow not enabled"}

Azure Data Factory のドキュメントにて`Enable Client Credentials Flow`（`クライアントログイン情報フローを有効化`）を有効化することが求められており、`OAuth 2.0 クライアントログイン情報フロー`による認証が必要なようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9fdfec76-eb5e-678c-15c6-3857c847afc6.png)

引用元：[Salesforce と Salesforce Service Cloud コネクタのトラブルシューティング - Azure Data Factory & Azure Synapse | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/data-factory/connector-troubleshoot-salesforce#error-code-salesforceoauth2clientcredentialfailure)

`OAuth 2.0 クライアントログイン情報フロー`による認証については、下記の Salesfoce ドキュメントにてご確認ください。

- [サーバー間インテグレーション用の OAuth 2.0 クライアントログイン情報フロー (salesforce.com)](https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_client_credentials_flow.htm&type=5)

## エラーの再現方法

### Salesforce にて `Enable Client Credentials Flow`（`クライアントログイン情報フローを有効化`）の設定を無効化した接続情報を作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6584a3f3-5309-b995-e225-272058a153a6.png)

### リンクサービスのテスト接続でエラーとなることを確認

リンクサービスからテスト接続した際に、エラーとなることを確認。

> Unable to establish connection to the Salesforce environment using provided client id and client secret, please verify the details. Error message: {"error":"invalid_grant","error_description":"client credentials flow not enabled"}

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/fcff0ca5-b6c8-b70b-3b0e-6d6ab178e20a.png)

### Azure Data Factory にて Salesfoce コネクターを利用したコピーアクティビティのパイプラインを実行してエラーとなることを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7dd6bf54-735e-9414-ed0b-d411a21c4e7c.png)

> Failure happened on 'Sink' side. ErrorCode=SalesforceOAuth2ClientCredentialFailure,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Unable to establish connection to the Salesforce environment using provided client id and client secret, please verify the details. Error message: {"error":"invalid_grant","error_description":"client credentials flow not enabled"},Source=Microsoft.Connectors.Salesforce,'

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7336b732-80ed-3020-7fd8-6ddc11974cdb.png)

## 対応方法

### Salesforce にて`Enable Client Credentials Flow`（`クライアントログイン情報フローを有効化`）の設定を有効化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/429546fa-6d7b-2858-4b5a-81bd3e9483f9.png)

### Azure Data Factory にてパイプラインを実行して正常終了することを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/89db6824-b7e1-ac98-25c4-598d4662600f.png)
Lubuntu 24.04 LTS (Noble Numbat) セットアップメモ

## SSH サーバー起動

ココだけコンソールログイン。

```shell
sudo apt update
sudo apt -y install openssh-server
sudo systemctl status ssh -l
sudo systemctl enable ssh
sudo systemctl start ssh
sudo systemctl status ssh -l
```

## sudo 実行時パスワード入力無効化

以降, SSH 接続で。

```shell
cd /etc; pwd
echo "%$(id -ng) ALL=(ALL) NOPASSWD: ALL" | sudo tee sudoers.d/$(id -ng)
```

一旦, 再ログインする。

## パッケージインストール

途中の Postfix 設定は "設定なし" で OK.

```shell
sudo apt -y install xrdp fcitx-mozc git emacs screen
```

## Firefox ESR インストール

* [Firefox Extended Support Release](https://www.mozilla.org/ja/firefox/all/#firefox-desktop-esr)

↓ で 302 Found の Location を `curl -LO` する。

```shell
curl -I "https://download.mozilla.org/?product=firefox-esr-latest-ssl&os=linux64&lang=ja"
```

```shell
bunzip2 -c firefox-*esr.tar.bz2 | tar -xvf -
rm -iv firefox-*esr.tar.bz2
sudo mv -iv firefox /opt
cd /usr/local/bin; pwd
sudo ln -sv /opt/firefox/firefox .
cd; pwd
```

## 

* [syl20bnr/spacemacs](https://github.com/syl20bnr/spacemacs)

Nanum Gothic はダウンロード元 URL が分からなかったのでターミナル完結は面倒そう。

```shell
curl -LO "https://github.com/adobe-fonts/source-code-pro/releases/download/2.042R-u%2F1.062R-i%2F1.026R-vf/TTF-source-code-pro-2.042R-u_1.062R-i.zip"

unzip TTF-source-code-pro-2.042R-u_1.062R-i.zip
unzip Nanum_Gothic.zip -d Nanum_Gothic

rm -iv *.zip
sudo mv -iv TTF Nanum_Gothic /usr/local/share/fonts

sudo fc-cache -fv

git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d
```

どっとはらい。
Exponential backoff でリトライ処理を実装してみる

# はじめに
ネットワークの処理でエラーが発生した際のリトライ処理（Exponential backoff）について勉強したので備忘録も兼ねて本記事を作成しています。


# Exponential backoffとは？
指数関数的にリトライする間隔を後退させる（遅らせる）アルゴリズムです。
エラーが発生した際に次のリトライ処理を1秒後、2秒後、4秒後、8秒後というようにリトライの間隔を指数関数的に長くしていく手法です。
これだけだとリトライ間隔も同じになってしまうため、ランダム値のジッターを使用しリトライの時間を分散させる。


# 環境
python 3.12


# ソース

一定の確率で処理を失敗させリトライ間隔を遅らせながら、再試行回数が最大値に達するまで試行を続けます。

```python:lambda_function.py
import time
import random

# 再試行に関する設定
MAX_RETRIES = 5
BASE_DELAY = 1

def simulate_operation():
    # 70%の確率で失敗させる
    if random.random() < 0.7:
        raise Exception("失敗")
    return "成功"

def lambda_handler(event, context):
    # 現在の再試行回数を取得
    retries = event.get('retries', 0)
    
    # 待機時間を計算
    delay = (2 ** retries) * BASE_DELAY + random.random()
    
    # 最大再試行回数を超えた場合
    if retries > MAX_RETRIES:
        return {
            'statusCode': 500,
            'body': '最大再試行回数を超えました'
        }
    
    try:
        # 失敗をシミュレート
        result = simulate_operation()
        print('成功')
        return {
            'statusCode': 200,
            'body': result
        }
    except Exception as e:
        print(f"試行回数： {retries + 1} 失敗: {str(e)}")
        
        # スリープ
        time.sleep(delay)
        
        # 更新された再試行回数を持つイベントを準備して再帰的に呼び出す
        updated_event = {
            'retries': retries + 1
        }
        return lambda_handler(updated_event, context)
```


# 実行結果
Lambdaをテスト実行しCWからログを確認すると1回目、2回目のリトライ処理では失敗していますが、3回目のリトライで成功している事が確認できます。

```
タイムスタンプ  メッセージ
2024-~~	試行回数： 0 , 失敗
2024-~~	試行回数： 1 , 失敗
2024-~~	試行回数： 2 , 失敗
2024-~~	成功
```

# 参考

https://dev.classmethod.jp/articles/aws-sdk-exponential-backoff/

https://beyondjapan.com/blog/2022/06/exponential-backoff-and-jitter/
リスト型のよく使うメソッド[C#]

AtCoderやっていてよく使うなと思ったメソッドを自分用にまとめておく
随時更新していく

# 基本操作
## 1. Add(T item)
リストの末尾に要素を追加
```C#
List<int> numbers = new List<int>();
numbers.Add(1);
```

## 2. Remove(T item)
最初に見つかった指定した要素をリストから削除する
```C#
numbers.Remove(1);
```

## 3. RemoveAt(int index)
指定したインデックス位置にある要素をリストから削除する
```C#
numbers.RemoveAt(0);
```

## 4. Clear()
リストからすべての要素を削除する
```C#
numbers.Clear();
```

## 5. Contains(T item)
リストに指定した要素が含まれているかどうかを確認する
```C#
bool hasNumber = numbers.Contains(1);
```

## 6. IndexOf(T item)
指定した要素が最初に出現するインデックスを返す．見つからなければ-1を返す
```C#
int index = numbers.IndexOf(1);
```

## 7. Insert(int index, T item)
指定したインデックス位置に要素を挿入する
```C#
numbers.Insert(0, 1);
```

# コレクション操作

## 8. AddRange(IEnumerable<T> collection)
指定したコレクションの要素をリストの末尾に追加する
```C#
List<int> moreNumbers = new List<int> { 2, 3, 4 };
numbers.AddRange(moreNumbers);
```

## 9. RemoveRange(int index, int count)
指定したインデックスから指定した数の要素を削除する
```C#
numbers.RemoveRange(0, 2);
```

## 10. InsertRange(int index, IEnumerable<T> collection)
指定したインデックス位置にコレクションの要素を挿入する
```C#
numbers.InsertRange(0, moreNumbers);
```
# ソートと検索
## 11. Sort()
リストの要素を昇順にソートする
```C#
numbers.Sort();
```

## 12. Find(Predicate<T> match)
指定した条件を満たす最初の要素を返す
```C#
int found = numbers.Find(x => x > 2);
```

## 13. FindAll(Predicate<T> match)
指定した条件を満たすすべての要素を含むリストを返す
```C#
List<int> foundNumbers = numbers.FindAll(x => x > 2);
```

## 14. BinarySearch(T item)
ソートされたリストで指定した要素を二分探索法で検索する．見つからなければ負の値を返す．
```C#
numbers.Sort();
int foundIndex = numbers.BinarySearch(3);
```
Kaggle NotebookでGoogle Cloud PlatformのGPUインスタンスをデプロイする

# 1.何でそんなことするの？
Colab pro+に課金したのですがGPUの枠を使い切ってしまいました。Googleが提供するGPUリソースを購入して使うことにしたので、その手順をメモしました。
めっちゃ簡単です。

# 2.手順
### 2.1 好きなKaggle Notebookを開いて「Upgrade to Google Cloud AI Notebooks」をクリック
![スクリーンショット 2024-06-23 17.39.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820324/44036121-931f-d784-e6c2-0957db5c7c7f.png)
「Continue」をクリック
![スクリーンショット 2024-06-23 17.41.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820324/5e99139a-c542-2be4-41a0-f9f0a68c8fff.png)


### 2.2 GCP画面に飛ぶので各種設定を行う
![スクリーンショット 2024-06-23 17.59.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820324/8a068d17-6f16-436a-bd10-d135f8fdd51c.png)

・リージョン
安いところを選びましょう。僕は台湾にしました。

・ゾーン
変える必要ないです。

#### 2.2.1 上記画面の丸で囲ったえんぴつマークを押します。
各種設定変えられますが、GPU使いたいだけならこの画面の「マシンの構成」だけ変更すれば良いと思います。
![スクリーンショット 2024-06-23 18.02.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820324/08875c2d-f045-b005-ecf2-68e7ffd2c770.png)
・GPUのタイプ
とりあえずGPUと使いたいならNVIDIA T4でOK
T4は他のV100,A100とかと比べると処理速度は見劣りしますが、価格や消費電力の面でコスパが良いという特徴があります。（参考↓）

https://zenn.dev/deepreneur/articles/0c72e0538a668c

・GPUの数：2個

1個でも全然良いと思います。2個にすると価格が1.6倍になりますが、処理速度は悲観的に見積もっても1.6倍以上にはなるだろうということで2個にしました。

・マシンタイプ：n1-standard-8（8cCPU、4コア、30GBメモリ）
Kaggle Notebookと同様にRAMの容量30GB欲しかったのでこれにしました。好きなやつでOKです。

### 2.3 「作成」をクリック
![スクリーンショット 2024-06-23 18.27.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820324/2251c096-6b92-64a2-4a97-089d85dce34b.png)

よし終わり！って思ったら、台湾人気すぎて無理でした。このあと東京、シンガポール、ムンバイ、オレゴンもダメで、結局ソルトレイクシティにしました。

![スクリーンショット 2024-06-23 18.30.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820324/49f20e94-c6a0-c3f4-c644-67e40d6d6818.png)

一応地域間での遅延時間一覧が書いてるリンク貼っときます↓

https://geekflare.com/google-cloud-latency/

FPSゲームみたいにリアルタイム性は今求めてないので、リソースに空きがある中で安いやつを選べばいいかなと思います。

### 2.4 完了！
「開く」をクリック
![スクリーンショット 2024-06-23 18.49.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820324/d094bc6a-213f-fb45-ab05-837c5bf42618.png)

「Confirm」をクリック
![スクリーンショット 2024-06-23 18.50.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820324/2875b31b-0b32-a661-1989-11a98b480a9c.png)

完了！
![スクリーンショット 2024-06-23 18.53.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820324/3f6b53e7-926e-d379-9c2c-6b375ece2f98.png)

ちなみにこの画面としてもう一回セッション繋ぎたかったらGCP上の下記画面から飛べます。
![スクリーンショット 2024-06-23 18.53.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820324/5e5e3ae4-e8ea-346b-1dc4-a069a4babede.png)

# 終わりに
以上のように、Kaggle Notebookから飛んで操作すると簡単にデプロイできます。画像コンペ等でリソースが足りなくなったらやってみてください。あともっと安い方法あったら教えてください、、、（切実）
[備忘録]EclipseでTomcatが起動できなかったときの対処

## 実行環境
- Eclipse Version: 2023-09 (4.29.0)
- Java 1.8.0_202
- Tomcat Tomcat10_Java21

## 発生した事象
TomcatでWebアプリケーションを実行中、突如下記のエラーが発生。
![Tomcat-Error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516167/989c4d86-a9b4-59d5-f157-21feef4cf5a3.png)

（ちゃんと考えてれば**突如**なんてことにはなり得ないんですが＾＾；）

## 原因
サーブレットのリファクタリングを行ったことでした。
1. `HogeCode.java`を`FooCode.java`に変更
2. アノテーションも`@WebServlet("/HogeCode")`から`@WebServlet("/FooCode")`に変更

※サーブレット名、アノテーション名に被りはありません。
　サーブレット名が他のサーブレットと同一の場合も同様の起動エラーが確認できます。

## 解決方法
`WEB-INF/lib`配下のweb.xmlの記載をお約束の`<?xml version="1.0" encoding="UTF-8"?>`と`web-app`タグ以外のものを全消去


## まとめ
Tomcatの起動が出来ない時に確認すること
1. サーブレット名に被りはないか
2. web.xmlに不必要な記述が残っていないか

> ちなみに、web.xmlはサーブレットを作った時に自動で作られていたっぽいです。
> リファクタリング等しなければそこまで問題になることではないかもしれません(未検証)
「[増補改訂]ビッグデータを支える技術」第４章と第５章を読んだ感想


# 「[増補改訂]ビッグデータを支える技術」第４章と第５章を読んだ感想

こんにちは！前回に引き続き、「増補改訂 ビッグデータを支える技術 ——ラップトップ1台で学ぶデータ基盤のしくみ」を読んだので、その感想をシェアしますね。今回は第４章と第５章についてお話しします。

## 第４章：ビッグデータの蓄積

### ファイルサイズの管理
ビッグデータの蓄積において、ファイルサイズの管理は重要です。ファイルが小さすぎると、多数のファイルを管理するオーバーヘッドが発生し、効率が悪くなります。逆に、大きすぎるファイルは扱いが難しくなるため、1MBから1GBの間くらいが推奨されています。小さいファイルは統合し、大きいファイルは分割することが効果的です。適切なファイルサイズの選定がシステムのパフォーマンスに影響する、大事なポイントだそうです。

### 書き込みの工夫
データの書き込みが増えていくと、プロセス時間とイベント時間の差異を考慮する必要があります。バルク型のデータとストリーミング型のデータの違いを理解し、定期的にまとめて書き込む工夫が求められます。例えば、バルク型データは一定の時間ごとに一括で処理し、ストリーミング型データはリアルタイムに逐次処理します。リアルタイムにデータを集めるにはメッセージブローカーを利用し、メッセージを欠損なく、重複なく送信し書き込みを完了させることが重要です。このため、Kafkaなどのメッセージングシステムを導入することが推奨されています。

## 第５章：ビッグデータのパイプライン

### ワークフロー管理とは
ビッグデータのパイプラインにおいて、ワークフロー管理ツールは欠かせません。タスクの実行に失敗するリスクを減らすために使われ、タスクを定期的に実行し、その結果を通知する機能を持っています。有名なツールとしては、Apache AirflowやLuigiが挙げられます。これらのツールは、データパイプラインの管理を簡単にし、トラブルシューティングを容易にします。

### 冪等性の重要性
冪等(読み方は「べきとう」)な操作（何度繰り返しても同じ結果になる操作）はデータ処理において重要です。例えば、SQLでテーブルを消してから作り直す操作は冪等な操作の一例です。しかし、現実には常に冪等なタスクを実装できるとは限りません。過去データを全て消すのは非効率で、予期せぬ性能の劣化を招く可能性があります。このため、テーブルパーティショニングを使って1日ごとなどの区切りで置き換えを行う工夫が必要です。具体的には、日次、週次、月次などのパーティションを設定することで、データの管理とアクセス効率を向上させることができます。

### バッチ型とストリーミング型のデータフロー
ワークフロー全体を冪等にするためには、バッチ型のデータフローとストリーミング型のデータフローの違いを理解することが重要です。バッチ型では定期的に大量のデータを処理し、ストリーミング型ではリアルタイムにデータを処理します。具体的な例として、バッチ型は夜間に大量のログデータを処理し、日中のレポート作成に利用されます。一方、ストリーミング型はリアルタイムでの株価分析やSNSのトレンド解析に使用されます。それぞれのフローに合わせた適切な管理が求められます。

### データパイプラインの実装例
この章では、実際のデータパイプラインの実装例も紹介されています。例えば、データソースからデータを収集し、データをクリーニングして変換し、最終的にデータマートにロードする一連の流れが解説されています。特に、データのクリーニングや変換では、PythonやSQLを使った具体的なコード例もあり、実践的な知識を得ることができます。

## 感想
この本を読んで、ビッグデータの蓄積とパイプライン管理について深く理解できました。特に、ファイルサイズの管理や冪等性の重要性について学ぶことができ、実際のデータ基盤の構築に役立てられると感じました。また、ワークフロー管理ツールの活用や具体的なデータフローの設計についても、多くのヒントを得ることができました。次回は、６章と７章に触れていきたいと思います。

今回もご覧いただきありがとうございました！
Databricks生成AIクックブック - 4.1. "品質"の定義: 評価セット

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

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

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


# 4.1. "品質"の定義: 評価セット

品質を計測するためには、キュレーションされたクエリーの代表的なセットと正解の回答、(オプション)収集されるべきサポート文書から構成される人間がラベル付けした評価セットを作成することをお勧めします。評価セットが正確にエンドユーザーの期待と要件を反映するように、このプロセスでは人間のインプットが重要となります。

:::note info
人間によるラベルのキュレーションは時間を要するプロセスです。質問*のみ*を含む評価セットの作成からスタートし、後で正解のレスポンスを追加することができます。[Mosaic AI Agent Evaluation](https://docs.databricks.com/ja/generative-ai/agent-evaluation/index.html)では、正解データなしにあなたのチェーンの品質を評価できますが、正解データを利用できるのであれば、回答の正確性のような追加のメトリクスを計算します。
:::

優れた評価セットは以下の特性を備えています:

- **代表的:** 当該アプリケーションがプロダクション環境で直面するであろう様々な種類のリクエストを正確に反映しています。
- **困難:** このセットは、モデルの能力を効果的にテストするために困難かつ多岐にわたるケースを含むべきです。理想的には、プロンプトインジェクションや、LLMに不適切なレスポンスを生成させようとする質問のように、攻撃的な例を含むことになります。
- **継続的に更新される:** このセットには、当該アプリケーションがプロダクションでどのように使用されるのか、インデックスされるデータが変化する特性、アプリケーションにおけるいかなる変更を反映するために継続的にアップデートされるべきです。

Databricksではあなたの評価セットは最低でも30の質問になること、理想的には100-200であることをお勧めします。ベストな評価セットは時間と共に数千の質問を保持することになるでしょう。

過学習を避けるために、あなたの評価セットをトレーニング、テスト、検証セットに分割することをお勧めします:

- トレーニングセット: 質問の約70%。最もパフォーマンスの高いものを特定するための全ての実験を評価する初回の試験で使用されます。
- テストセット: 質問の約20%。トレーニングセットで最もパフォーマンスの高かった実験を評価するために使用されます。
- 検証セット: 質問の約10%。実験をプロダクションにデプロイする前の最終の検証チェックで使用されます。

:::note info
[Mosaic AI Agent Evaluation](https://docs.databricks.com/ja/generative-ai/agent-evaluation/index.html)は、アプリケーションのアウトプットに対して、あなたのステークホルダーがフィードバックを提供できるようにするためのWebベースのチャットインタフェースを提供することで、評価セットの作成を支援します。チェーンのアウトプットとステークホルダーのフィードバックはDeltaテーブルに保存され、評価セットにキュレーションすることができます。サンプルコードを用いたハンズオンのハウツーのためのこのクックブックの実装セクションにある[評価セットのキュレーション](https://qiita.com/taka_yayoi/items/981604b85a998ddf9b07)をご覧ください。
:::

- [目次](https://qiita.com/taka_yayoi/items/36c51bce8f33a70cf204#%E7%9B%AE%E6%AC%A1)
- 前のセクション: [4. RAGの品質の評価](https://qiita.com/taka_yayoi/items/c7e549323b9fcbb9edec)
- 次のセクション: [4\.2\. パフォーマンスの評価: メトリクスが重要です](https://qiita.com/taka_yayoi/items/05f650df667ffca3e92d)

### はじめてのDatabricks

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

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
未経験者達による初めてのチーム開発


## はじめに
私は現在アプレンティスシップに参加中です。
その中で実際にチーム開発をする機会があったので、感じたことや学んだことをまとめていこうと思います。

## 開発の流れ
今回のテーマは「私たちに役立つものを作成せよ」でした。

開発の流れとしては以下の通りに実行しました。

1.アイデア決め
 2. 要件定義
3.設計、タスク出し
5.実装

では、それぞれ順を追って感じたことや学んだことをまとめていこうと思います。

### 1.アイデア決め
最初はアイデア決めです。

#### アイデア決めの方針としては

1.各々が抱えている課題を集める
2.アイデアを絞る（メンバー全員が抱えている問題か、既存のサービスで解決できない問題か、など）
3.対象ユーザー・課題・プロダクトが一致しているかを確認

といった順でアイデアを決めていきました。

#### この結果、
#### 課題：
私たちは毎日、学習進捗を[discord](https://discord.com/)に書き残しているが、サービスの構造上、自分が書いた内容を見直すことが難しく、日報を書いている意味があまりないのでは。

#### 解決策：
日々書いている日報を簡単に振り返ることができる、日報管理アプリを作る。

このようにして、アイデアを決めることができました。

### 2.要件定義
次に要件定義です。

要件定義の目的としては、メンバーのプロダクトイメージを明確にすることを目標にしました。
共通認識を合わせないと、無駄な工数が増えたり、期日直前に修正が必要だったりと大変なことになるのでここはしっかり決めようと心掛けました。


#### 肝心の機能の面は
一覧画面
・カレンダー形式
・週、月の合計時間を計算して一目で分かるように表示
・その月の目標を入力できる
・カレンダーの日付をクリックすると、詳細をモーダルウィンドウで表示
・自己評価に応じて、カレンダー枠内の色分け
・登録画面に遷移

登録画面
・日報に必要な項目のテンプレート（本日の学習時間、学習内容、明日の目標、自己評価、など）
・登録後一覧画面に遷移

これらを実装することを決定しました。

### 3.設計、タスク出し
次に設計タスク出しです。

設計に関しては
・業務フロー
・画面遷移図
・ワイヤーフレーム
・テーブル定義書
・技術アーキテクチャ

を行いました。

#### 設計の際に注意した点
要件定義と同じく、あとから作り直しが発生しないように、全体像を整理しておくことを目標にしました。
なので、自分はワイヤーフレーム作成を担当したのですが、コンテンツ、機能、動作が目的からズレていないか常に意識して作成しました。


\
タスク出しに関しては
・必要なタスクを洗い出し
・担当者の割り振り
・作業時間の見積もり

を行いました。

#### タスク出しの際に注意した点
・担当は機能単位で分ける
・作業時間の見積もりは30分単位で見積もり、4時間以上かかる作業はタスクをさらに分解する

この二点を意識しました。

しかし、結果的にはタスクの見積もりが甘く、4時間を超える作業もあったので、ここは反省点ですね、、

### 4.実装
いよいよ最後の実装に入りました。
実装期間は1週間という短い期間になります。
自分は主にフロントエンドのHTML,CSS,JavaScriptを担当しました。

##### 実装期間中よかった自分の動きとしては、
・HTMLが完成しないと進まない作業が多かったので、早急に作成する
・他人が見てもわかりやすいように、読みやすいコードを書く、コメント多用する
・レスポンスはできる限り早く返す
・自分の作業以外のことにも積極的に干渉する


##### 逆に悪かった点
・見積もっていた作業時間を超えることがあった
・ワイヤーフレームに抜け目があり、機能の追加が必要となった
・バックエンドに関しては把握しきれていない箇所があった

と個人的に色々ありましたが、積極的に行動してくれるメンバーのお陰もあり、無事に一週間で完成させることができました。

## 全体を通じての課題と解決策
・決めた時間以上にかかった作業が多かったので、タスクばらしは細かく行う

・テキストベースのコミュニケーションが多く、効率が悪い場面も多かったので、開発期間はボイスチャットも用いる

・メンバー間の共通認識が曖昧な時があったので、チーム会の議事録を取っていつでも確認できるようにする

・Gitのブランチが何用かわからなくなっていたこともあったので、発信側もわかりやすいように工夫をする。ブランチのREADMEなど。

## 感想
まずは、より良いプロダクトになるように協力してくれたチームメンバー全員に感謝します。
メンバー全員が初めてのチーム開発ということもあって、正直、チームとして、個人としての課題が多くあると実感しました。
しかし、チーム開発を通して個人としても、チームとしても伸びしろを感じました。
まだ、もう一度チーム開発があるとのことなので、
次回は今回の反省点を生かしてよりよいプロダクトを作りたいと思います。
iPhoneのオートメーション機能を用いてChatGPTにRSSの要約と解説をさせたい

iPhoneの処理は自動化することが可能です。
AIの情報収集は今までXを中心に行なっていたのですが、RSSフィードから最新の情報を取得するやり方も良いなと思い、方法をまとめます。

動画を参考にしてもらいつつ、オートメーションを組むに当たって若干補足が必要そうなところを情報としてまとめます。

## 実現したいこと

寝てる間、ChatGPTにAI関連の情報収集をしてもらいたい！
（ついでに易しく解説してほしい）

## 完成したフロー

https://www.youtube.com/shorts/VOi7k4G_KQw

## 補足情報

1. 通知の設定は、一番最後の通知アクション以外は全てオフにすること
（オートメーションの動作が通知で止まるため）
2. リストに設定するRSSのリンクはfeedlyなどと連携して設定した方が良いかもしれない
3. 処理のスキップやブレークはできない
4. 二重のネストまではできる。三重はできないかも…
5. Ask ChatGPTでエラーが出た場合はModelを選択していることが原因の可能性大
→しかしModelを選択しない場合、GPT3.5になってしまうためいただけない。要約の依頼程度なら特に問題はなかった。
6. RSSから記事を取得したいところだが、RSS上では記事の冒頭しか掲載されていない。RSSからURLだけ取得して、URLから記事を取得する流れを作ると解決できる。
7. メモへの追加はうまくいっているのか確認することが難しい。RSSとChatGPT、それぞれがうまくいかないとメモに情報が追加されないため

### おわりに

オートメーションはアクション単体を複製することができます。しかし、オートメーション全体を複製することができません。

プログラミング感覚で取り組むと絶望的に使いづらいので、レゴブロックで遊んでるんだと思い、童心に帰ることをお勧めします。
Laravel入門：LaravelでHelloWorldしてみよう!

# はじめに
こんにちは、Webエンジニアの岩田史門([@SI_Monxy](https://x.com/SI_Monxy))です！
今回はLaravelでのHelloWorldついて記事を書いてみました！
改善点や修正点があれば、コメントにて優しくご指導いただけると嬉しいです！！

# 概要
Laravelは、PHPで書かれたオープンソースのWebアプリケーションフレームワークで、開発効率を高めるための豊富な機能を備えています。本記事では、Laravelのインストール方法と、シンプルなWebアプリケーションを作成する手順を紹介します。

# 前提条件
- PHP 8.0以上
- Composer

# Laravelのインストール方法
## 1. Composerのインストール

LaravelはComposerを利用してインストールします。まだComposerがインストールされていない場合は、以下のコマンドでインストールしてください。
```bash
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer
```

## 2. Laravelのインストール
Composerを使ってLaravelをインストールします。
``` bash
composer global require laravel/installer
```
PATH環境変数にComposerのbinディレクトリを追加する必要があります。通常、以下の行を.bashrcまたは.zshrcに追加します。
``` bash
export PATH="$HOME/.composer/vendor/bin:$PATH"
```
設定を反映させるためにターミナルを再起動するか、以下のコマンドを実行します。
``` bash
source ~/.bashrc
```

## 3. 新しいLaravelプロジェクトの作成
以下のコマンドで新しいLaravelプロジェクトを作成します。

``` bash
laravel new myapp
```
作成したプロジェクトディレクトリに移動します。

``` bash
cd myapp
```

# シンプルなWebアプリケーションの作成
## 1. 開発サーバの起動
まずは、開発サーバを起動してアプリケーションの基本的な動作を確認します。

``` bash
php artisan serve
```
ブラウザでhttp://localhost:8000にアクセスすると、Laravelのウェルカムページが表示されるはずです。

## 2. ルーティングの設定
次に、ルーティングを設定します。routes/web.phpファイルを編集して、シンプルなルートを追加します。

``` php
Route::get('/', function () {
    return view('welcome');
});

Route::get('/hello', function () {
    return 'Hello, Laravel!';
});
```
/helloにアクセスすると、Hello, Laravel!というメッセージが表示されます。

## 3. コントローラの作成
コントローラを使って、もう少し複雑なロジックを処理します。以下のコマンドで新しいコントローラを作成します。

``` bash
php artisan make:controller HelloController
```
app/Http/Controllers/HelloController.phpを編集して、以下の内容を追加します。

``` php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    public function index()
    {
        return 'Hello from HelloController!';
    }
}
```
次に、routes/web.phpでこのコントローラを使うようにルートを設定します。

``` php
use App\Http\Controllers\HelloController;

Route::get('/hello', [HelloController::class, 'index']);
```
これで、/helloにアクセスすると、コントローラからのメッセージが表示されます。

## 4. ビューの作成
次に、ビューを作成してコントローラからデータを渡してみましょう。まず、ビューを作成します。resources/views/hello.blade.phpというファイルを作成し、以下の内容を追加します。

``` html
<!DOCTYPE html>
<html>
<head>
    <title>Hello</title>
</head>
<body>
    <h1>{{ $message }}</h1>
</body>
</html>
```
コントローラを編集してビューを返すようにします。

``` php
public function index()
{
    $message = 'Hello from HelloController!';
    return view('hello', ['message' => $message]);
}
```
これで、/helloにアクセスすると、ビューが表示され、Hello from HelloController!というメッセージが表示されます。

# まとめ
以上で、LaravelのインストールからシンプルなWebアプリケーションの作成までの手順を紹介しました。Laravelの豊富な機能を活用して、さらに高度なWebアプリケーションを開発していきましょう。

# 参考
- [Laravel 公式ドキュメント](https://laravel.com/docs/11.x)
- [Composer 公式サイト](https://getcomposer.org/)
- [PHP 公式サイト](https://www.php.net/)
テスト分析とは何か

# 想定読者
・テストケースを作ろうとしているが、何から始めればよいか分からない人
・「テスト分析って何？」という人

# 本記事のゴール
・テスト分析のゴールを知る
・テスト分析の進め方を知る

# 前提
ソフトウェア開発プロセスにおける単語の意味を確認する。
インプットとアウトプット、という用語ピンとこない人は
以下のリンク先で説明があります。ご参照ください。

https://qiita.com/MaiTana/items/9bb3426232e1dddecce7#%E5%A4%A7%E5%89%8D%E6%8F%90

# まずはテスト分析の前後の成果物を俯瞰
以下の図に大まかなテスト分析の前後の成果物をまとめている。
各用語は図の下で説明する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/3f13df1a-9d5a-45ef-8dfa-56e2bf27d7e1.png)


### テストベース
テストするシステムやアプリなどの要件を定義した資料がある。これをテストベースという。これは、テスト分析のインプットとなる。(※1)

### テスト条件
テスト分析のアウトプットである。何をテストするか、の記述。ただし、テストケースよりも漠然としており、テスト計画のテスト対象よりも限定的に記述される。
例：「ユーザーが正しい資格情報を入力した場合にシステムがログインを許可する。」ことをテストする。(※2)
さらに、テスト条件がテストケース作成時のインプットとなる。
つまり、テスト分析のゴールはテスト条件を導くことといえる。

# テスト分析のプロセス
さて、本題のテスト分析の中身の詳細を見ていこう。
以下の図にまとめている。なと、テスト分析のアウトプットを赤色にしている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/f56929cb-b24a-8cd6-1564-ce6ae6796592.png)

テストベースの欠陥を発見する
↓
テスト対象となる機能とテスト条件を導く
↓
テストベースの要素とテストする機能との間に、双方向のトレーサビリティを明記する

### テストベースの欠陥を発見する
テストベースの欠陥の例：要件定義書の文章が曖昧。行間を読ませる前提の文章。1000より値が小さい時にAする。→境界値1000は含む?含まない?
(※3)

### テスト対象となる機能とテスト条件を導く
テスト条件を特定し、それらをテストする優先度を設定する	
テスト条件を導きだすために、テストベースはテスト目的とともに分析する。

テスト目的の例：システムが業界の規制を遵守していることを確認する。機能が正常に動くことを確認する。(※4)

### テストベースの要素とテストする機能との間に、双方向のトレーサビリティを明記する	

- トレーサビリティとは
個々の成果物がお互いにどのように影響し合っているかを把握できるかどうかのこと。(※5)
例：要件定義の中の要件A--テスト計画のテスト対象A--テストケースNo.15~20　のように対応づけられていること。
- トレーサビリティを明記して何がうれしいのか？
テストケースNo.1でバグが発見された際に、それに紐づいたテスト条件がわかり、それがどの要件に紐づいているのかが分かる。それにより、バグの重大性やビジネスレベルでの影響範囲などが判断できる。


# テスト分析の開始基準
- テストベースはレビューに合格済みである。かつ、必要に応じて更新されている。
- 残りのテスト関連の作業を完了するための予算とスケジュールが確保されている。

# テスト分析のテクニック
### テスト技法を用いる
技法を使うことでテスト条件を特定しやすい。	
技法の例：リスクベースドテスト
これにより、重要なテスト条件が省略される可能性を低減する。
さらに、より明確で正確なテスト条件の定義をできる。

### テスト条件をステークホルダと一緒にレビューする
それにより、テストの目指すところについて共通認識を持てる。また、テストがプロジェクトのゴールと一致する作業だと理解してもらえる。

### テスト条件の詳細度は階層化する
以下は詳細度の階層化を示した図。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/3f39b1a6-45f1-3b34-4ceb-1e22d54b30fb.png)
このメリットは、抽象度の高い機能に対して、テスト範囲を十分に網羅できること。

### 品質リスクを参照する
品質リスクが定義済みであれば、それに対処するために必要なテスト条件を定義する。そのテスト条件とリスク項目を紐づけておき、テスト条件からリスク項目を参照できるようにする。
品質リスクとは、開発したソフトウェアを利用する際に、利用者の想定通りにソフトウェアが機能しないというリスク。(※6)
 
# テスト分析完了後の状態
以下の状態になっているのが望ましい。
テスト分析の担当者が、そのテスト条件に対してどのようなテストケースを設計するのがよいか、分かるようになっていること。

# 参考資料
※1 
[テストベース（test Basis） | ISTQB Glossary](https://istqb-glossary.page/jp/%E3%83%86%E3%82%B9%E3%83%88%E3%83%98%E3%83%BC%E3%82%B9-test-basis/)
※2 
[テスト条件](https://zenn.dev/devopsinqa/articles/bf22a964603ae0)
※3
[事例3：要件定義ドキュメントの漏れや 曖昧性の低減](https://www.ipa.go.jp/archive/files/000072725.pdf)
※4
https://www.jasst.jp/symposium/jasst12tokai/pdf/S01.pdf
※5
[トレーサビリティ確保におけるソフト開発データからの 効果検証 実施報告書](https://www.ipa.go.jp/archive/files/000026863.pdf)
※6
[品質リスク（プロジェクトリスク・プロダクトリスク）の許容度合い](https://www.qbook.jp/column/890.html)
バージョンに関する話

# ３つの数字を用いる付け方（例：3.1.4）: セマンティック バージョニング
参考資料：https://semver.org/lang/ja/

・セマンティック バージョニングの各数字の意味は？
　案件によって意味は異なると思いますが、よくある意味は以下だと思います。

　①メジャー
　　製品の根本的な変更がある場合
　②マイナー
　　機能追加などの比較的大きめの修正
　③パッチ
　　バグ修正などのちょっとした修正

# ４つの数字を用いる付け方（例：3.1.4.7）
　①メジャー
　　製品の根本的な変更がある場合
　②マイナー
　　機能追加などの比較的大きめの修正
　③リビルド
 　　小さめの機能追加など比較的小さめの修正
　④リビジョン
　　バグ修正などのちょっとした修正

# 記号など
・カナリアリリース（Canary Release）
　開発最新版、日々開発されているバージョンだが、安定していない可能性あり。
 
:::note info
カナリアリリースは、炭鉱でのガス漏れ事故を防ぐために、無臭ガスに敏感なカナリアを鳥かごに入れて炭鉱に持ち込んだ実験が由来とされる。
つまり、このバージョンを使う人間は哀れなカナリアになる覚悟がある人間ということだ。
:::

・α（アルファ） 
　開発初期のバージョン（バグが取り除ききれていない可能性あり）

・β（ベータ）
　機能が一通り正常に動作する状態だが、想定外の不具合などがある可能性あり。

・RC(Release Candidate), もしくはGM（Golden Master）
　致命的な問題が出なければ、このバージョンが正式版としてリリースされる。
 　正式リリース版直前の最後のβ版とも言える。
 
・Stable（安定版）
　一般に安定して使えるもの
【2024年6月】Rails7をWindows上で環境構築する方法


<b>「Railsをインストールできない」</b>

RailsはWebアプリ開発フレームワークで初心者にもわかりやすいと言われます。

しかし、環境構築で挫折する人が多いのも現状です。

今回はRailsをWindows11で開発できるセットアップを行います。

せっかく始めるのに、何もできないまま終わりたくないですよね。

動画でサポートしていきます。

YouTubeを活用してぜひ始めてみてください。

結論は、WSL2を使いましょう。


# YouTubeでの解説-2024年6月24日投稿

<iframe width="560" height="315" src="https://www.youtube.com/embed/6BinBlsg2kE?si=oh9-3xVK2o8wXIcR" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

### リンク先

WSL2

https://learn.microsoft.com/ja-jp/windows/wsl/install-manual

Homebrew

https://brew.sh/ja

### Railsのインストール
```
sudo apt update && sudo apt upgrade
sudo apt install -y autoconf bison patch build-essential rustc libssl-dev libyaml-dev libreadline-dev zlib1g-dev libgmp-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-dev uuid-dev make

#ここでbrewのインストール

echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> ~/.profile
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
brew install gcc ruby-build
brew install rbenv
echo 'eval "$(rbenv init -)"' >> ~/.profile
eval "$(rbenv init -)"
rbenv install 3.2.0
rbenv global 3.2.0
gem install rails --version=7.0.0
gem install bundler --version=2.4.1
```

### MySQLのインストール
```
brew install mysql@5.7
echo 'export PATH="/home/linuxbrew/.linuxbrew/opt/mysql@5.7/bin:$PATH"' >> ~/.profile
sudo vim /etc/wsl.conf
```
Vimでwsl.confを開いて下記のコードを入力後、[Esc] [ : ] [ w ] [ q ][ Enter ]で保存
```
[boot]
systemd=true
```
```
% brew services start mysql@5.7
% mysql.server status
```
### Rails7.0 App作成
```
rails _7.0.0_ new アプリの名前 -d mysql
```
databaseの作成
```
rails db:create
```


# WSL2について

Microsoft Linux 用 Windows サブシステムとは

https://learn.microsoft.com/ja-jp/windows/wsl/about

Railsで使用するWSL2とは、Linux 用 Windows サブシステムのことです。

RailsがLinuxで動くため、Windows上でLinux環境を用意する必要があります。

これは多くのWebサーバーがLinuxで設計されていることに起因しています。


MacはUNIXというLinuxのベースがあるので、Railsを使えます。

WindowsNTがベースの現代Windowsは直接Railsを使うことができません。

MicrosoftとUnixのお話

https://qiita.com/sutton/items/5b2b7e2e57b674abe4f5

私が勉強不足なので、このあたり本を探してみたいです。

# RailsAppの魅力

最大のメリットは、早くWebアプリ開発を体験できることです。

他の言語に比べてルールが統一され、初学者の助けになる情報が多いのも魅力です。


プログラミングにはなぜかわからない・動かないが必ず起きます。

そういうときに頼れる情報は継続するため不可欠です。

一つのプログラミング言語を学び始めると他のプログラミング言語にも様々な魅力が見えてきます。

私は高いところばかり見て足元がおぼつかない状態でした。下から積むとブレイクスルーはきっと起こります。

# まとめ

Railの環境構築がタイトルですが、YouTubeの補助文章になってしまいました。

:::note info
Rails7をWindowsで構築＝WSL2が便利
WSL2はLinuxコマンドが使える
Railsで手っ取り早くアプリ開発可能

:::
デザイン基礎(3)

# 1.概要
下記に引き続き、Udemyを視聴して学んだことを書いていきます。

- [デザイン基礎(1)](https://qiita.com/saburo555/items/e2f659376c3691cf67c8)
- [デザイン基礎(2)](https://qiita.com/saburo555/items/ec047901ccfb9d8ed77a)

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

# 2.タイポグラフィーの基礎

## 2.1.日本語の主要書体

### 2.1.1.明朝体

![明朝体の例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889120/f3e58f5a-1105-f510-17ac-27d02716bd21.png)
出典：[LETS](https://lets.fontworks.co.jp/fonts/718)

特徴：
- 縦線が太く、横線が細い
- 筆記体的な印象
- 高い可読性

用途：
- 長文テキスト（小説、論文など）

代表的なフォント：
- ヒラギノ明朝
- 游明朝
- 小塚明朝

### 2.1.2.ゴシック体

![ゴシック体の例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889120/697d967c-46cd-7314-07e7-20a86a7a0bb8.png)
出典：[LETS](https://lets.fontworks.co.jp/fonts/718)

特徴：
- 線の太さが均一
- 現代的な印象
- 高い視認性

用途：
- 見出し、タイトル
- デジタル表示

代表的なフォント：
- ヒラギノ角ゴシック
- 游ゴシック
- 小塚ゴシック

## 2.2.英語の主要書体

### 2.2.1.セリフ体（Serif）

特徴：
- 文字の端に装飾（セリフ）がある
- 伝統的、格式高い印象

用途：
- 長文テキスト
- 学術文書

代表的なフォント：
- Times New Roman
- Garamond
- Caslon

### 2.2.2.サンセリフ体（Sans-serif）

特徴：
- 文字の端に装飾がない
- モダンでクリーンな印象

用途：
- デジタル表示
- 広告、ポスター

代表的なフォント：
- Helvetica
- Arial
- Futura

## 2.3.フォントの多様性

### 2.3.1.書体とフォントの区別

- 書体：文字デザインの大まかな分類
- フォント：特定の書体のデジタル実装

### 2.3.2.フォントバリエーション

フォントには様々な変種があります：

- ウェイト（太さ）：Light, Regular, Bold など
- スタイル：Italic, Condensed, Extended など

これらの組み合わせを「ファミリー」と呼びます。

![フォントファミリーの例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889120/bdae0e3c-0666-f300-b1a2-97883657d3f9.png)

## 2.4.特殊書体

- 装飾的書体：見出しやロゴに適した独特のデザイン
- 筆記体：手書き風の柔らかい印象
- ディスプレイ書体：大きなサイズでの使用に適した目立つデザイン

## 2.5.文字サイズの単位

- Q（級）：0.25mm単位。日本の印刷業界で一般的
- ポイント（pt）：約0.3528mm。デジタルデザインで広く使用

## 2.6.フォント技術

| 特徴 | OpenType | TrueType |
|------|----------|----------|
| 文字セット | 豊富 | 限定的 |
| クロスプラットフォーム互換性 | 高い | 低い |
| PDF埋め込み | サポート | 制限あり |

OpenTypeは現代的なフォント形式で、より多くの機能と互換性を提供します。

# まとめ
フォントは多くあり、あまり区別を意識することができていなかったが、自身の中で言語化されていなかった使いわけが明確にされ、今後意識して、使い分けを検討することができそうと思いました！

まだまだ基礎理解なので、ちょっと退屈ではあるが、アウトプットを生み出すための土台は少しずつ作れている気がします...!