# Hack Standard Library (HSL) 利用マニュアル

## 目次

**【基本操作】**
1. [システム概要](#1-システム概要)
2. [セットアップ手順](#2-セットアップ手順)
3. [基本的な使い方](#3-基本的な使い方)

**【開発フローに沿った機能】**
4. [【STEP1】データ変換機能（Vec/Dict/Keyset操作）](#4-step1データ変換機能vecdictkeyset操作)
5. [【STEP2-3】文字列処理機能（Str操作）](#5-step2-3文字列処理機能str操作)
6. [【STEP3-4】非同期処理機能（Async操作）](#6-step3-4非同期処理機能async操作)
7. [【STEP4-5】I/O・ファイル処理機能](#7-step4-5ioファイル処理機能)

**【サポート機能】**
8. [数学関数（Math）](#8-数学関数math)
9. [正規表現処理（Regex）](#9-正規表現処理regex)
10. [その他のユーティリティ](#10-その他のユーティリティ)

**【運用ガイド】**
11. [日常開発の流れ](#11-日常開発の流れ)
12. [よくある質問と対処法](#12-よくある質問と対処法)
13. [トラブルシューティング](#13-トラブルシューティング)

---

## 1. システム概要

### 1.1 Hack Standard Library (HSL) とは

Hack Standard Library（HSL）は、Hack言語プログラマー向けの一貫性のある、集中管理された、型安全なAPIセットを提供するライブラリです。特にHack配列（`vec`、`keyset`、`dict`）を扱う際に有用な機能を提供します。

**注意**: 2021年5月以降、HSLはHHVMとタイプチェッカーに組み込まれるよう移行中です。

### 1.2 本ライブラリで提供する主要機能

本ライブラリは、主に以下の機能カテゴリを提供します：

| 機能カテゴリ | 具体的な機能内容 |
|------------|----------------|
| **Vec操作** | vec型コレクションの結合、変換、選択、順序付け、分割などの操作 |
| **Dict操作** | dict型コレクションの変換、結合、選択、順序付け、イントロスペクションなどの操作 |
| **Keyset操作** | keyset型コレクションの変換、結合、選択、順序付けなどの操作 |
| **Str操作** | 文字列の変換、選択、分割、結合、フォーマット、イントロスペクションなどの操作 |
| **Math操作** | 数学的な計算、比較、定数、コンテナ操作 |
| **C (Container)操作** | コンテナに対する順序付け、イントロスペクション、選択、リダクション操作 |
| **Regex操作** | 正規表現によるパターンマッチングと例外処理 |
| **Random** | 乱数生成（SecureRandom、PseudoRandom） |
| **File I/O** | ファイルハンドル、一時ファイル、ロック機構などのファイル操作 |
| **I/O** | 読み取り/書き込みハンドル、バッファリング、パイプ、標準入出力などのI/O操作 |
| **Network** | TCP/UNIXソケット通信、サーバー、クライアント接続 |
| **OS操作** | プロセススポーン、一時ディレクトリ作成などのOS機能 |
| **Async** | 非同期プログラミング（Semaphore、Poll、Condition）サポート |
| **Locale** | ロケール関連の操作とカテゴリ管理 |

### 1.3 開発フロー概要

本ライブラリを使用した開発は、以下の流れで進行します：

```
+---------------------------------------------------------------------+
|                        開発フロー                                    |
+---------------------------------------------------------------------+
|                                                                     |
|  【STEP 1】データ変換処理の実装                                      |
|      - Vec/Dict/Keysetを使用したコレクション操作                     |
|      |                                                              |
|  【STEP 2】文字列処理の実装                                          |
|      - Str名前空間を使用した文字列操作                               |
|      |                                                              |
|  【STEP 3】非同期処理の実装                                          |
|      - Async名前空間を使用した並行処理制御                           |
|      |                                                              |
|  【STEP 4】I/O処理の実装                                             |
|      - ファイル・ネットワーク操作                                    |
|      |                                                              |
|  【STEP 5】テストと検証                                              |
|      - 型チェック、ユニットテストの実行                              |
|                                                                     |
+---------------------------------------------------------------------+
```

**役割別の業務概要：**

| 役割 | 主な作業 |
|------|---------|
| **アプリケーション開発者** | HSL関数を使用したデータ処理、文字列操作、非同期処理の実装 |
| **ライブラリ開発者** | HSLの機能拡張、バグ修正、テストの作成 |

### 1.4 主な機能

| 機能 | 説明 | 開発フローでの位置 |
|------|------|------------------|
| Vec/Dict/Keyset操作 | コレクションの変換・操作 | STEP 1 |
| Str操作 | 文字列の変換・検索・分割 | STEP 2 |
| Async操作 | 非同期処理の制御 | STEP 3 |
| File/IO操作 | ファイル・入出力処理 | STEP 4 |
| Math操作 | 数学的計算 | 随時利用 |
| Regex操作 | 正規表現処理 | 随時利用 |

### 1.5 ユーザー種別

本ライブラリには以下のユーザー種別があります：

| ユーザー種別 | 説明 |
|-------------|------|
| アプリケーション開発者 | HSLの関数を使用してアプリケーションを開発する開発者 |
| ライブラリ開発者 | HSL自体の開発・保守を行う開発者 |

### 1.6 動作環境

推奨環境：
- HHVM（nightlyバージョン推奨）
- Watchman（ファイル監視用）
- 対応ロケール：en_US、fr_FR、tr_TR、da_DK

---

## 2. セットアップ手順

### 2.1 開発環境の構築

#### DevContainerを使用する場合

1. VS Codeの「Remote - Containers」拡張機能をインストールします
2. プロジェクトディレクトリを開きます
3. `.devcontainer/devcontainer.json`で定義された環境が自動的にセットアップされます

DevContainerは以下を自動的にセットアップします：
- hhvm/hhvm:nightly イメージ
- Watchman
- 必要なロケール（en、fr、tr、da）

#### 手動セットアップ

1. HHVMをインストールします

```bash
apt-get update && apt-get install -y hhvm
```

2. Watchmanをインストールします

```bash
apt-get install -y watchman
```

3. ロケールをインストールします

```bash
apt-get install -y locales
locale-gen en_US en_US.UTF-8 fr_FR fr_FR.UTF-8 tr_TR tr_TR.UTF-8 da_DK da_DK.UTF-8
```

### 2.2 環境の確認

セットアップ完了後、以下のコマンドで環境を確認します：

```bash
# HHVMのバージョン確認
hhvm --version

# 型チェッカーの確認
hh_client
```

---

## 3. 基本的な使い方

### 3.1 名前空間のインポート

HSLの機能を使用するには、適切な名前空間をインポートします：

```hack
use namespace HH\Lib\Vec;
use namespace HH\Lib\Dict;
use namespace HH\Lib\Keyset;
use namespace HH\Lib\Str;
use namespace HH\Lib\Math;
use namespace HH\Lib\C;
use namespace HH\Lib\Regex;
```

### 3.2 基本的な使用例

```hack
// Vec操作の例
$numbers = vec[1, 2, 3, 4, 5];
$doubled = Vec\map($numbers, $x ==> $x * 2);
// 結果: vec[2, 4, 6, 8, 10]

// Str操作の例
$text = "Hello, World!";
$lower = Str\lowercase($text);
// 結果: "hello, world!"

// Dict操作の例
$users = dict['alice' => 1, 'bob' => 2];
$filtered = Dict\filter($users, $v ==> $v > 1);
// 結果: dict['bob' => 2]
```

---

## 4. 【STEP1】データ変換機能（Vec/Dict/Keyset操作）

> **開発フローでの位置**: データ処理の基盤となるコレクション操作。アプリケーション開発の最初のステップとして、データの変換・加工に使用します。

### 4.1 Vec操作

vec型コレクションに対する操作を提供します。

#### 主要な関数

| 関数名 | 説明 | 使用例 |
|--------|------|--------|
| `Vec\map` | 各要素に関数を適用 | `Vec\map(vec[1, 2], $x ==> $x * 2)` |
| `Vec\filter` | 条件に合う要素を抽出 | `Vec\filter(vec[1, 2, 3], $x ==> $x > 1)` |
| `Vec\flatten` | ネストしたコレクションを平坦化 | `Vec\flatten(vec[vec[1, 2], vec[3, 4]])` |
| `Vec\concat` | 複数のvecを結合 | `Vec\concat(vec[1, 2], vec[3, 4])` |
| `Vec\slice` | 指定範囲の要素を取得 | `Vec\slice(vec[1, 2, 3, 4], 1, 2)` |
| `Vec\sort` | 要素をソート | `Vec\sort(vec[3, 1, 2])` |
| `Vec\reverse` | 要素を逆順に | `Vec\reverse(vec[1, 2, 3])` |

#### 使用手順

1. `use namespace HH\Lib\Vec;` でインポートします
2. 対象のvecと変換関数を指定して関数を呼び出します
3. 新しいvecが返却されます（元のvecは変更されません）

**注意点・Tips**:
- vec操作は純粋関数であり、元のコレクションを変更しません
- 大量のデータを扱う場合は、パフォーマンスに注意してください

### 4.2 Dict操作

dict型コレクションに対する操作を提供します。

#### 主要な関数

| 関数名 | 説明 | 使用例 |
|--------|------|--------|
| `Dict\map` | 各値に関数を適用 | `Dict\map(dict['a' => 1], $v ==> $v * 2)` |
| `Dict\filter` | 条件に合う要素を抽出 | `Dict\filter(dict['a' => 1, 'b' => 2], $v ==> $v > 1)` |
| `Dict\filter_keys` | キー条件でフィルタ | `Dict\filter_keys($dict, $k ==> $k !== 'x')` |
| `Dict\merge` | 複数のdictをマージ | `Dict\merge(dict['a' => 1], dict['b' => 2])` |
| `Dict\drop` | 指定キーを除外 | `Dict\drop($dict, keyset['a', 'b'])` |

### 4.3 Keyset操作

keyset型コレクションに対する操作を提供します。

#### 主要な関数

| 関数名 | 説明 | 使用例 |
|--------|------|--------|
| `Keyset\filter` | 条件に合う要素を抽出 | `Keyset\filter(keyset[1, 2, 3], $x ==> $x > 1)` |
| `Keyset\diff` | 差集合を取得 | `Keyset\diff(keyset[1, 2, 3], keyset[2])` |
| `Keyset\intersect` | 積集合を取得 | `Keyset\intersect(keyset[1, 2], keyset[2, 3])` |
| `Keyset\union` | 和集合を取得 | `Keyset\union(keyset[1, 2], keyset[3, 4])` |

---

## 5. 【STEP2-3】文字列処理機能（Str操作）

> **開発フローでの位置**: データの文字列表現を処理するステップ。ユーザー入力の検証、出力のフォーマットなどに使用します。

### 5.1 文字列の変換

| 関数名 | 説明 | 使用例 |
|--------|------|--------|
| `Str\lowercase` | 小文字に変換 | `Str\lowercase("HELLO")` |
| `Str\uppercase` | 大文字に変換 | `Str\uppercase("hello")` |
| `Str\capitalize` | 先頭を大文字に | `Str\capitalize("hello")` |
| `Str\capitalize_words` | 各単語の先頭を大文字に | `Str\capitalize_words("hello world")` |
| `Str\trim` | 空白を除去 | `Str\trim("  hello  ")` |
| `Str\trim_left` | 左側の空白を除去 | `Str\trim_left("  hello")` |
| `Str\trim_right` | 右側の空白を除去 | `Str\trim_right("hello  ")` |
| `Str\reverse` | 文字列を逆順に | `Str\reverse("hello")` |

### 5.2 文字列の検査

| 関数名 | 説明 | 使用例 |
|--------|------|--------|
| `Str\ends_with` | 末尾が一致するか | `Str\ends_with("hello.txt", ".txt")` |
| `Str\ends_with_ci` | 末尾が一致するか（大文字小文字無視） | `Str\ends_with_ci("hello.TXT", ".txt")` |
| `Str\starts_with` | 先頭が一致するか | `Str\starts_with("hello", "he")` |
| `Str\starts_with_ci` | 先頭が一致するか（大文字小文字無視） | `Str\starts_with_ci("HELLO", "he")` |
| `Str\is_empty` | 空文字列かどうか | `Str\is_empty("")` |

### 5.3 文字列の操作

| 関数名 | 説明 | 使用例 |
|--------|------|--------|
| `Str\join` | 配列を結合 | `Str\join(vec["a", "b"], ", ")` |
| `Str\format` | フォーマット | `Str\format("Hello, %s!", "World")` |
| `Str\format_number` | 数値をフォーマット | `Str\format_number(1234.5, 2)` |
| `Str\splice` | 部分文字列を置換 | `Str\splice("hello", 1, 2, "X")` |
| `Str\pad_left` | 左側をパディング | `Str\pad_left("5", 3, "0")` |
| `Str\replace_every` | 複数の置換を実行 | `Str\replace_every($str, dict["a" => "b"])` |

**注意点・Tips**:
- 大文字小文字を無視する関数には `_ci` サフィックスが付いています
- ロケール対応版には `_l` サフィックスが付いています

---

## 6. 【STEP3-4】非同期処理機能（Async操作）

> **開発フローでの位置**: 並行処理の制御を行うステップ。複数のI/O処理を効率的に実行するために使用します。

### 6.1 Semaphore（セマフォ）

同時実行数を制限するための機能です。

**使用シーン**:
- 外部APIへのリクエストを同時に最大N件に制限したい場合
- データベース接続数を一定数以下に抑えたい場合
- ファイル処理やネットワーク処理の並行度を制御したい場合

**使用手順**:

1. Semaphoreインスタンスを作成します

```hack
use namespace HH\Lib\Async;

$semaphore = new Async\Semaphore(
  3, // 同時実行数の上限
  async ($item) ==> {
    // 各アイテムに対する処理
    await process_item($item);
  }
);
```

2. `waitForAsync`で処理を実行します

```hack
$results = await Vec\map_async(
  $items,
  async ($item) ==> await $semaphore->waitForAsync($item)
);
```

**注意点・Tips**:
- 同時実行数（concurrentLimit）は1以上の整数を指定してください
- Semaphoreインスタンスは再利用可能です

### 6.2 Poll（ポーリング）

複数の非同期処理を完了順に取得するための機能です。

**使用シーン**:
- 複数のバックエンドへの並列リクエストで、最初に応答したものから処理したい場合
- ストリーミング形式で結果を返却したい場合

**使用手順**:

1. Pollインスタンスを作成します

```hack
use namespace HH\Lib\Async;

$poll = Async\Poll::from(vec[
  fetch_data_a(),
  fetch_data_b(),
  fetch_data_c(),
]);
```

2. `foreach await`で結果を取得します

```hack
foreach ($poll await as $result) {
  // 完了順に結果を処理
  process_result($result);
}
```

**注意点・Tips**:
- 結果はAwaitableの完了順に返却されます（追加順ではありません）
- Pollは重量級のメカニズムです。レイテンシが10ms未満の処理には推奨しません

### 6.3 Condition（条件変数）

非同期タスク間で完了通知と結果の受け渡しを行うための機能です。

**使用手順**:

1. Conditionインスタンスを作成します

```hack
use namespace HH\Lib\Async;

$condition = new Async\Condition<string>();
```

2. 通知側で`succeed`または`fail`を呼び出します

```hack
$condition->succeed("result");
// または
$condition->fail(new Exception("error"));
```

3. 待機側で`waitForNotificationAsync`を呼び出します

```hack
$result = await $condition->waitForNotificationAsync($notifiers);
```

**注意点・Tips**:
- `succeed`または`fail`は一度だけ呼び出し可能です
- 通知が待機前に発生しても正しく動作します

---

## 7. 【STEP4-5】I/O・ファイル処理機能

> **開発フローでの位置**: ファイルやネットワークとのI/O処理を行うステップ。データの永続化や外部通信に使用します。

### 7.1 ファイル操作

#### ファイルの読み書き

```hack
use namespace HH\Lib\File;

// ファイルを開く（読み取り）
$handle = File\open_read_only("/path/to/file.txt");
$content = await $handle->readAllAsync();

// ファイルを開く（書き込み）
$handle = File\open_write_only("/path/to/file.txt", File\WriteMode::TRUNCATE);
await $handle->writeAllAsync("content");
```

#### 一時ファイル

```hack
use namespace HH\Lib\File;

// 一時ファイルを作成
$temp = File\temporary_file();
$handle = $temp->getHandle();
await $handle->writeAllAsync("temporary content");
```

### 7.2 標準入出力

```hack
use namespace HH\Lib\IO;

// 標準出力への書き込み
$stdout = IO\request_output();
await $stdout->writeAllAsync("Hello, World!\n");

// 標準入力からの読み取り
$stdin = IO\request_input();
$input = await $stdin->readAllAsync();
```

### 7.3 BufferedReader

行単位でファイルを読み取るための機能です。

```hack
use namespace HH\Lib\IO;

$handle = File\open_read_only("/path/to/file.txt");
$reader = new IO\BufferedReader($handle);

// 1行読み取り
$line = await $reader->readLineAsync();

// イテレータとして使用
foreach ($reader->linesIterator() await as $line) {
  process_line($line);
}
```

### 7.4 パイプ

プロセス間通信のためのパイプ機能です。

```hack
use namespace HH\Lib\IO;

list($read_handle, $write_handle) = IO\pipe();

// 書き込み側
await $write_handle->writeAllAsync("message");
$write_handle->close();

// 読み取り側
$content = await $read_handle->readAllAsync();
```

---

## 8. 数学関数（Math）

### 8.1 基本的な計算

| 関数名 | 説明 | 使用例 |
|--------|------|--------|
| `Math\abs` | 絶対値 | `Math\abs(-5)` |
| `Math\ceil` | 切り上げ | `Math\ceil(4.3)` |
| `Math\floor` | 切り捨て | `Math\floor(4.7)` |
| `Math\round` | 四捨五入 | `Math\round(4.5)` |
| `Math\max` | 最大値 | `Math\max(1, 2, 3)` |
| `Math\min` | 最小値 | `Math\min(1, 2, 3)` |

### 8.2 コンテナ操作

| 関数名 | 説明 | 使用例 |
|--------|------|--------|
| `Math\sum` | 合計 | `Math\sum(vec[1, 2, 3])` |
| `Math\mean` | 平均 | `Math\mean(vec[1, 2, 3])` |
| `Math\median` | 中央値 | `Math\median(vec[1, 2, 3])` |
| `Math\max_by` | 関数適用後の最大値の要素 | `Math\max_by($items, $x ==> $x['score'])` |
| `Math\min_by` | 関数適用後の最小値の要素 | `Math\min_by($items, $x ==> $x['score'])` |

---

## 9. 正規表現処理（Regex）

### 9.1 基本的な使い方

```hack
use namespace HH\Lib\Regex;

// パターンマッチング
$match = Regex\first_match($string, re"/\d+/");
if ($match is nonnull) {
  $matched_text = $match[0];
}

// すべてのマッチを取得
$matches = Regex\every_match($string, re"/\d+/");

// 置換
$replaced = Regex\replace($string, re"/\d+/", "X");
```

### 9.2 例外処理

```hack
use namespace HH\Lib\Regex;

try {
  $match = Regex\first_match($string, re"/invalid(/");
} catch (Regex\Exception $e) {
  // 正規表現エラーの処理
}
```

---

## 10. その他のユーティリティ

### 10.1 C (Container) 操作

コンテナ全般に対する操作を提供します。

| 関数名 | 説明 | 使用例 |
|--------|------|--------|
| `C\count` | 要素数を取得 | `C\count(vec[1, 2, 3])` |
| `C\first` | 最初の要素を取得 | `C\first(vec[1, 2, 3])` |
| `C\last` | 最後の要素を取得 | `C\last(vec[1, 2, 3])` |
| `C\contains` | 要素が含まれるか | `C\contains(vec[1, 2, 3], 2)` |
| `C\reduce` | 畳み込み | `C\reduce(vec[1, 2, 3], ($acc, $x) ==> $acc + $x, 0)` |

### 10.2 乱数生成

```hack
use namespace HH\Lib\SecureRandom;
use namespace HH\Lib\PseudoRandom;

// セキュアな乱数
$secure_int = SecureRandom\int(1, 100);
$secure_string = SecureRandom\string(32);

// 疑似乱数
$pseudo_int = PseudoRandom\int(1, 100);
```

---

## 11. 日常開発の流れ

本セクションでは、開発フローに沿った日常的な作業の流れを説明します。

```
開発フロー概要（再掲）
============================================================
【STEP 1】データ変換処理の実装 -> 4章参照
    |
【STEP 2】文字列処理の実装 -> 5章参照
    |
【STEP 3】非同期処理の実装 -> 6章参照
    |
【STEP 4】I/O処理の実装 -> 7章参照
    |
【STEP 5】テストと検証
============================================================
```

### 11.1 【開発者】STEP1: データ変換処理の実装

アプリケーション開発時に、データの変換・加工が必要な場合はVec/Dict/Keyset操作を使用します。

**操作手順**:

1. 必要な名前空間をインポートします
2. 入力データの型を確認します
3. 適切な変換関数を選択して適用します
4. 結果を次の処理に渡します

### 11.2 【開発者】STEP2: 文字列処理の実装

ユーザー入力の検証や出力のフォーマットが必要な場合はStr操作を使用します。

**操作手順**:

1. `use namespace HH\Lib\Str;` でインポートします
2. 入力文字列に対して必要な変換・検査を適用します
3. 結果を検証します

### 11.3 【開発者】STEP3: 非同期処理の実装

複数のI/O処理を並行して実行する場合はAsync操作を使用します。

**操作手順**:

1. 同時実行数の制限が必要な場合はSemaphoreを使用します
2. 完了順に結果を処理したい場合はPollを使用します
3. タスク間の同期が必要な場合はConditionを使用します

### 11.4 【開発者】STEP4-5: I/O処理の実装とテスト

ファイルやネットワークとのI/O処理を実装し、テストを実行します。

**操作手順**:

1. ファイル操作には`HH\Lib\File`名前空間を使用します
2. 標準入出力には`HH\Lib\IO`名前空間を使用します
3. 型チェックを実行します: `hh_client`
4. テストを実行します: `./minitest.sh`

---

## 12. よくある質問と対処法

### 12.1 型チェックに関するQ&A

**Q: 型エラーが発生します**

A: 以下を確認してください：
- 関数の引数の型が正しいか確認してください
- 戻り値の型を適切にハンドリングしているか確認してください
- `hh_client` を実行して詳細なエラーメッセージを確認してください

### 12.2 パフォーマンスに関するQ&A

**Q: Vec/Dict操作が遅いです**

A: 以下を検討してください：
- 大量のデータを扱う場合は、処理を分割することを検討してください
- 不要な中間コレクションの作成を避けてください
- `Vec\filter` と `Vec\map` を連鎖する代わりに、単一のループで処理することを検討してください

**Q: Pollを使用するとCPU使用率が高くなります**

A: 以下を確認してください：
- Pollは重量級のメカニズムです。レイテンシが10ms未満の処理には使用を避けてください
- 大量の中間結果の並び替えが必要な場合は、別のアプローチを検討してください

### 12.3 非同期処理に関するQ&A

**Q: Semaphoreで同時実行数が制限されません**

A: 以下を確認してください：
- Semaphoreインスタンスが正しく共有されているか確認してください
- `waitForAsync` を正しく `await` しているか確認してください

---

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

### 13.1 エラーメッセージと対処法

| エラーメッセージ | 原因 | 対処法 |
|----------------|------|--------|
| InvariantViolation: concurrentLimit must be greater than 0 | Semaphoreの同時実行数に0以下を指定 | 1以上の整数を指定してください |
| InvariantViolation: only call succeed or fail once | Conditionのsucceed/failを2回呼び出した | 一度だけ呼び出すように修正してください |
| Regex\Exception | 正規表現パターンが不正 | パターンの構文を確認してください |

### 13.2 よくあるトラブルと解決方法

**トラブル**: HHVMが起動しない

**解決方法**:
1. HHVMのインストールを確認: `hhvm --version`
2. 必要な依存関係がインストールされているか確認
3. ログファイルを確認して詳細なエラー情報を取得

**トラブル**: 型チェックが失敗する

**解決方法**:
1. `hh_client` を実行してエラー詳細を確認
2. Watchmanが正常に動作しているか確認: `watchman watch-list`
3. `.hhconfig` ファイルが存在するか確認

### 13.3 サポートへの連絡方法

HSLに関する問題や質問は、以下の方法で報告できます：

- GitHub Issues: [https://github.com/facebook/hhvm/issues](https://github.com/facebook/hhvm/issues)
- HSL本体への貢献: HHVMリポジトリの `hphp/hsl` サブディレクトリに対してPRを作成

---

## 改訂履歴

| 版数 | 改訂日 | 改訂内容 |
|-----|--------|---------|
| 1.0 | 2026-02-21 | 初版作成 |

---

*本マニュアルは、Hack Standard Library (HSL) のエンドユーザー向け利用マニュアルです。*
*ライブラリの更新により、APIや動作が変更される場合があります。*
