<commit_before># EGG ハンズオン #3

## Google Cloud Platform（GCP）プロジェクトの選択

ハンズオンを行う GCP プロジェクトを作成し、 GCP プロジェクトを選択して **Start/開始** をクリックしてください。

**なるべく新しいプロジェクトを作成してください。**

<walkthrough-project-setup>
</walkthrough-project-setup>

## [解説] ハンズオンの内容

### **内容と目的**

本ハンズオンでは、Cloud Spanner を触ったことない方向けに、インスタンスの作成から始め、Cloud Spanner に接続し API を使ってクエリする簡易アプリのビルドや、 SQL でクエリをする方法などを行います。

本ハンズオンを通じて、 Cloud Spanner を使ったアプリケーション開発における、最初の 1 歩目のイメージを掴んでもらうことが目的です。


### **前提条件**

本ハンズオンははじめて Cloud Spanner を触れれる方を想定しておりますが、Cloud Spanner の基本的なコンセプトや、主キーによって格納データが分散される仕組みなどは、ハンズオン中では説明しません。
事前知識がなくとも本ハンズオンの進行には影響ありませんが、Cloud Spanner の基本コンセプトやデータ構造については、Coursera などの教材を使い学んでいただくことをお勧めします。 


## [解説] 1. ハンズオンで使用するスキーマの説明

今回のハンズオンでは以下のように、3 つのテーブルを利用します。これは、あるゲームの開発において、バックエンド データベースとして Cloud Spanner を使ったことを想定しており、ゲームのプレイヤー情報や、アイテム情報を管理するテーブルに相当するものを表現しています。

![スキーマ](https://storage.googleapis.com/egg-resources/egg3/public/1-1.png "今回利用するスキーマ")

このテーブルの DDL は以下のとおりです、実際にテーブルを CREATE する際に、この DDL は再度掲載します。

```sql
CREATE TABLE players (
player_id STRING(36) NOT NULL,
name STRING(MAX) NOT NULL,
level INT64 NOT NULL,
money INT64 NOT NULL,
) PRIMARY KEY(player_id);
```

```sql
CREATE TABLE items (
item_id INT64 NOT NULL,
name STRING(MAX) NOT NULL,
price INT64 NOT NULL,
) PRIMARY KEY(item_id);
```

```sql
CREATE TABLE player_items (
player_id STRING(36) NOT NULL,
item_id INT64 NOT NULL,
quantity INT64 NOT NULL,
FOREIGN KEY(item_id) REFERENCES items(item_id)
) PRIMARY KEY(player_id, item_id),
INTERLEAVE IN PARENT players ON DELETE CASCADE;
```


## [演習] 2. Cloud Spanner インスタンスの作成

現在 Cloud Shell と Editor の画面が開かれている状態だと思いますので、まず [GCPコンソール](https://console.cloud.google.com/) を開きます。


### **Cloud Spanner インスタンスの作成**

![](https://storage.googleapis.com/egg-resources/egg3/public/2-1.png)

1. ナビゲーションメニューから「Spanner」を選択

![](https://storage.googleapis.com/egg-resources/egg3/public/2-2.png)

2. 「インスタンスを作成」を選択

### **情報の入力**

![](https://storage.googleapis.com/egg-resources/egg3/public/2-3.png)

以下の内容で設定して「作成」を選択します。
1. インスタンス名：dev-instance
2. インスタンスID：dev-instance
3. 「リージョン」を選択
4. 「asia-northeast1 (Tokyo) 」を選択
5. ノードの割り当て：1
6. 「作成」を選択

### **インスタンスの作成完了**
以下の画面に遷移し、作成完了です。
どのような情報が見られるか確認してみましょう。

![](https://storage.googleapis.com/egg-resources/egg3/public/2-4.png)

### **スケールアウトとスケールインについて**

Cloud Spanner インスタンスノード数を変更したい場合、編集画面を開いてノードの割り当て数を変更することで、かんたんに行われます
ノード追加であってもノード削減であっても、一切のダウンタイムなく実施することができます。

![](https://storage.googleapis.com/egg-resources/egg3/public/2-5.png)

## [演習] 3. 接続用テスト環境作成 Cloud Shell 上で構築

作成した Cloud Spanner に対して各種コマンドを実行するために Cloud Shell を準備します。
今回はハンズオンの冒頭で起動した Cloud Shell をそのまま使いましょう。

![](https://storage.googleapis.com/egg-resources/egg3/public/3-3.png)

続いて、環境変数 `PROJECT_ID` に、各自で利用しているプロジェクトのIDを格納しておきます。以下のコマンドを、Cloud Shell のターミナルで実行してください。

```bash
export PROJECT_ID=$(gcloud config list project --format "value(core.project)")
```

以下のコマンドで、正しく格納されているか確認してください。

```bash<commit_msg>Add explanation for when the project ID is not set<commit_after># EGG ハンズオン #3

## Google Cloud Platform（GCP）プロジェクトの選択

ハンズオンを行う GCP プロジェクトを作成し、 GCP プロジェクトを選択して **Start/開始** をクリックしてください。

**なるべく新しいプロジェクトを作成してください。**

<walkthrough-project-setup>
</walkthrough-project-setup>

## [解説] ハンズオンの内容

### **内容と目的**

本ハンズオンでは、Cloud Spanner を触ったことない方向けに、インスタンスの作成から始め、Cloud Spanner に接続し API を使ってクエリする簡易アプリのビルドや、 SQL でクエリをする方法などを行います。

本ハンズオンを通じて、 Cloud Spanner を使ったアプリケーション開発における、最初の 1 歩目のイメージを掴んでもらうことが目的です。


### **前提条件**

本ハンズオンははじめて Cloud Spanner を触れれる方を想定しておりますが、Cloud Spanner の基本的なコンセプトや、主キーによって格納データが分散される仕組みなどは、ハンズオン中では説明しません。
事前知識がなくとも本ハンズオンの進行には影響ありませんが、Cloud Spanner の基本コンセプトやデータ構造については、Coursera などの教材を使い学んでいただくことをお勧めします。 


## [解説] 1. ハンズオンで使用するスキーマの説明

今回のハンズオンでは以下のように、3 つのテーブルを利用します。これは、あるゲームの開発において、バックエンド データベースとして Cloud Spanner を使ったことを想定しており、ゲームのプレイヤー情報や、アイテム情報を管理するテーブルに相当するものを表現しています。

![スキーマ](https://storage.googleapis.com/egg-resources/egg3/public/1-1.png "今回利用するスキーマ")

このテーブルの DDL は以下のとおりです、実際にテーブルを CREATE する際に、この DDL は再度掲載します。

```sql
CREATE TABLE players (
player_id STRING(36) NOT NULL,
name STRING(MAX) NOT NULL,
level INT64 NOT NULL,
money INT64 NOT NULL,
) PRIMARY KEY(player_id);
```

```sql
CREATE TABLE items (
item_id INT64 NOT NULL,
name STRING(MAX) NOT NULL,
price INT64 NOT NULL,
) PRIMARY KEY(item_id);
```

```sql
CREATE TABLE player_items (
player_id STRING(36) NOT NULL,
item_id INT64 NOT NULL,
quantity INT64 NOT NULL,
FOREIGN KEY(item_id) REFERENCES items(item_id)
) PRIMARY KEY(player_id, item_id),
INTERLEAVE IN PARENT players ON DELETE CASCADE;
```


## [演習] 2. Cloud Spanner インスタンスの作成

現在 Cloud Shell と Editor の画面が開かれている状態だと思いますので、まず [GCPコンソール](https://console.cloud.google.com/) を開きます。


### **Cloud Spanner インスタンスの作成**

![](https://storage.googleapis.com/egg-resources/egg3/public/2-1.png)

1. ナビゲーションメニューから「Spanner」を選択

![](https://storage.googleapis.com/egg-resources/egg3/public/2-2.png)

2. 「インスタンスを作成」を選択

### **情報の入力**

![](https://storage.googleapis.com/egg-resources/egg3/public/2-3.png)

以下の内容で設定して「作成」を選択します。
1. インスタンス名：dev-instance
2. インスタンスID：dev-instance
3. 「リージョン」を選択
4. 「asia-northeast1 (Tokyo) 」を選択
5. ノードの割り当て：1
6. 「作成」を選択

### **インスタンスの作成完了**
以下の画面に遷移し、作成完了です。
どのような情報が見られるか確認してみましょう。

![](https://storage.googleapis.com/egg-resources/egg3/public/2-4.png)

### **スケールアウトとスケールインについて**

Cloud Spanner インスタンスノード数を変更したい場合、編集画面を開いてノードの割り当て数を変更することで、かんたんに行われます
ノード追加であってもノード削減であっても、一切のダウンタイムなく実施することができます。

![](https://storage.googleapis.com/egg-resources/egg3/public/2-5.png)

## [演習] 3. 接続用テスト環境作成 Cloud Shell 上で構築

作成した Cloud Spanner に対して各種コマンドを実行するために Cloud Shell を準備します。

今回はハンズオンの冒頭で起動した Cloud Shell が開かれていると思います。今回のハンズオンで使うパスと、プロジェクト ID が正しく表示されていることを確認してください。以下のように、青文字のパスに続いて、かっこにくくられてプロジェクトIDが黄色文字で表示されています。

![](https://storage.googleapis.com/egg-resources/egg3/public/3-2.png)

もしプロジェクトIDが表示されていない場合、以下の図の様に、青字のパスのみが表示されている状態だと思います。以下のコマンドを Cloud Shell で実行し、プロジェクトIDを設定してください。

![](https://storage.googleapis.com/egg-resources/egg3/public/3-3.png)

```bash
gcloud config set project 今回使うGCPのプロジェクトID
``` 


続いて、環境変数 `PROJECT_ID` に、各自で利用しているプロジェクトのIDを格納しておきます。以下のコマンドを、Cloud Shell のターミナルで実行してください。

```bash
export PROJECT_ID=$(gcloud config list project --format "value(core.project)")
```

以下のコマンドで、正しく格納されているか確認してください。
echo の結果が空の場合、1つ前の手順で gcloud コマンドでプロジェクトIDを取得できていません。gcloud config set project コマンドで現在お使いのプロジェクトを正しく設定してください。

```bash
{'fraction_non_alphanumeric': 0.12385466034755134, 'fraction_numerical': 0.017377567140600316, 'mean_word_length': 6.7113276492082825, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 17, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7611745', 'n_tokens_mistral': 4139, 'n_tokens_neox': 3843, 'n_words': 461}