OmniAICreator/Qiita-1.07M huggingface dataset:
レビューの質を高めて、仕様の漏れや欠陥を指摘できるようになろう

# はじめに
★[ソフトウェアテストの小ネタ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/software-testing-koneta) 23日目


私の所属するチームは、QAが計画段階のレビューで仕様の漏れや欠陥を指摘し、チームに貢献する割合がとても大きいと思っています。
レビュー活動は担当者の経験やスキルがものをいう面もありますが、この記事では、レビューのときにできる「行動」は何か？に焦点を当てました。
まだ「レビューで欠陥を検出する」がピンと来てないよ、という方に読んで頂き、少しでも何か伝えられたら嬉しいです。

### こんな人に読んでほしい
- レビューでチームにGiveしていきたい！
- 漏れや欠陥をスマートに指摘して一目置かれたい！
- だけど、どう気付けばいいのか分からない…
- 後輩を良いレビュアーとして育てたい！
- テスト分析やレビューが大好き！（共感求む）

また、この記事では「既存の製品に機能追加や仕様変更を行う」場合を想定しています。
新製品のテストだと当てはまらないことも多いかもしれません・・・　ご承知おきください。


# 本題
レビューにより漏れや欠陥を検出するためには、とにかくレビュ―対象（仕様）について深く理解することが大事です。
これを踏まえ、私がレビューの際に意識していることは以下の3つです。

**1. まずは、現行仕様について理解する**
**2. 実際の画面や機能イメージに置き換える**
**3. 残った情報を整理し、管理する**


### まずは、現行仕様について理解する
成熟したプロダクトの要望対応では「独立した新しい機能を付ける」よりも「現行の機能に何かを付け加える」、もしくは「現行の機能の一部仕様を変更する」ケースが多いと思います。

まずは現行の仕様と向き合いましょう。
追加や変更の内容が腹落ちしやすくなりますし、何より、のちのち現行仕様との不和や矛盾を発見するために必要な工程です。

実際の動作確認だけでなく、仕様について十分なドキュメントがある場合は一度確認しておきたいです。「何そのマニアックな仕様？」となること請け合い。
プロダクトに慣れている方も油断なさらず。過去にテストした機能でも、細かな仕様については意外と忘れていたりするものです。

### 実際の画面や機能イメージに置き換える
ここから追加や変更の内容を紐解いていくわけですが・・・
みなさんは、どのような形で対応内容について知らされることが多いですか？しっかりした仕様書は渡されますか？

以下は私がよく観測するケースです。
テスト担当にはペラ紙が渡されます。そこには現行画面にオートシェイプを貼り付けた雑な画面イメージが数枚と、申し訳程度に以下のような一文が書いてあります。
- 商品のレビューができるようにする。
- 商品の「あとで買う」登録ができるようにする。
（私の関わっているプロダクトの例だとイメージし辛いと思うので、ECサイトで置き換えた例になります）

・・・これは少し極端な例だったかもしれませんが、
開発サイクルの序盤で作成されるドキュメントには、本当に”概要”レベルの機能説明や、（機能そのものでなく）機能により得られる"価値"しか記載されていないことがあります。

具体的な操作フローを頭の中で再現し、手が入る（or入りそうな or入るべき）箇所を洗い出し、言語化していきましょう。
文言やEnabled変化などの細かい仕様まで確認するのは大変なので、製品マニュアルが作成できるくらいの粒度を想定すると良いです。

「あとで買う」登録の例で考えてみます。
> ・商品の個別ページに「あとで買う」登録ボタンを設置する。
> ・登録した商品はどのように確認する？
>　　・「あとで買う」リストを表示する新規の画面を作成する？
>　　・商品カート内で参照できるようにする？
> ・「あとで買う」登録後、解除したい場合はどのようなフローになる？
> ・「あとで買う」登録後、購入したい場合はどのようなフローになる？
> ・「あとで買う」登録済みの商品を購入したとき、自動で解除されたりする？　・・・

「全くイメージが湧かない」「こういうことなのかな？」「ここも変化するべきだよね？」「この仕様駄目じゃね？」など、不明瞭な点が出てきた場合は確認を取ってください。

確認を進めていく中で、こう言われることがあります。

「確かに、この仕様だとまずいですね」
「それ、やらなきゃ駄目ですね」
「何その（現行）仕様？」
「想定漏れでした」

これが漏れや欠陥です。グッジョブです。
この時、今後の判断やアクションの助けになる情報を懐から出せると、更にシゴデキですね。

この洗い出し作業→確認作業を繰り返し、対応内容の全貌が見えてきたら、いったんレビューは終わりです。

### 残った情報を整理し、管理する
上記の作業が一通り終わると、手元には以下の情報が残ると思います。
- 決まったこと
- 決まっていないこと
- まだ確認を取っていないこと

これをそのままにしておくと、
- 決まったことが実装担当者や要求保持者に伝わっていない
- いつまでも決められずに放置される
- 確認しなければならないことを忘れる

・・・このような悲しい事態になる可能性があります。

残った情報を整理し、今後きちんと処理されるよう管理していきましょう。

チームの状況や規模にもよりますが、スプシやLoopなどのチームで共有の場に投げ、全員で管理してしまうのもお勧めです。



## あとがき
- なんだろう・・・「長い」「薄い」「分かり辛い」内容になってしまった気がしています。軽い気持ちで参加しましたが、想定していたより大変な作業でした。コンスタントにアウトプットされている方の凄さを実感します。定期的なアウトプットのトレーニングが必要ですね。
- 早期の欠陥検出により「GJ！」「ありがとう！」と言われる瞬間は、QAとして非常に喜ばしく、自信に繋がるものです。そのため、経験の浅い人にこそ、レビューに挑戦してほしいと思います！
- 読んで頂き、ありがとうございました！！

https://qiita.com/advent-calendar/2024/software-testing-koneta
【Java】Spring Bootの環境構築

## はじめに
Spring Bootの開発環境を構築したので、その際の手順を初学者向けにまとめていきます。
今回は最小限の動作確認として画面が開ければOKとし、DB接続等は省きます。

## 環境
windows11
Java 21
Spring Boot 3.4.1
Maven 3.9.9
Thymeleaf 3.1.3

## eclipseの導入
ここからインストール
>https://willbrains.jp/

今回は最新版(2024)をインストールします。
色々手間を省いていきたいので今回はFull Editionを選びました。
7zipで解凍しておきます。

![pleiadesインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967914/7cf29e57-d5d2-dd91-e85a-22f4519f1cac.png)

## JAVA_HOME
解凍したフォルダのjava配下に「set-JABA_HOME-21.cmd」というスクリプトファイルがあったので実行します。
これだけで環境変数をいじってくれるみたいです。


## プロジェクトの作成
eclipseを開いて新規Springスタータープロジェクトを作成します。
![pj作成手順①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967914/fb7dd525-784b-fb46-e2e9-c2498023df5c.png)

Java バージョンが21になっていることを確認します。
今回はビルドツールだけmavenに変更しました（筆者の好みです）
依存関係は後から変更すればよいので一旦このまま完了します。

![pj作成手順②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967914/79e82f8e-52a3-36d2-2c46-1774d3c091ac.png)

![pj作成手順③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967914/ad561691-b30b-2bac-3ba5-7bdd0cf68676.png)


## Controllerと画面を作成
* DemoController.java
画面遷移の処理をするコントローラークラスを作成します。
Controllerアノテーションはこのクラスがコントローラークラスであることを示し、HTMLなどのビューを返す場合に使います。JSONなどを返すRestControllerアノテーションと混同しないようにしましょう。
GetMappingアノテーションはHTTPのGETリクエストを処理するためのアノテーションです。下記ソースコードの場合は/demoへのリクエストを処理します。GetMappingの他にもPostMapping、DeleteMapping、RequestMappingなど色々あるので適宜使い分けます。

```java
package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class DemoController {
	
	@GetMapping("/demo")
    public String demo() {
        return "demo/demo";
    }
}
```

* demo.html
src/main/resources/templatesの下にdemoフォルダを作成し、その中にhtmlファイルを置いておきます。
今回は画面表示さえできれば良しとしていますので、中身は簡単に記載しています。

```html
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>確認</h2>
	<p>demo</p>
</body>
</html>
```

* pom.xml
thymeleafを依存関係に追加します。
プロジェクト作成時点でthymeleafを依存関係に追加するよう設定しておくことで、pom.xmlに自動で記述してくれます。
```xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
```

## 動作確認
Spring Bootアプリケーションを実行します。
この時コンソールにエラーが出ていないことを確認します。
![pj作成手順⑤.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967914/c60fa202-cc9b-f96d-147a-d8fdff3b47c6.png)

ブラウザで確認
　→OK
http://localhost:8080/demo
![demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967914/3695bd49-5cb0-6c02-96d0-baf54f295994.png)

## あとがき
初めてSpring Bootを触る人にとって少しでも参考になれば幸いです。
今後Thymeleafの使い方やMybatisを使ったDB操作等もまとめていけたらと思います。
Datadog APM 取り込み〜可視化の一連の流れとリンクまとめ

Datadog APMを学ぶなかで、
APMでのデータの流れのわかる図が公式ドキュメントにあったので、各フェーズに該当するドキュメントリンクと簡単な説明を整理してみました。理解が薄い項目もあるので今後加筆する可能性もあります。

# 前提知識

以下の用語だけ理解していれば流れは追えると思います。

- [トレース](https://docs.datadoghq.com/ja/tracing/glossary/#trace)：１つのリクエスト/トランザクション全体を表し、複数のスパンで構成される
    - 例：
- スパン:特定の期間における分散システムの論理的な作業単位
    - 例：
- [メトリクス](https://docs.datadoghq.com/ja/metrics/)：環境に関するあらゆる情報を時系列で追跡できる数値
    - 例：レイテンシー、リソース利用量/利用率、エラー発生数/率


これ全体が１つのトレース。トレース内の帯がスパン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/3c771c32-b064-eec3-4b47-d48358408bc7.png)




参考
[Datadog::用語集](https://docs.datadoghq.com/ja/glossary/)
[Datadog::APM の用語と概念](https://docs.datadoghq.com/ja/tracing/glossary/)
[Datadog::APM::トレースビュー](https://docs.datadoghq.com/ja/tracing/trace_explorer/trace_view/)


# 全体の流れ
https://docs.datadoghq.com/ja/tracing/trace_pipeline/ の図に対して番号をつけています。

![Untitled(1) (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/f4f01a14-af88-e891-2798-b57102715c7e.png)

# ① Your instrumented applications
https://docs.datadoghq.com/ja/tracing/trace_collection/
アプリからDataDogへのデータ送信
エージェントをインストールしたり、トレーシングライブラリを利用することでアプリからDatadogへデータ送信する。

# ② Ingestion Sampling rules
https://docs.datadoghq.com/ja/tracing/trace_pipeline/ingestion_mechanisms/
アプリから送られてきたもののうちどれを取り込むかルールに従ってサンプリングを行う。
デフォルトのルール([ヘッドベースサンプリング](https://docs.datadoghq.com/ja/tracing/trace_pipeline/ingestion_mechanisms/?tab=java#%E3%83%98%E3%83%83%E3%83%89%E3%83%99%E3%83%BC%E3%82%B9%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0))が用意されているが、エージェントやトレーシングライブラリのオプションでサンプリング方法はカスタムできる。

# ③ 15mins Live Search
https://docs.datadoghq.com/ja/tracing/trace_explorer/?tab=%E3%83%AA%E3%82%B9%E3%83%88%E8%A1%A8%E7%A4%BA#15-%E5%88%86%E9%96%93%E3%81%AE-live-search

 取り込まれた全てのスパンは15分間利用可能

# ④ Metrics from Span
スパンからメトリクスを生成する
https://docs.datadoghq.com/ja/tracing/trace_pipeline/generate_metrics/

# ⑤ Retention filters
どのスパンをインデックス化して保持するか
https://docs.datadoghq.com/ja/tracing/trace_pipeline/trace_retention/

# ⑥ 15 days Indexed Search
インデックス化されたスパン(15日保持)の利用
https://docs.datadoghq.com/ja/tracing/trace_explorer/?tab=%E3%83%AA%E3%82%B9%E3%83%88%E8%A1%A8%E7%A4%BA#15-%E6%97%A5%E9%96%93%E4%BF%9D%E6%8C%81%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E3%82%B9%E3%83%91%E3%83%B3%E3%81%AE%E6%A4%9C%E7%B4%A2


# ⑦ Trace Analytics monitors Dashboards, Notebooks
トレースデータの視覚化、解析をするためのツールやサービス、レポートについて記載
https://docs.datadoghq.com/ja/tracing/services/
UIテスト自動化ガイドライン：ベストプラクティスに沿ったテストスクリプトを作成する

E2E/UIテスト自動化においてテストを作成するうえで、一般的に保守性やメンテナンス性などを考え、ガイドラインなどを用意するかと思います。

テスターがガイドラインに従ってテストスクリプトを作成後、レビュアーがレビューをおこない、テスターが修正します。しかしながらレビューに人手が入ることでレビュー漏れが発生してしまうことや、レビュー自体にコストが掛かるといった問題もあります。

UIテスト自動化ツールである[**Ranorex**](https://ranorex.techmatrix.jp/ "Ranorex特設サイト")では、[**Ranorex Coach**](https://ranorex.techmatrix.jp/blog/2022/04/28/ranorex_coach/ "Ranorex Coach")機能が実装されており、テストの設計におけるベストプラクティスに従うためのヒントをレポートしてくれます。このヒントには、テストを改善するためのTIPSが含まれています。

Ranorex Coachには、理想的なテストを作成するために、以下のTIPSが用意されています。
テスト作成時に、これらのTIPSから外れたテストを作成した場合、Ranorexが自動で問題点を指摘してくれます。

## テストスイートに関するTIPS
テストをどのように実行するかを構成するテストスイートに関するTIPSになります。

* **ネストされた条件分岐/データソースの継承**
テストスイートが複数のテストコンテナー（テストケース、スマートフォルダー）でネストされた条件分岐/データソースを使用している場合に指摘されます。

</br>

* **空のテストコンテナ**
テストスイートに配置されたテストコンテナ（テストケース、スマートフォルダー）において、何も設定されていない無駄なテストケースやフォルダーが配置されている場合に指摘されます。

</br>

* **Setup/Teardown領域が設定されていないテストケース**
テストケースでSetup（前処理）/Teardown（後処理）が無い場合に指摘されます。

</br>

* **説明がないテストコンテナ**
テストコンテナ（テストケース、スマートフォルダー）に説明がない場合に指摘されます。

</br>

* **デフォルト名のデータソース**
指定されたデータソースの名前がデフォルト名（NewConnector）の場合に指摘されます。

</br>

* **TestRunの未使用**
テストスイートで、チェックボックスが無効（テスト実行対象外）となっているテストコンテナー（テストケース、スマートフォルダー）があるにも関わらず、TestRunが設定されていない場合に指摘されます。


## レコーディングモジュールに関するTIPS
テストスクリプト（レコーディングモジュール）の作成に関するTIPSになります。

* **空のレコーディングモジュール**
アクションが指定されていない空（意味のない）のレコーディングモジュールがある場合に指摘されます。

</br>

* **30個以上のアクションが含まれるレコーディングモジュール**
アクションの数が30個以上含まれるレコーディングモジュールがある場合に指摘されます。

</br>

* **マージ可能なKey sequenceアクションがあるレコーディングモジュール**
マージが可能なKey sequenceアクションがある場合に指摘されます。

</br>

* **入力値が読みにくいKey sequenceアクション**
テキスト以外（キーストローク値を含む）の値を設定しているKey sequenceアクションがある場合に指摘されます。

</br>

* **レコーディングモジュール中の無効化されたアクション**
無効化されているアクションがある場合に指摘されます。

</br>

* **リポジトリアイテムとリンクされていないアクション**
リポジトリアイテム（オブジェクト）とリンクしていないアクションがある場合に指摘されます。

</br>

* **直前にDelayアクションが配置されているValidationアクション**
Validationアクションの前に待ち時間としてDelayアクションを使用している場合に指摘されます。

</br>

* **絶対パスが指定されているRun applicationアクション**
テスト対象アプリケーションの指定で絶対パスを設定しているRun applicationアクションがある場合に指摘されます。

</br>

* **ネットワーク ドライブが指定されているRun applicationアクション**
ネットワークドライブにあるテスト対象アプリケーションを設定しているRun applicationアクションがある場合に指摘されます。


</br>

* **Mouse down/upアクションの順序が逆のレコーディングモジュール**
down/upの設定順序が逆になっているMouseアクションがある場合に指摘されます。

</br>

* **Mouse wheelアクションが含まれるレコーディングモジュール**
Mouse wheelアクションを使用している場合に指摘されます。

</br>


## リポジトリに関するTIPS
オブジェクト（リポジトリ）に関するTIPSになります。

* **Search timeoutが長すぎる/短すぎるリポジトリアイテム**
リポジトリアイテムのプロパティで、検索タイムアウト（Search timeout）が10秒未満または5分を超えた値を設定している場合に指摘されます。

</br>

* **ルートフォルダーでの変数の使用**
ルートフォルダーで設定しているRanoreXPathに変数を使用している場合に指摘されます。

</br>
React/vite環境でSCSSを使うための設定

### インストール
```bash
npm add -D sass-embedded
```

### vite.config.tsの設定
```diff_tsx
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import tailwindcss from "tailwindcss";

// https://vite.dev/config/
export default defineConfig({
  plugins: [react()],
+  css: {
+    preprocessorOptions: {
+      scss: {
+        api: "modern-compiler",
+      },
+    },
    postcss: {
      plugins: [tailwindcss()],
    },
  },
});

```
Java初心者必見！「クラス・メソッド・フィールド」を小学生にもわかる例で解説

Javaを学び始めると、**クラス**、**メソッド**、**フィールド**という用語が出てきますが、「なんだか難しそう」と思ったことはありませんか？

この記事では、**人を作る設計図**を例にして、これらの基本的な概念を初心者にもわかりやすく解説します！

---

## 完成したコード

以下のコードは、クラス・メソッド・フィールドの基本を一つにまとめたものです。

```java
public class Person {
    // フィールド（データを入れる箱）
    String name; // 名前
    int age;     // 年齢

    // コンストラクタ（人を作るときに名前と年齢を決める方法）
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // メソッド（人が自己紹介する方法）
    public void introduce() {
        System.out.println("こんにちは！私の名前は " + name + " です。年齢は " + age + " 歳です。");
    }

    // メインメソッド（プログラムの始まり）
    public static void main(String[] args) {
        // 人を作る（オブジェクトを作成する）
        Person person1 = new Person("しずく", 10);
        Person person2 = new Person("たろう", 12);

        // 自己紹介をする
        person1.introduce();
        person2.introduce();
    }
}
```

---

## コードの動作を説明

### 1. **クラス**
```java
public class Person {
    ...
}
```
クラスは**設計図**です。この例では「人」を作るための設計図です。

---

### 2. **フィールド**
```java
String name; // 名前
int age;     // 年齢
```
**フィールド**は、人が持っているデータを入れる箱です。  
ここでは「名前」と「年齢」を表します。

---

### 3. **コンストラクタ**
```java
public Person(String name, int age) {
    this.name = name;
    this.age = age;
}
```
**コンストラクタ**は、人を作るときに名前と年齢を設定する方法です。  
たとえば、「しずく」という名前の10歳の人を作る場合、このコンストラクタが使われます。

---

### 4. **メソッド**
```java
public void introduce() {
    System.out.println("こんにちは！私の名前は " + name + " です。年齢は " + age + " 歳です。");
}
```
**メソッド**は、人ができることを定義します。この例では、「自己紹介をする」という動作を表します。

---

### 5. **オブジェクト**
```java
Person person1 = new Person("しずく", 10);
```
**オブジェクト**は、設計図（クラス）を使って作られた実際の「人」です。この例では、「しずく」という名前の10歳の人を作りました。

---

### 実行結果

```plaintext
こんにちは！私の名前は しずく です。年齢は 10 歳です。
こんにちは！私の名前は たろう です。年齢は 12 歳です。
```

---

## 小学生でもわかるまとめ

- **クラス**: 設計図  
- **フィールド**: 名前や年齢を入れる箱  
- **コンストラクタ**: 名前と年齢をセットする仕組み  
- **メソッド**: 自己紹介する動作  
- **オブジェクト**: 実際に作った人  

---

## おわりに

この記事のコードを実際に書いて動かしてみることで、Javaの基本がよく理解できるはずです！
Ruby プロジェクトを Steep で型チェックできるようにするために必要なこと

# はじめに

先日、Ruby のプロジェクトを Steep で型チェックできるようにしたのですが、必要な知識や手順がそこそこあったので、それらをまとめました。

:::note info

全体像が知りたい方向けの記事です。手順の詳細などはかなり省いています。

この記事を読んでほしい人：

- 過去の自分
- 型チェックできるようにしたいけど、何からやればいいかわからない人

:::

# 知識

RBS, gem_rbs_collection, steep のそれぞれについてある程度知識があると、スムーズに型チェックを導入できます。それぞれ簡単に説明します。

## RBS

RBS は Ruby 3.0 で追加された Ruby で型を扱うための機能です。



少しややこしいですが、Ruby の型を記述するための記法としての「RBS言語」があり、その記法で書かれた型情報のファイルが「RBSファイル」（拡張子は `.rbs`）、そして、それらを処理する `rbs` gem や `rbs` コマンドがあります。

## gem_rbs_collection

様々な gem の RBSファイル（型情報）がまとまっている以下のリポジトリです。

https://github.com/ruby/gem_rbs_collection

TypeScript における [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) のようなものです。
プロジェクトで使用している gem の型が欲しいときに使用します。

## Steep

RBSファイルに書かれた型情報を使って型チェックを行うツールです。

https://github.com/soutaro/steep

# 手順

上記で説明した通り、Steep で型チェックを行うためには、型情報が書かれたRBSファイルが必要です。

そのため、型チェックできるようにするためには「必要なRBSファイルの準備」と「Steepが RBS ファイルを認識するように設定」が必要です。それぞれ説明していきます。

## 必要なRBSファイルの準備

型の情報が書かれたRBSファイルは、「標準ライブラリの型」「プロジェクトで使用している gem の型」「自分が書いたプログラムの型」それぞれ異なる場所にあります。

- 標準ライブラリの型
    - rbs gem で定義されていて、rbs gem が Ruby に含まれています。
        - [rbs/core at master · ruby/rbs](https://github.com/ruby/rbs/tree/master/core)
- プロジェクトで使用している gem の型
    - gem 側で定義されている場合は `bundle install` のときに一緒にインストールされます。
    - gem 側で定義されていない場合でも gem_rbs_collection にあれば、それを使うことができます。
    - 自分でRBSファイルを作成することも可能です。
- 自分が書いたコードの型
    - 自分で生成する必要があります。
    - 生成の方法は `rbs prototype` コマンド、[TypeProf](https://github.com/ruby/typeprof)、[rbs-inline](https://github.com/soutaro/rbs-inline) など、様々です。
        - RubyKaigi 2024 で話題になった rbs-inline は個人的におすすめです。

## Steep が RBS ファイルを認識するように設定

steep gem をインストールしたのち、`steep init` を実行すると、 `Steepfile` というファイルが生成されます。このファイルに設定を書いていきます。

```ruby
target :lib do
  signature 'sig'

  check 'app'

  library 'time'
  library 'uri'
end
```

主に以下を設定します。

- `signature`
    - 生成したRBSファイルが置いてあるディレクトリを指定します。
- `check`
    - Steepで型チェックしたいRubyのコードが含まれるディレクトリを指定します。
- `library`
    - 組み込みライブラリ以外の標準ライブラリを使う場合、そのライブラリの型を使ってチェックするために必要です。
        - 例: `Time.now` は組み込みライブラリなので `library` の指定は不要。 `require 'time'` することで使えるようになる `Time#iso8601` は `library 'time'` を書かないと、型を使用できない。
    - （プロジェクトで使用している gem を `library` に指定する方法もあるっぽいです）
        - gem_rbs_collection を使っている場合は不要かも？
        - 使い方がわかったら追記します。

Steepfile が適切に設定できていれば、`steep check` で型をチェックできます。

# おわりに

自分が開発していた Ruby プロジェクトでようやく `steep check` コマンドが動くようになったので、現時点で理解した内容をまとめました。追加でわかったことがあったら追記します。
Vertex AI Vector Search の入力データ形式 (JSON ver.) はこれだ！

以下のようにすれば ok です。
```json-doc
{"id": "1", "embedding": [0.1, 0.2], "restricts": [{"namespace": "color","allow": ["white", "black"]}, {"namespace": "category","allow": ["t-shirts"]}], "crowding_tag": "basic"}
{"id": "2", "embedding": [0.3, 0.1], "restricts": [{"namespace": "color","allow": ["blue"]}, {"namespace": "category","allow": ["pants"]}], "crowding_tag": "casual"}
// ...以下略...
```

### P.S. 
公式ドキュメントを読んでも正しい入力データ形式を把握できなかったため、複数の形式を試し、最終的に正しい形式を把握しました。
ちなみに公式ドキュメントでは `restricts` 配列内の各要素に `crowding_tag` をセットするような書きっぷりになっているものの、そんなことはありませんでした。
![スクリーンショット 2024-12-23 18.29.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969458/ac5531be-9945-9ceb-55f9-56d8d48b67f1.png)
ref: https://cloud.google.com/vertex-ai/docs/vector-search/setup/format-structure?hl=en#data-file-formats

さらに公式のサンプル実装ではなぜか `allow` が `allow_list` となっていたので修正しておきました。
ref: https://github.com/GoogleCloudPlatform/vertex-ai-samples/pull/3500

また Vector Search 関連の terraform plugin にバグがあったので、こちらも修正しておきました。
ref: https://github.com/GoogleCloudPlatform/magic-modules/pull/12637
CDSビューのアノテーション確認プログラム

## 1．データ抽出可能なCDSビューの探し方
以前データ抽出が可能な標準のCDSビューの探し方をネット上で探していたところ次の記事に当たりました。

https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/%E3%83%87%E3%83%BC%E3%82%BF%E6%8A%BD%E5%87%BA%E5%8F%AF%E8%83%BD%E3%81%AAcds%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AE%E6%B4%BB%E7%94%A8%E6%96%B9%E6%B3%95/ba-p/13535057

どうやらデータ抽出可能なCDSビュー(I_DATAEXTRACTIONENABLEDVIEW)があるようなのでSQLビュー(IXTRCTNENBLDVW)をビューブラウザから見ればデータ抽出可能なCDSビューが探せそう。
でしたがよくよく見てみると「S/4HANA 2020」かららしい… 
ダメだバージョンが違う…… 使えない………

## 2．CDSビューアノテーション表示プログラム
無いなら作ってしまえということでデータ抽出可能なCDSビューを探すプログラムを簡単に作ってみました。
ただ抽出可能なCDSビューが分かるだけだと面白くも無いのでCDSビューのヘッダに設定されているアノテーションも表示できるようなプログラムにしてみました。
以下、ソースコードです。
~~~
REPORT YCDS_ANNOTATION_DISP.

TYPES:
  BEGIN OF TY_HANNO,
    STRUCOBJN TYPE DDSTRUCOBJNAME,
    DBTABNAME TYPE TABNAME,
    NAME      TYPE DDANNOTATION_KEY,
    POSITION  TYPE DDFDPOS,
    VALUE     TYPE DDANNOTATION_VAL,
  END OF TY_HANNO.

DATA:
  IT_HANNO TYPE TABLE  OF TY_HANNO,
　IT_TABLE TYPE REF TO CL_SALV_TABLE,
  WK_STRU  TYPE DDSTRUCOBJNAME,
  WK_DNAME TYPE TABNAME,
  WK_ANNO  TYPE DDANNOTATION_KEY.

SELECT-OPTIONS:
  S_STRU FOR WK_STRU NO INTERVALS,
  S_DNAME FOR WK_DNAME NO INTERVALS,
  S_ANNO FOR WK_ANNO NO INTERVALS NO-EXTENSION .
PARAMETERS: C_EXT AS CHECKBOX.

IF C_EXT IS INITIAL.
* ヘッダアノテーション情報取得
  SELECT A~STRUCOBJN,
          B~DBTABNAME,
          A~NAME,
          A~POSITION,
          A~VALUE
  FROM DDHEADANNO AS A
  INNER JOIN DD02BND AS B
  ON A~STRUCOBJN = B~STRUCOBJN
  WHERE A~STRUCOBJN     IN @S_STRU
  AND       B~DBTABNAME IN @S_DNAME
  AND       A~NAME      IN @S_ANNO
  INTO TABLE @IT_HANNO.
ELSEIF C_EXT IS NOT INITIAL.
* ヘッダアノテーション(抽出機能設定済みのみ)情報取得
  SELECT STRUCOBJN
     FROM DDHEADANNO
    WHERE NAME = 'ANALYTICS.DATAEXTRACTION'
    INTO TABLE @DATA(LIT_CNAME).
  SELECT A~STRUCOBJN,
          B~DBTABNAME,
          A~NAME,
          A~POSITION,
          A~VALUE
  FROM DDHEADANNO AS A
  INNER JOIN DD02BND AS B
  ON A~STRUCOBJN = B~STRUCOBJN
    FOR ALL ENTRIES IN @LIT_CNAME
    WHERE A~STRUCOBJN =  @LIT_CNAME-STRUCOBJN
  INTO TABLE @IT_HANNO.
ENDIF.

SORT IT_HANNO BY STRUCOBJN DBTABNAME POSITION NAME.

* ALV
CALL METHOD CL_SALV_TABLE=>FACTORY
  IMPORTING
    R_SALV_TABLE = IT_TABLE
  CHANGING
    T_TABLE      = IT_HANNO.

IT_TABLE->DISPLAY( ).
~~~
入力パラメータは
1. S_STRU(CDSビューID)
1. S_DNAME(SQLビューID)
1. S_ANNO(アノテーション)　※@を外した形式で入力
1. C_EXT(抽出可能なCDSビューの全表示)

となります。
目的は抽出可能なCDSビューなので「C_EXT」のチェックボックスにチェックを付けると抽出可能なCDSビューが全て表示されるようになってます。

実際に「C_EXT」のチェックボックスにチェックをして実行してみると
![PG1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/e40891a5-c761-5b2a-956a-d1f73944faf6.png)

![PG2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/487047c5-e725-de8d-0829-76168f5e4de5.png)

抽出可能なCDSビューのIDとSQLビューID、アノテーション、アノテーションのポジション(記載位置)そしてアノテーションの設定値がALVで表示されます。

また入力パラメータにCDSビューID・SQLビューID・アノテーションを設けたので特定のCDSビューのヘッダのアノテーションを見たり、CDSビューIDの一部を忘れてしまってワイルドカードを使って検索したりすることも可能です。
薄れていく記憶

薄れていく記憶
2024年1月1日に起きた能登半島地震はまだ皆さんの記憶にも新しいと思います。私も発生した時のことを今もまだ覚えています。 
仕事(夜勤)につくため、会社近くのコンビニで夜食を買っていたところ、突然店内の冷蔵庫が揺れました。そしてスマホに石川県で震度6強との通知。（のちに震度７）
大きな地震が起きたという認識はあったもののそのまま買い物を済ませ出勤ししばらくテレビを見ていたことはまだ鮮明に覚えています。
そして、その翌日には羽田空港で痛ましい事故。旅客機と災害派遣に向かう途中の海保機の衝突事故
能登半島地震ならびに翌日の航空機事故、豪雨災害でお亡くなりになられた方々に心からご冥福をお祈りします。

それから約1年が経とうとしています。
振り返るとわずか11ヶ月の間に様々なことがありました。
新年早々大地震に見舞われた能登半島も続く地震や豪雨被害があったり。山形県でも豪雨被害。
8月の宮崎県日向灘で起きた地震により「南海トラフ地震臨時情報」が発令されたことは記憶の片隅にありますか？
 備蓄の見直しが報道されたり、買い占めが起きたり。振り返ると記憶から薄れていることも少なくないと思います。

 ここまで読んで頂き記憶から無くなっていた方もいらっしゃるかと思います。
 そんな方はぜひこの機会に遠くない未来に来るであろう災害に備える機会にして
 もらえたらと思います。

そして見直されつつあるのが、ドローンの有効性です。
状況調査、広報誘導、物資搬送と様々な活用がなされた1年ではなかったでしょうか
能登半島でも被災状況調査のため数多くの機種が持ち込まれたと聞いていいます。
また土砂ダムの監視のためドローンドックを用いた定時自動飛行なども行われ
有事の際にこそ力を存分に発揮できることがわかりました。
ルールなどまだまだ課題は多いようですが、これから災害時にこそ
飛ばしやすい仕組みになることを願います。
そしてDRONEBIRDによるクライシスマッピングが多くの方の役に立てるように
平時の広報活動、訓練が積極的に出来るようにしなくてはと強く思った１年でした。
来年は防災、減災の一助になれる活動が少しでもできればと思います。
無人航空機操縦士国家資格を取って思うこと

無人航空機操縦士国家資格を取って思うこと
まず何より型式認証機が少なく、容易に買える価格でない。
次に更新など先のことが不透明である。
そして何より思うものが薬服用中の飛行が禁止。。。
解釈によっては眠気を起こすもの以外は良いような記載もありますが、
無人航空機に係る規制の運用における解釈には、医薬品も服薬時は飛行禁止とある。
では、花粉症や高血圧の薬やインシュリンなど服用していないと逆に具合が悪くなるようなものもあるが
一切禁止されている。花粉症の人が薬を飲まずドローンを飛ばすことがいかに危険か。おそらく操縦どころでは無い。
一方有人機のパイロットに対しては禁止薬品、服用可能薬品が分かれている。
有人機の運用マニュアルを無人機のベースとしてる節は感じるが、有人機より厳しく感じる。
服薬をする際はかかりつけ医に相談を勧める記事もあるが、航空身体検査を行わない医師に相談しても
すぐに返事を頂けのであろうか。。。
無人航空機操縦士の国家資格制度が始まり丸2年。色々と見直しや意見募集をして欲しいと思う今日この頃でした。
あんまり書くと、技能証明書返納と言われそうなのでこの辺りで・・・
snap で完全オフライン Ubuntu に docker 環境を作る方法のまとめ

# 背景
完全にオフラインな Ubuntu で Python を動かしたいという場面に遭遇しました。完全オフラインサーバなので pip も使えず、必要なモジュールをインストールすることは不能。そこでオンラインサーバでスクリプトをコンテナ化し、オフラインサーバでコンテナを起動する方法を考えたのですが、そもそもオフラインサーバなので docker のインストールもできず。

そこでオンラインサーバで docker の snap ファイルをダウンロードし、オフラインサーバにインストールする方法を試したとろ、上手くいったのでその方法のまとめです。

# オンライン Ubuntu でファイルをダウンロード
まずオンラインの Ubuntu で docker の snap パッケージをダウンロードします。ここで、docker の snap パッケージだけダウンロードすれば良さそうに思えますが、Ubuntu のバージョンが違うと snap のバージョンが合わず動かなかったりするので snap, core22, docker の 3 つのファイルを落としておきます。

実際の出力は下記のようになります。

```shell
root@localhost:~# snap download snapd
Fetching snap "snapd"
Fetching assertions for "snapd"
Install the snap with:
   snap ack snapd_23258.assert
   snap install snapd_23258.snap
root@localhost:~# 
root@localhost:~# snap download docker
Fetching snap "docker"
Fetching assertions for "docker"
Install the snap with:
   snap ack docker_2963.assert
   snap install docker_2963.snap
root@localhost:~# 
root@localhost:~# snap download core22
Fetching snap "core22"
Fetching assertions for "core22"
Install the snap with:
   snap ack core22_1722.assert
   snap install core22_1722.snap
root@localhost:~# 
```

下記のようなファイルがダウンロードされますので、これをオフラインサーバにコピーします。

```
root@localhost:~# ls -lh
total 258M
-rw-r--r-- 1 root root 4.5K Dec 23 04:17 core22_1722.assert
-rw------- 1 root root  74M Dec 23 04:17 core22_1722.snap
-rw-r--r-- 1 root root 5.1K Dec 23 04:17 docker_2963.assert
-rw------- 1 root root 140M Dec 23 04:17 docker_2963.snap
-rw-r--r-- 1 root root 4.5K Dec 23 04:16 snapd_23258.assert
-rw------- 1 root root  45M Dec 23 04:16 snapd_23258.snap
```


# オフライン Ubuntu でインストール
オフラインサーバでは、下記の順序でコマンドを実行するだけです。

```
snap ack snapd_23258.assert
snap install snapd_23258.snap
snap ack core22_1722.assert
snap install core22_1722.snap
snap ack docker_2963.assert
snap install docker_2963.snap
```

これだけで docker が使えるようになります。簡単ですね！


# 最後に
上記の方法で Ubuntu 20.04, 22.04, 24.04 すべてのオフライン Ubuntu に docker 環境を構築することができました。あとはスクリプトをコンテナイメージにしてコピーすればどの環境でも動作します。改めてコンテナの便利さを実感しました。
物理シュミレータGenesis試してみた

# 概要
新世代の物理シミュレータが出たと聞いたのでインストールからデモの起動までやってみました。
簡単にまとめるとIsac Simより高速にシミュレーションできたり、今までシミュレーションの難しかったソフトロボットのシミュレーションもできるみたいです。
詳しいことについてはまとめている方がいらしたので、以下を参照してください。

https://note.com/npaka/n/nbee82a5d5374

# 使用環境
ubuntu 20.04
pytohn: 3.9

# セットアップ
## pythonのセットアップ
まずはpython関連のセットアップから行います。すでに行っている人は次に行ってください。
genesisはpython3.9以上が必要らしいので3.9を入れます。
記事はこちらを参考にしました。

https://qiita.com/murakami77/items/b612734ff209cbb22afb

詳しいことは記事に任せて、実行したコマンドを載せます。
### aptパッケージの更新
```sh
sudo apt update
sudo apt upgrade -y
```

### pipのインストール
```sh
sudo apt install -y python3-pip
pip3 -V
```

### リポジトリ追加
```sh
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
```
途中、press [ENTER]と出たら`Enter`キーを押す。

### インストール可能なPythonバージョンを確認
```sh
sudo apt update
sudo apt list python3.*
```
ここでpython3.9が表示されればOK。

### python3.9のインストール
```sh
sudo apt install -y python3.9 python3.9-venv
```
venvで仮想環境を作るため、venvも同時にインストールする。

### 仮想環境の作成
```sh
python3.9 -m venv genesis_env
```
### 作成した仮想巻環境の有効化
```sh
source genesis_env/bin/activate
```
## 必要パッケージのインストール
### genesisのインストール
```sh
pip install genesis-world 
```
※Getting Started/Quick Installationを参考

https://github.com/Genesis-Embodied-AI/Genesis

### PyTorchのインストール
```sh
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
```
以下サイトの`Run this Command`を参照
![PyTorch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860884/6b35f309-e7eb-ba96-3d9d-6300d1242ffd.png)

https://pytorch.org/get-started/locally/

# デモの実行
公式サイトのHello,Genesisを実行します。

https://genesis-world.readthedocs.io/en/latest/user_guide/getting_started/hello_genesis.html

好きなファイル名で以下のpythonファイルを作成します。
（以下Hello_genesis.py)

```py:Hello_genesis
import genesis as gs
gs.init(backend=gs.cpu)

scene = gs.Scene(show_viewer=True)
plane = scene.add_entity(gs.morphs.Plane())
franka = scene.add_entity(
    gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'),
)

scene.build()

for i in range(1000):
    scene.step()
```

実行は以下のコマンドでします。
```
python3 ./Hello_genesis.py
```
こうするとシーンのビルドが始まり、シミュレーションが開始します。
![demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860884/0d857b0d-c65b-4704-55af-b9e2f4dba8ac.png)

# 終わりに
genesisのインストールについてまとめてみました。
これを機に、強化学習についての勉強も始めてみようと思います。
ユーザーへの通知送信ミスに対する防衛術

## この記事について

この記事は、「[【CPaaS】SMS・メール機能の開発・運用でのやらかし談＆失敗エピソード募集 by ネクスウェイ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/cpaas-now)」の23日目の記事です。

---

今では当たり前になったメールやSMSなどの通知は、誤送信や失敗などのやらかしによって、簡単にプロダクトのイメージダウンやユーザーの信頼低下を招く大きなリスクとなります。
例えば、新規登録時のSMSやメール認証が届かないことで、新規ユーザーが登録を諦めてしまい新規顧客を逃したり、変な文章をテストで送ってしまい炎上するなどなど...

なので、誤送信や失敗を防ぐために実施してきた対策について、この記事でまとめてみたいと思います。
また、他にも有効な対策があれば、ぜひコメントで教えていただけると嬉しいです！🙇


## 誤送信対策編
### 本番環境での送信権限をできるだけ絞る

基本的なことですが、ユーザーへ通知を送信できる権限をしっかりと絞り管理します。
本番環境のAPIを編集・更新できるユーザーや、本番環境で通知を送信する権限を持つユーザーを、できるだけリーダークラスや責任者に絞り込みます。開発者や一般的なマーケ担当などが本番環境で通知を送ることができないようにしたり、APIキーをローカルで触らないようにするなど、権限の制限を徹底します。

### 開発環境と本番環境をパット見で区別がつくデザインにする

誤って開発環境の通知を本番に送信してしまうリスクを減らすため、通知の送信画面を本番環境と開発環境で区別できるデザインにしていました。

具体的には、開発環境と本番環境でインターフェースの色合いやデザインを大きく異なるものにしていました。
例えば、開発環境ではヘッダーの色などを、本番のデザインとかけ離れたデザインにします。(Qiitaをブラウザ上で編集したイメージです。)

本番環境 | 開発環境
--- | ---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589058/4ea718b9-6ae5-bd9a-56bc-accb6acffd25.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589058/f9b049bc-ca9c-c0c8-57bf-757cd013461a.png)

```react:実装イメージ
    <Header background={isDev ? pink : green} />
```


### テストの送信内容を誤送信しても問題ないものにする。

過去にSlideShareでバズっていましたが、「うんこ」など不適切な文言をテスト文言に使用するのは絶対にやめましょう。引用した記事と被りますが、人間は必ずミスをするので、失敗しても良い文章やデザインを使うようにします。卑猥な単語だけでなく、実在する企業名や、フルネームなどいろいろアンチパターンがありますが、テストだとしても、必ず適切なテスト文章を用意して使うようにしましょう。

https://www.infiniteloop.co.jp/tech-blog/2024/04/unko2024/


<details><summary>実際に誤送信でニュースになっている事例</summary>

[「ゲリラや特殊部隊による攻撃が発生しました」　Yahoo!系アプリで通知の誤配信、原因は調査中](https://www.itmedia.co.jp/news/articles/2112/22/news144.html)
[「国道40号ばばばばばえおうぃおい～」　2021年の誤配信からみる教訓](https://www.itmedia.co.jp/news/articles/2112/24/news126.html)

</details>

---

「テスト」単体や、くだけた文章などもやめたほうが良いと個人的には思っています。
下記は「テスト」と送ってしまったことでニュース記事になっています。

https://www.j-cast.com/2023/03/29458802.html

プッシュ通知などであれば、普段送られている文言に寄せて「新作メニューを確認してみませんか？」など、送られてきても違和感がない文言を社内wikiなどに用意して、それを使うようにしたほうが良いと思います。


### 本番環境での通知送信時に1発で送れないようにする

送信ボタンを押した際に、「本番環境へ送信します。この文言で問題ないですか？」といったAlertを表示したり、送信する内容が多い場合は、確認画面を1ページ挟むように実装していました。
人間慣れてくると警告や確認画面すら見ずに送信してしまいますが、一応のチェックをかけていました。

今なら、長文のメール等の場合はChatGPTなどのAIで添削や確認などを挟んでも良いかもしれません。

## 送信監視編

### 送信後の確認機能

通知を送信した後、必ずその送信が正しく行われたかを確認できる環境を作っていました。

自分の場合は、プロジェクトのデータ可視化ツールを活用していました。
OSSのMetabaseなどを利用して、ダッシュボードに日々の送信の成功と失敗数や日時などをDBに保存しておき、ダッシュボード上で誰でも確認できるようにしていました。

しきい値を設定しておき、成功や失敗の数に大きな変動があった場合に、管理者のSlackにメンション通知が飛ぶようにしていました。1度これを設定していたおかげで、リリース後に新規登録メールが機能していなかったことに素早く気づくことができました。

CPaaS NOWではSMS・メール・認証コードの配信結果をWebhookで取得できるようなので、より手軽に管理者へアラートを飛ばす事ができそうです。

https://api-docs.cpaasnow.com/#tag/Webhook

### 送信に使っている利用サービスの監視

自分たちの実装と送信だけでなく、通知の送信に使っているサービス自体も監視対象にしていました。
外部のAPIサービスを利用している場合、そのサービスが提供するステータスページやAPIを活用して、サービスの稼働状況を確認し、ステータスが変動した際に、Slackやメールで管理者に通知が飛ぶような仕組みを作っていました。

https://status.firebase.google.com/

滅多にないのですが、障害が発生したり、メンテナンスによって止まることに前もって気づけて用意しておくと便利でした。通知領域に限らず、おすすめです。


## 今後の開発について

通知は身近な分、やらかしによってプロダクトの評価やユーザー体験を大きく左右する重要な要素です。

失敗を防ぐために、今回紹介した対策などを取り入れていくことで、やらかしが減るかと思います。
今後も新しい対策を取り入れながら、ユーザーの信頼を守り続けていきましょう。

最後まで読んでいただき、ありがとうございました。
もしこの記事が役立った、または他にも意見があれば、ぜひコメントでお知らせください！
【初心者向け】New RelicのSession Replay機能のご紹介

# はじめに
こんにちは。KIYOラーニング株式会社の森下です。
[New Relic 使ってみた情報をシェアしよう！](https://qiita.com/advent-calendar/2024/newrelic)の24日目の記事になります。
本記事では、New RelicのSession Replay機能のご紹介をします。

# Session Replay機能とは
ユーザーエクスペリエンスを巻き戻して、ユーザが悩んでいる原因をすばやく把握することができる機能です。
[New Relic公式 Session Replay](https://newrelic.com/platform/session-replay)

[New Relic公式 Session Replayの機能説明](https://docs.newrelic.com/jp/docs/browser/browser-monitoring/browser-pro-features/session-replay/)

# Session Replay機能の設定
① Browser＞Application settingsをクリックはこちら

② アプリケーション設定ページで、 ProまたはPro + SPAが選択されていることを確認します。ProまたはPro + SPAでのみご利用できます。

③ Session Replay設定をオンに切り替えます。
![画像15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928827/223f034e-870f-fdb8-6390-d434b074dc33.png)

④ Session traces設定もオンに切り替えます。
![記事画像２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928827/1270834a-eb45-90d9-c486-386d3a8a0115.png)

⑤ アプリケーション設定ページでは他にもサンプリングレートの設定や画像、テキストのブロックや機密テキストのマスク化など細かい設定も可能です。
設定変更後はJavaScriptのスニペットも更新されます。

# Session Replay機能の利用開始
① Browser＞Session Replayをクリックします。

② 各リプレイをクリックし、詳細ページを開きます。
![画像16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928827/b25d3138-0b27-8fef-344e-60d903ccbfda.png)


③ Playをクリックするとユーザの行った操作が再生されます。
![記事画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928827/66bde9b2-8ae5-a624-ab0c-28d83eebafda.png)

④ エラーに添付されたリプレイを表示するには、 Browser＞Errorsをクリックします。

⑤ Session Replayをクリックします。
![画像17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928827/30c400cb-d61f-be14-6463-1bfcf16ffd44.png)

⑥ Playをクリックするとユーザの行った操作が再生されます。
ユーザの操作は記録されますが、機密情報や個人情報が含まれないよう、内容はマスクされています。そのため、画面が一部崩れて見える場合もありますが、エラー調査には十分役立ちます。

![記事画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928827/2d6256cf-610f-f502-a636-129c9a87f85d.png)

# おわりに
今回ご紹介した「Session Replay」は、エラー調査にかかる工数を大幅に削減できる機能だと感じました。
私自身、イレギュラーな操作で発生したバグの再現確認に時間を要してしまった経験があります。
しかし、この機能なら映像で実際の操作を確認できるため、調査スピードが格段に上がるのではないかと思います。

まだまだ New Relic を使い始めたばかりで、分からないことも多いのですが、
これからも学んだことを共有し、少しでも皆さまのお役に立てれば幸いです。

# KIYOラーニング株式会社について
当社のビジョンは『世界一「学びやすく、分かりやすく、続けやすい」学習手段を提供する』ことです。革新的な教育サービスを作り成長させていく事で、オンライン教育分野でナンバーワンの存在となり、世界に展開していくことを目指しています。

https://kiyo-learning.com/
# スタディング
https://studying.jp/
# スタディングキャリア
https://career.studying.jp/
# AirCourse
https://aircourse.com/
# KIYOラーニング株式会社では一緒に働く仲間を募集しています
https://www.wantedly.com/companies/kiyo-learning/projects
Qiita CLI - Qiita CLI を使っていて Qiita 側で記事を削除した場合どうなるか

# Qiita CLI を使っていて Qiita 側で記事を削除した場合どうなるか

## 削除は Qiita 上からしかできない

記事の削除は安全のため Qiita 上からしか出来無いと公式ドキュメントに書かれている。

- [“Qiitaの記事をGitHubリポジトリで管理する方法 #QiitaCLI - Qiita”](https://qiita.com/Qiita/items/32c79014509987541130#%E8%A8%98%E4%BA%8B%E3%81%AE%E5%89%8A%E9%99%A4%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)


## では実際に Qiita 側で記事を削除するとどうなるのか

次の記事を `push` した時に Qiita 上で削除したファイルも GitHub Actions から `publish` しようとしてエラーになり、新しい記事が公開できなくなる[^1]。


## 結論

Qiita 側で削除した記事は git リポジトリ側でも削除を行わなければならない。


[^1]: 個人的にそこは Sync するか無視する設定を用意て欲しいと思うところではある
ノンエンジニアの私が、Difyを使ってハッカソンで優勝した話

## はじめに
弊社、株式会社リンクアンドモチベーションでは2024年から生成AIを活用した生産性向上プロジェクトを本格的に行なっています。ChatGPTをはじめとするサードパーティツールを活用する一方、自社内での専用ツールの開発をDifyを活用して行っています。

## 前提
私は現在、人事制度構築や育成体系構築を中心としたコンサルティング業務を行いつつ、生成AIを活用して業務効率化にも取り組んでいます。そのため、今年の1月まではChatGPTの存在も知らず、プログラミングの知識も全くありませんでした。
そのような私が今年1年間を通して、ChatGPTやDify、n8nなどを活用しながら、現場の課題やニーズに合ったツールを開発し続けました。その結果、エンジニアが中心となり開催されているハッカソンにおいて、事業インパクトがあると認められたツールの開発に成功し、見事ハッカソンにて金賞を受賞しました。この経験から学んだ「本当に現場で活用されるツール」を開発するポイントをお伝えできればと思います。「現場業務を行いながらも、もっと業務を効率化したい」と感じられている方や「全社のDX推進を促進させていきたい」際の一助になれば幸いです。

## 開発ツールの事例
### 【ツール1】事業・組織分析くん
#### ■概要
顧客名を入力するだけで、統合報告書などのオープン情報を基に業界や企業の現状と今後の展望を要約します。これを事業面と組織面で整理し、弊社専用フォーマットで出力します。

#### ■詳細
具体的な活用イメージは下記の通りです。
▼インプット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954496/28cae48e-23f7-c372-7780-bd081ca28de5.png)


▼アウトプット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954496/1d50fcec-8fa5-f4f6-4885-e1a2432a22c5.png)


#### ■効果
①顧客情報のリサーチや整理時間を**約5時間から約1時間に短縮。**
②顧客情報だけではなく、**競合企業に関する情報収集も簡単**にできるように。

### 【ツール2】議事録要約くん
#### ■概要
議題と議事録を全文入れるだけで、議題に沿った議事録の要約を作成します。

#### ■詳細
具体的な活用イメージは下記の通りです。
▼インプット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954496/b6c53bee-53c4-1fe7-ebaa-aaf3f88696fc.png)

▼アウトプット（一部のみ抜粋）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954496/e046d6fd-be51-d8da-1249-c8f6e288c81b.png)

#### ■効果
①議事録の作成時間が**約30分から約10分にまで短縮**できるように。
②若手社員でも抜け漏れなく、議事録要約が作成できるように。

## ”現場で本当に使われるツール開発"のポイント
### 【ポイント1】実効性：開発してみただけではなく、本当に業務効率に繋がる
1つ目のポイントは、「実効性」です。開発するだけではなく、実際に業務効率化につながることが重要です。

生成AIを活用し始めた頃に、私がぶつかっていた壁が「開発してみたものの、なかなか現場の業務フローを置き換えるようなツールを開発できない」という問題でした。業務のほんの一部だけを代替できるツールを開発しても、わざわざDifyにアクセスするくらいだったら、自分の手元でやった方が早いということが起こっていました。

しかし、今回開発した2つのツールは、業務フロー（≒コンサルタントの複雑な思考フロー）を大胆に代替するツールだったため、1回の活用においても大幅な時間削減に繋がり、現場で活用されるようになりました。

### 【ポイント2】汎用性：自部門だけではなく、他部門でも活用できる
2つ目はポイントは、「汎用性」です。1つの部門だけではなく、複数の部門で行われている汎用的な業務を型化することが重要です。

開発当初は、自部門の業務に絞って開発をしていましたが、他部門と連携していく中で共通の課題を見つけることができ、複数部門に関係する業務を代替するツールを開発することで、すぐに本部全体に浸透していきました。

### 【ポイント3】利便性：特性の誰かが使えるではなく、誰でも使える
3つ目のポイントは、「利便性」です。生成AIに関する能力や知識に長けている人だけが使えるのではなく、誰でも使えるツールを開発することが重要です。

複雑な業務を代替しようとすればするほど起こることが、「使い方がわからない。」という問題です。「きっと使ったら便利なんだろう」と思いつつも、複雑な操作をしなければならない場合には、常に忙しい現場の皆さんには使っていただけません。

そのため、インプット工数や操作を極力簡素化し、誰でも使えるツール設計が求められます。

## まとめ
生成AIは非常に便利なツールですが、普段からプログラミングや生成AIに馴染みがない方にとっては、難解に感じられ、活用が進まない場合があります。そのため、自然と業務に組み込まれ、使えば使うほどユーザーにとってメリットがあるようなツールを開発してこそ、業務の効率化や生産性向上に寄与する可能性が高まります。

本内容が「現場業務を行いながらも、もっと業務を効率化したい」と感じられている方や「全社のDX推進を促進させていきたい」際の一助になれば幸いです。
米田の補題 #8 合成　補足説明 自然数

# 米田の補題は、圏論でもっとも重要な定理です（繰り返し）
圏論は、数学の基礎理論です。いままで、[万物の理論](https://amzn.to/3ZLmCJH)
といわれていましたが、[数理科学 11月号](https://amzn.to/4iz6NgM)では、なんと　<font color="Red">万物・万事・万人</font>のための数学理論とまでいわれるようになりました
このAdventCalendar は、体験的に圏論の最も重要な定理である米田の補題を体験的に理解してもらうためにかいています

参考にしているのは、[圏論の道案内](https://amzn.to/4iH2Rus)です

# 合成　補足説明　自然数
圏の例は、自然数を意識しましょう。ただ、自然数の中身を考えると、対象を決めると、加法に基づく射では決まってしまいます。同じ域と余域の間に複数の射がありえるはずなのに、ちょっとそぐわない例になります。ただ、体験的に合成を理解するには、適しているのでここでは、自然数 + 加法の圏で考えましょう。
自然数全体を一つの対象とする圏は、普段の生活からするとすわりがわるいですが、数学的にはよくあつかわれるモデルだと割り切りましょう

**米田の補題川柳 ならべかえ自然数だと思えるな**
自然数と同じにするのは普段からよくやっています。並べ替えです。昇順でも、降順でも並べ替えて、連番をふれば、自然数との対応付が簡単にできます。バラバラのときは、該当する値を探すのも面倒ですし、ある値が、ランキングでどの順位にいるのかも簡単にわかりません。自然数のように、射の値を簡単に設定できません。それを並べ替えて、自然数との対応づけをすると一気に簡単になります。ばらばらでめんどくさい状態を扱いやすい状態にするという意味で、量子コンピュータに近いですね。違うのは、並べ替えるという具体的な操作が明確なことです。量子コンピュータでは、どうしたらいいかがほとんどわかっていません。会話における質問もそうです。どんな質問をしたらいいかは、ほとんどわかっていません。
AndroidStudio　画面遷移でのデータ引継ぎ

画面遷移時にデータを渡したり受け取ったりする
今回はIntentってやつを使う

## Intentを使用しデータの受け渡しをする
### 送る用の作業
参照 ⇒ [画面の遷移](https://qiita.com/mk-000856/items/b4f939243d43c2e69da8#%E7%94%BB%E9%9D%A2%E3%82%92%E9%81%B7%E7%A7%BB%E3%81%95%E3%81%9B%E3%82%8B)

Intent型の変数を作成しその変数に対して

:::note info
**変数.putExtra("キー",value);**　で渡す値をセットできる
:::
~~~java:セットする側の　MainActivity.java　変数名は intent としている
//送る用の値を用意
int in = 10;
String str = "ストリング";

//送る値をセットする
intent.putExtra("int", in);//"int"がキー
intent.putExtra("String", str);//"String"がキー

//指定した画面(cls)へ
startActivity(intent);
~~~

### 受け取る作業
:::note info
**変数.get〇〇Extra("キー", 〇〇に対応する値);**
:::


~~~java:受取側の MainActivity.java
//Intentを取得
Intent intent = getIntent();

//取得したIntentから受け取る
int in = intent.getIntExtra("int", 0);
String str = intent.getStringExtra("String");

//あとはテキストビューに反映させたり好きにする
~~~

## 受け取り側は型を指定する
下記表を参照する　※GPTさんに作ってもらった
| 型（Type）                | getメソッド（引き出すとき）                |
|---------------------------|------------------------------------------|
| int                       | `getIntExtra("key", defaultValue)`       |
| String                    | `getStringExtra("key")`                  |
| boolean                   | `getBooleanExtra("key", defaultValue)`   |
| float                     | `getFloatExtra("key", defaultValue)`     |
| double                    | `getDoubleExtra("key", defaultValue)`    |
| long                      | `getLongExtra("key", defaultValue)`      |
| Serializable（オブジェクト） | `getSerializableExtra("key")`           |
| Parcelable（オブジェクト） | `getParcelableExtra("key")`             |

:::note warn
第２引数(defaultValue)が存在ものは必ず入れること
キーが存在しない場合はこのdefaultValueの数値が入る
:::

他にもデータの受け渡しに使える
Bundleってやつもあるけど今回はこれまで
スマートフォンゲーム(を始めとするシステム)の障害対応について語る

こんにちは
この記事はKLab Engineer Advent Calendar2024の記事です

来年1月に大学のサークル内で登壇する予定がありまして、するそこで話そうと思う内容を簡単に書いてみます。
(まだスライドなどは作っていないですが、、)

# 私の仕事内容について

スマートフォンゲームの開発、運営の仕事をしています(オンライン中心のゲームを作っています)
スマートフォンゲームが実際にPFストア(App Store, Google Play Store)上で公開されるなどの形でリリースされる前の開発の仕事もしていますが、リリース後の運営の仕事も経験しています。本記事では実際にリリースされた後の話を書きます。
(私がスマートフォンゲームの開発、運営の仕事をしているため、その中での話として書いていますが、書かれている内容としてはシステム開発で一般的にどこでも言えるような話だと思います。)

# リリース後の話

実際にスマートフォンゲームがリリースされると、多くのユーザーさんがプレイされるわけですから、ユーザーさんの意見がネット上に大量に溢れることになります。そうすると、ゲームを運営しているスタッフ内では気づかなかった不具合が見つかることもあります。(もちろん、スタッフ内でゲームをプレイしている際や、リリース中のデータを見た際に不具合が見つかることもあります。)
そういった不具合に対し、スタッフ内ではどのように対応しているか、という話を書きます。

# 障害とは?

まず、障害とは何かの話をします。障害自体は「[あることをするのに、さまたげとなるものや状況](https://kotobank.jp/word/%E9%9A%9C%E5%AE%B3-172263)」を意味する一般的な言葉っですが、それを具体化して、本記事では、
「実際にユーザーさんが遊んでいる環境(本番環境)でシステム(ゲーム)が正常に実行(プレイ)できない状態」を指すこととします。
例えば、以下のような事象が考えられます。
* 誤表記
    * お知らせの内容が間違っていた
    * イベントのルール説明文が間違っていた
    * カードのスキル説明文が間違っていた
* 意図しない動作
    * インゲーム(例えば、クエスト)の特定箇所に行くとクラッシュする
    * いわゆる「ガチャ」(カードの抽選)が回せない
    * 課金ができない

障害には重さに応じて、「ランク」をつけて管理することがあります(重大度を管理し、PJごとに障害数を管理することで、横断的に障害数を比較することができます)
* ランクS
   * 多くのゲームプレイユーザーに影響を与える障害
   * (ゲームの)サービス全体の停止が必要
   * 課金が出来ない、もしくは課金機能に関する障害
   * 法令違反が疑われる障害
* ランクA
   * 一部のゲームプレイユーザーに影響を与える障害
   * アイテムなどの補填が必要であるもの
* ランクB
   * ユーザーにとって軽微な問題である障害

では、実際に障害になった際に、どのように対処すれば良いでしょうか。

# 障害発生時の対応

実際に障害になった際の手順としては以下があります。
a. 報告
  * 障害の報告は、ある日突然やってきます
  * 障害というのは、一定ゲームの新機能や新イベントが始まった際など、何かしらゲームに変化がおきた際に起きやすいという「傾向」はあるとはいえ、突然やってくることもあります (例えば、インフラの要因で突然サーバーダウンを起こすはず)
  * 障害は何が起きるかは予想つきません

b. 調査
   * 何が起きているのか、現象を把握し、影響範囲を調べていきます
     * 調査する上では「正確さ」と「早さ」が大事です 
     * SNS上で特定のユーザーがAという現象が起きている、と報告していたとしても、別のユーザーがBという別の現象が起きていることもあり、正確に現象を把握することがこの後の対応の正確さを上げていくことが大事になります
     * 正確な調査を怠ると、二次災害(障害対応を行った際の対応でさらに障害が発生すること)につながっていく可能性も有り得ます

c. 対応の検討
  * 調査を元に、他メンバーとも相談の上、対応方針を決定していきます。(自分の判断、一人の判断で突っ走ってはいけません)
  * 重大な障害であり、かつ、現在もその不具合がユーザーが遊ぶことに起きてしまう場合、被害を拡大させないためにゲームの一部もしくは全体をメンテナンスにいれることも考えられます

d. リリース
  * 開発環境(テスト環境)で修正を行い、その修正が正しく問題ないかを確認した後、実際に本番環境(ユーザーさんが遊んでいる環境)に展開します

e. ユーザー対応
  * 前の手順とも並行する部分もありますが、ユーザーコミュニケーションを大事になります
  * 障害が起きている状態はユーザーさんにとっては「運営大丈夫かな？」というように心配するタイミングでもあります。そのため、障害がすぐ直せない場合は、現状を説明するために「不具合内容の対応予定」についてお知らせで説明したりすることも考えられます。（逆に、すぐ直せる場合は直したと同時、もしくは少し後に「不具合を対応した内容のお知らせ」を事後で出すこともある)

f. 振り返り
  * 直してすぐ障害対応は終わり。というわけではなく、なぜ障害が起きたのか、を振り返っておくことも大事です。経緯、原因や、自分たちで考えられる対策を提示し、その後、対策については二度と同様の障害が起きないように対策していくことが大事です。

# 大事なこと

障害対応で大事なことは、　障害が起きた際は、一旦は起きてしまったことは仕方ない、と考え、　自分の判断で勝手に対応を進めず、チームみんなで対応をしていく　ことだと思います。
自分たちの判断で勝手に進めてしまうと、チームとしての一体感がなくなるのもありますが、焦っている状態で対応することでよりミスが誘因されやすくなりますし、他の人に確認してもらいながら対応することで、対応の精度を上げ、二次災害(障害対応を行った際の対応でさらに障害が発生すること)を防ぐことにつながります。
【初心者】Javaの`.java`と`.class`の違いとは？


Javaを学び始めたとき、「.javaと.classの違いって何だろう？」と疑問に思った方も多いのではないでしょうか？この記事では、Javaの基本である`.java`と`.class`ファイルの違いを、最新版の情報を交えてわかりやすく解説します。

---

### 1. `.java`ファイルとは？
`.java`ファイルは、Javaのソースコードが記述されたファイルです。

#### 特徴
- **人間が読める形式**で書かれており、Javaの構文に従っています。
- プログラムのロジックや処理内容を記述します。
- **直接実行することはできません**（ただし、Java 11以降では例外的に実行可能です）。
- `.java`ファイルは開発者が編集・保存する主要なファイルです。

#### 例
以下は、典型的なHelloWorldプログラムの`.java`ファイル例です：

```java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
```

---

### 2. `.class`ファイルとは？
`.class`ファイルは、`.java`ファイルを**コンパイル**して生成される、Java仮想マシン（JVM）が解釈可能なバイトコード形式のファイルです。

#### 特徴
- **コンパイル（javacコマンド）**によって生成されます。
- JVMが実行できる形式で記録されており、プラットフォームに依存しません。
- 人間が直接読める形式ではありませんが、クラス名やメソッド名などのメタデータを含むことがあります。

#### 生成方法
以下のコマンドで、`.java`ファイルをコンパイルして`.class`ファイルを生成します：

```bash
javac HelloWorld.java
```

このコマンドを実行すると、同じディレクトリに`HelloWorld.class`が生成されます。

---

### 3. Java 11以降の新しい特徴
Java 11以降では、`.java`ファイルをコンパイルせずに直接実行することが可能になりました。

#### 実行方法
次のように、`java`コマンドで`.java`ファイルを直接指定して実行できます：

```bash
java HelloWorld.java
```

この機能により、簡単なプログラムを素早く試すことができるようになり、初心者にも便利です。

---

### 4. なぜ`.java`と`.class`の両方が必要なのか？
Javaでは「**コンパイルしてから実行**」する仕組みを採用しています。この仕組みにより、**プラットフォームに依存しないプログラムの実行（Write Once, Run Anywhere）**が実現されています。

- **ソースコード記述（.java）**  
  開発者がコードを記述し、編集する形式。
  
- **コンパイル（.class生成）**  
  `javac`コマンドで、`.java`ファイルをバイトコード形式の`.class`ファイルに変換します。
  
- **実行（JVMによる解釈）**  
  `.class`ファイルをJVMが解釈し、プログラムを実行します。

---

### 5. `.class`ファイルの中身を覗いてみる
`.class`ファイルは基本的に人間が読めませんが、`javap`コマンドを使うことでバイトコードを確認できます。

#### 使用例
```bash
javap -c HelloWorld.class
```

#### 出力例
```plaintext
public class HelloWorld {
  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Hello, World!
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}
```

このように、JVMが実行する命令の内容が表示されます。

---

### 6. `.java`と`.class`の比較表

| ファイル形式 | 役割            | 説明                                         |
|--------------|-----------------|--------------------------------------------|
| `.java`      | ソースコード    | 人間が読める形式でプログラムを記述          |
| `.class`     | バイトコード    | JVMが実行可能な形式で保存                  |

---

### 7. まとめ
- **`.java`**: ソースコードを記述するファイル。Javaの構文に従ってプログラムを書きます。
- **`.class`**: `.java`ファイルをコンパイルして生成されるバイトコードファイル。JVMが実行可能な形式です。

Javaの基本的な流れは以下の通りです：
1. **`.java`を作成**  
2. **コンパイルして`.class`を生成**  
3. **`.class`を実行**

Java 11以降では、`.java`を直接実行できるため、簡単なプログラムの試作が容易になりました。

---

この仕組みを理解することで、Javaの基礎だけでなく、他のプログラミング言語にも応用できる考え方を身につけることができます。この記事が参考になったら、ぜひフィードバックをお寄せください！ 😊
dSPACEエラー集

## 1. はじめに
Simulinkビルド時やdSPACE実行時に発生するエラーをまとめました．
随時更新します．

## 2. 簡易チェックフロー
初歩的なミスをまとめたフローチャートです．
再起動も試してみましょう．
ソフトウェアのバッファが一杯になったり，プラットフォームと接続した状態で長時間スリープしていると何かのタイミングで接続が切れたりした場合に有効です．
![画像3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654082/68221b7a-a09a-7753-8e1f-d920bf9e09aa.jpeg)

## 3. エラー集
### 1. Simulinkビルド失敗
**プラットフォームの状態が適していない**
- 対象: MicroLabBox (ds1202)
- Simulinkでビルド最中に以下のようなエラーメッセージが出現し，ビルドが失敗することがあります．
*** Stopped RTI build procedure for model: CGS.
【原因1】
ControlDeskがオンライン状態になっている．
Go Offlineボタンを押してオフライン状態にしましょう．

**モデル環境がdSPACE用になっていない**
【症状】スクショ
【原因】dSPACE用のテンプレートからモデルを生成していない場合に起こりやすいです．
【解決】Configurationを開き以下の箇所を設定してください．

プラットフォームとリンクしたエラーを発生させないようにするだけでしたら，
`モデル設定 > RTI load options > Load application after build`のチェックを外すだけで消えます<sup>[1]</sup>．
しかし，ControlDeskでsdfファイルを読み込む際に結局エラーがでるなどして根本的な解決にならないことが多いのでおすすめはしません．
[1] dSPACE, "FAQ 084 RTI Build Procedure: LOADING FAILED (1)", 
https://www.dspace.com/shared/support/faqpdf/faq084jp.pdf

### 2. ビルドしたのにControlDeskの挙動が変わらない．
ControlDeskではプロジェクトを作成する際に指定したsdfファイルのパス(1)を参照しています．
【原因】MATALBの作業フォルダが(1)のパスと異なる．
【解決】(1)のパスに作業フォルダを変更する．
MATLAB.exeを先に開くのではなく，コンパイル対象のslxファイルを直接開くとこのミスはなくなります．

### 3. Simulink起動時エラー
【症状】SimulinkとdSPACE RTIのリンクが切れている
- コマンドウィンドウにdSPACEサポート周辺の文言が出現しない．
　RTI Platform Support RTI#### acrivated.
- SimulinkモデルのDACやADCモデルが存在しないことになっている．
【原因】2つ以上のdSPACE Releaseをインストールした場合の最初のRTIのactiveが勝手に切れる？（要確認）
【解決】Installation Managerの`Installations > Installations > dSPACE RCP and HIL Softweare ####-X`を選択して下部の`Activate`ボタンを押す．



### 3. サンプリング周波数が高すぎる
MicroLabBoxでは通常設定だと50 kHz超えたあたりのサンプリング周波数のモデルをコンパイルするとエラーが出現します．
Simulinkのエラー表示に加え，MicrolabBox側面LEDのAPPの部分が赤に点灯します．
対処法は以下の通りです．
- サンプリング周波数を落とす
- ブロック数を減らす（特にScopeブロック）

### 4. Time Plotterが1秒しか描画されない
Time Plotter内で1秒しかデータが見られず，0秒→1秒を永遠に繰り返す場合はDuration Triggerが有効になっています．
`Measurement Configurationパネル > Triggers -> Duration Triggers > DUration Trigger 1`
`Properties > Enabled`のチェックを外しましょう．

### 5. Go Online時のエラー
【症状】
後ほどスクショ
【原因】
対象のControlDeskプロジェクトに対してインストールしてあるソフトウェア/ドングル/プラットーフォームのセットが間違っている場合に発生します．主にドングルが違う場合が多いです．
【解決】
合わせる．

### 6. メモリ不足
**バッファが大きすぎる**
【症状】フリーズする
【原因】PCのメモリの上限を超えるバッファを確保したため．
【解決】バッファの時間幅を減らすかRecodingやTime Plotter内のSignalの数を減らす．もしくはPCのメモリを増設する．

**Windowsのバージョンが古い場合**
【対象】dSPACE Release2016-Bより前のSCALEXIO, DS1007, MicroLabBox, VEOS
【症状】プラットフォームに突然アクセスできなくなり，dSPACEログファイルに以下のエラーメッセージが記載されている．
```
Cannot obtain access privileges for hardware device with serial number:#######.
Internal error. dSPACE Support information: Operation failed.The host is not registered to this
device.
or
Internal error. dSPACE Support information: Operation failed.The host with ID 0/0 is not
registered with this device.
Internal error. dSPACE Support information: Failed to change access restriction.
Could not get the access level for starting online calibration or measurement on device
[PlatformName].Another user might have exclusive access.
```

【原因】WindowsOSの制約で1つのソフトウェアが2GB以上使えないようにしているため．特に32bit．
【解決】アップデートとパッチをあてる．

[参考] dSPACE, "FAQ413 プラットフォームに突然アクセスできなくなる",
https://www.dspace.com/ja/jpn/home/support/kb/faqs/faq413.cfm
初心者がJava開発環境をセットアップするガイド！

# Java開発環境セットアップガイド

## 1. JDK (Java Development Kit)のインストール

### Windowsの場合

1. Oracle JDKのダウンロード
   - [Oracle JDK ダウンロードページ](https://www.oracle.com/java/technologies/downloads/)にアクセス
   - 「Windows」セクションを探す
   - 「x64 Installer」をクリック（64ビットPCの場合）
   - Oracleアカウントでのログインを求められた場合は、「No thanks, just start my download.」をクリック

2. JDKのインストール
   - ダウンロードしたexeファイルをダブルクリック
   - 「次へ(N)」をクリックしてインストールを進める
   - インストール場所は変更せず、デフォルトのままで「次へ(N)」

        :::note warn
        インストールフォルダをメモしておくこと！
        :::
    - インストールが完了したら「閉じる」をクリック

3. 環境変数の設定
   - Windowsキー + R を押して「実行」を開く
   - 「systempropertiesadvanced」と入力してEnter
   - 「環境変数(N)」をクリック
   - 「システム環境変数」の中から「Path」を探してダブルクリック
   - 「新規(N)」をクリック
   - 以下のパスを追加：

        :::note warn
        上記でメモしておいたインストールフォルダを設定すること！
        （本記事執筆時は「C:\Program Files\Java\jdk-23」）
        :::

        ```
        C:\Program Files\Java\jdk-23\bin
        ```

    - 「OK」を3回クリックして全ての画面を閉じる

4. インストールの確認
   - Windowsキー + R を押して「cmd」と入力
   - コマンドプロンプトで以下のコマンドを入力：
     ```
     java --version
     ```
   - JDKのバージョン情報が表示されればOK

### Macの場合

1. Oracle JDKのダウンロード
   - [Oracle JDK ダウンロードページ](https://www.oracle.com/java/technologies/downloads/)にアクセス
   - 「macOS」セクションを探す
   - 「Arm 64 DMG Installer」(M1/M2 Mac)または「x64 DMG Installer」(Intel Mac)をクリック

2. JDKのインストール
   - ダウンロードしたdmgファイルをダブルクリック
   - pkgファイルをダブルクリック
   - 「続ける」をクリックしてインストールを進める
   - 管理者パスワードの入力を求められたら入力

3. インストールの確認
   - ターミナルを開く（Launchpadから検索可能）
   - 以下のコマンドを入力：
     ```
     java --version
     ```
   - JDKのバージョン情報が表示されればOK

## 2. Visual Studio Codeのインストール

### Windowsの場合

1. VS Codeのダウンロード
   - [Visual Studio Code公式サイト](https://code.visualstudio.com/)にアクセス
   - 「Download for Windows」をクリック

2. インストール
   - ダウンロードしたexeファイルをダブルクリック
   - 「使用許諾契約書に同意します」にチェック
   - 「次へ」をクリック
   - インストール先は変更せずデフォルトのまま
   - 以下のオプションにチェックを入れることを推奨：
     - 「エクスプローラーのファイル コンテキスト メニューに "Code で開く"アクションを追加する」
     - 「エクスプローラーのディレクトリ コンテキスト メニューに "Code で開く"アクションを追加する」
     - 「PATHへの追加」
   - 「次へ」をクリックしてインストール完了

### Macの場合

1. VS Codeのダウンロード
   - [Visual Studio Code公式サイト](https://code.visualstudio.com/)にアクセス
   - 「Download for Mac」をクリック

2. インストール
   - ダウンロードしたzipファイルをダブルクリック
   - 解凍された「Visual Studio Code.app」をアプリケーションフォルダにドラッグ＆ドロップ

## 3. VS CodeのJava開発環境セットアップ

1. Java関連の拡張機能をインストール
   - VS Codeを起動
   - 左側のメニューから「拡張機能」アイコン（四角が4つのアイコン）をクリック
   - 検索バーで「Extension Pack for Java」を検索
   - 「Install」をクリック
   - インストール完了後、VS Codeの再起動を求められたら再起動

2. 動作確認
   - VS Codeを開く
   - 「ファイル」→「新規ファイル」を選択
   - 「HelloWorld.java」という名前で保存
   - 以下のコードを入力：
     ```java
     public class HelloWorld {
         public static void main(String[] args) {
             System.out.println("Hello, World!");
         }
     }
     ```
   - 右上の「実行」ボタン（三角形のアイコン）をクリック
   - 「Hello, World!」と表示されれば環境構築完了！

## トラブルシューティング

1. java --versionコマンドが認識されない場合
   - PCの再起動を試す
   - 環境変数の設定を再確認
   - JDKを一度アンインストールして再インストール

2. VS Codeで「実行」ボタンが表示されない場合
   - Extension Pack for Javaが正しくインストールされているか確認
   - VS Codeを再起動
   - ファイルの拡張子が.javaになっているか確認

3. その他の問題が発生した場合
   - エラーメッセージをそのままGoogle検索
   - PC を再起動
   - Java と VS Code を一度アンインストールして再インストール

これで開発環境のセットアップは完了です！何か問題が発生した場合は、上記のトラブルシューティングを参考にしてください。