Cloud Run で Gemini CLI を使用した AlloyDB 向け MCP Toolbox によるデータドリブン開発の加速

1. 概要

AlloyDB を使用してファセット フィルタリングとベクトル検索を組み合わせた動的なハイブリッド小売エクスペリエンスを構築するという記事を覚えていますか?このアプリケーションは、最新の小売業のニーズを強力に実証するものでしたが、それを実現し、反復処理するには、かなりの開発作業が必要でした。フルスタック デベロッパーにとって、コードエディタとデータベース ツールの間を頻繁に行き来することは、イノベーションとデータの理解という重要なプロセスを遅らせるボトルネックになることがよくあります。

解決策

まさに、高速アプリケーション開発の真価が発揮されるのはこのときです。直感的な Gemini CLI からアクセスできる MCP(Modern Cloud Platform)ツールボックスが、私のツールキットに不可欠な一部となった理由を説明します。統合開発環境(IDE)内で、AlloyDB インスタンスとのシームレスなやり取り、クエリの作成、データセットの把握を直接行うことができます。これは単に利便性を高めるだけでなく、開発ライフサイクルの摩擦を根本的に減らし、外部ツールとの格闘ではなく、革新的な機能の構築に集中できるようにするためのものです。

小売業の e コマースアプリのコンテキストでは、商品データの効率的なクエリ、複雑なフィルタリングの処理、ベクトル検索のニュアンスの活用が必要だったため、データベース操作を迅速に反復処理できることが最も重要でした。Gemini CLI を搭載した MCP Toolbox は、このプロセスを簡素化するだけでなく、アプリケーションの基盤となるデータベース ロジックの探索、テスト、改善の方法を変革し、加速させます。この画期的な組み合わせによって、フルスタック開発がどのように高速化、スマート化、快適化されるのかを見ていきましょう。

学習内容と作成するアプリの概要

Gemini CLI を利用した IDE 内の MCP ツールボックスを使用する Retail Search アプリケーション。次の分野について考えます。

  1. MCP ツールボックスを IDE に直接統合して、AlloyDB とシームレスにやり取りする方法。
  2. Gemini CLI を使用して小売データに対して SQL クエリを作成して実行する実践的な例。
  3. Gemini CLI を使用して小売業の e コマース データセットを操作し、通常は別のツールが必要となるクエリを作成して、結果をすぐに確認します。
  4. テーブル構造の確認からデータの簡単な健全性チェックの実行まで、IDE 内の使い慣れたコマンドライン インターフェースを使用して、データをプローブして理解する新しい方法を見つけます。
  5. この高速化されたデータベース ワークフローが、フルスタック開発サイクルの短縮にどのように直接貢献し、迅速なプロトタイピングとイテレーションを可能にするか。

Techstack

使用しているもの:

  • AlloyDB for database
  • アプリケーションからデータベースの高度な生成機能と AI 機能を抽象化する MCP ツールボックス
  • サーバーレス デプロイ用の Cloud Run。
  • Gemini CLI を使用して、データセットを理解して分析し、小売業者の e コマース アプリケーションのデータベース部分を構築します。

要件

  • ブラウザ(ChromeFirefox など)
  • 課金を有効にした Google Cloud プロジェクト

2. 始める前に

プロジェクトを作成する

  1. Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します。
  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

Google Cloud クレジットの場合: Google Cloud クレジットを利用して開始する場合は、こちらのリンクからクレジットを利用してください。 こちら の手順に沿ってご利用ください。

  1. Google Cloud 上で動作するコマンドライン環境の Cloud Shell を使用します。Google Cloud コンソールの上部にある [Cloud Shell をアクティブにする] をクリックします。

[Cloud Shell をアクティブにする] ボタンの画像

  1. Cloud Shell に接続したら、次のコマンドを使用して、すでに認証が完了しており、プロジェクトがプロジェクト ID に設定されていることを確認します。
gcloud auth list
  1. Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project
  1. プロジェクトが設定されていない場合は、次のコマンドを使用して設定します。
gcloud config set project <YOUR_PROJECT_ID>
  1. 必要な API を有効にする: リンクにアクセスして、API を有効にします。

または、gcloud コマンドを使用することもできます。gcloud コマンドとその使用方法については、ドキュメントをご覧ください。

3. データベースの設定

このラボでは、e コマースデータのデータベースとして AlloyDB を使用します。クラスタを使用して、データベースやログなどのすべてのリソースを保持します。各クラスタには、データへのアクセス ポイントを提供するプライマリ インスタンスがあります。テーブルには実際のデータが格納されます。

ecommerce データセットが読み込まれる AlloyDB クラスタ、インスタンス、テーブルを作成しましょう。

クラスタとインスタンスを作成する

  1. Cloud コンソールの AlloyDB ページに移動します。Cloud コンソールでほとんどのページを簡単に見つけるには、コンソールの検索バーを使用して検索します。
  2. このページで [クラスタを作成] を選択します。

f76ff480c8c889aa.png

  1. 次のような画面が表示されます。次の値を使用してクラスタとインスタンスを作成します(リポジトリからアプリケーション コードを複製する場合は、値が一致していることを確認してください)。
  • クラスタ ID: "vector-cluster"
  • password: "alloydb"
  • PostgreSQL 15 / 最新の推奨バージョン
  • Region: "us-central1"
  • Networking: "default"

538dba58908162fb.png

  1. デフォルトのネットワークを選択すると、次のような画面が表示されます。

[接続の設定] を選択します。

7939bbb6802a91bf.png

  1. [自動的に割り振られた IP 範囲を使用する] を選択して、[続行] をクリックします。情報を確認したら、[接続を作成] を選択します。768ff5210e79676f.png
  2. ネットワークを設定したら、クラスタの作成を続行できます。[CREATE CLUSTER] をクリックして、次のようにクラスタの設定を完了します。

e06623e55195e16e.png

重要な注意事項:

  1. インスタンス ID を必ず変更してください(クラスタ / インスタンスの構成時に確認できます)。変更先は**vector-instance** です。変更できない場合は、以降のすべての参照で **インスタンス ID を使用** してください。
  2. クラスタの作成には 10 分ほどかかります。成功すると、作成したクラスタの概要を示す画面が表示されます。

4. データの取り込み

次に、店舗に関するデータを含むテーブルを追加します。AlloyDB に移動し、プライマリ クラスタと AlloyDB Studio を選択します。

847e35f1bf8a8bd8.png

インスタンスの作成が完了するまで待つ必要がある場合があります。準備ができたら、クラスタの作成時に作成した認証情報を使用して AlloyDB にログインします。PostgreSQL への認証には、次のデータを使用します。

  • ユーザー名: 「postgres
  • データベース: 「postgres
  • パスワード: 「alloydb

AlloyDB Studio への認証が成功すると、エディタに SQL コマンドが入力されます。最後のウィンドウの右にあるプラス記号を使用して、複数のエディタ ウィンドウを追加できます。

91a86d9469d499c4.png

必要に応じて [実行]、[形式]、[クリア] オプションを使用して、エディタ ウィンドウに AlloyDB のコマンドを入力します。

拡張機能を有効にする

このアプリのビルドには、拡張機能 pgvectorgoogle_ml_integration を使用します。pgvector 拡張機能を使用すると、ベクトル エンベディングを保存して検索できます。google_ml_integration 拡張機能は、Vertex AI 予測エンドポイントにアクセスして SQL で予測を取得するために使用する関数を提供します。次の DDL を実行して、これらの拡張機能を有効にします。

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;

データベースで有効になっている拡張機能を確認するには、次の SQL コマンドを実行します。

select extname, extversion from pg_extension;

テーブルを作成する

AlloyDB Studio で次の DDL ステートメントを使用してテーブルを作成できます。

CREATE TABLE apparels ( 
  id BIGINT, 
  category VARCHAR(100), 
  sub_category VARCHAR(50), 
  uri VARCHAR(200), 
  gsutil_uri VARCHAR(200),
  image VARCHAR(100), 
  content VARCHAR(2000), 
  pdt_desc VARCHAR(5000), 
  color VARCHAR(2000),
  gender VARCHAR(200),
  embedding vector(768),
  img_embeddings vector(1408),
  additional_specification VARCHAR(100000));

エンベディング列を使用すると、テキストのベクトル値を保存できます。

権限を付与

次のステートメントを実行して、「embedding」関数に対する実行権限を付与します。

GRANT EXECUTE ON FUNCTION embedding TO postgres;

AlloyDB サービス アカウントに Vertex AI ユーザーロールを付与する

Google Cloud IAM コンソールで、AlloyDB サービス アカウント(service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com のような形式)に「Vertex AI ユーザー」ロールへのアクセス権を付与します。PROJECT_NUMBER にはプロジェクト番号が設定されます。

または、Cloud Shell ターミナルから次のコマンドを実行することもできます。

PROJECT_ID=$(gcloud config get-value project)


gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"

データベースにデータを読み込む

  1. シートの insert scripts sql から上記のクエリエディタに insert クエリ ステートメントをコピーします。このユースケースのクイック デモ用に、10 ~ 50 個の挿入ステートメントをコピーできます。この [Selected Inserts 25-30 rows] タブには、選択した挿入のリストが表示されます。
  2. [実行] をクリックします。クエリの結果が [結果] テーブルに表示されます。

重要な注意事項:

挿入するレコードは 25 ~ 50 件のみをコピーし、カテゴリ、サブカテゴリ、色、性別の範囲からコピーするようにしてください。

5. データのエンベディングを作成する

現代の検索の真の革新は、キーワードだけでなく意味を理解することにあります。ここでエンベディングとベクトル検索が役立ちます。

事前トレーニング済みの言語モデルを使用して、商品紹介文とユーザーのクエリを高次元の数値表現(エンベディング)に変換しました。これらのエンベディングはセマンティックな意味を捉えるため、一致する単語を含むだけでなく、「意味が類似している」商品を見つけることができます。最初に、これらのエンベディングで直接ベクトル類似性検索を試してベースラインを確立し、パフォーマンスの最適化を行う前からセマンティック理解の威力を実証しました。

エンベディング列を使用すると、商品説明テキストのベクトル値を保存できます。img_embeddings 列を使用すると、画像エンベディング(マルチモーダル)を保存できます。これにより、テキストと画像の距離に基づく検索も使用できます。ただし、このラボではテキスト エンベディングのみを使用します。

SELECT embedding('text-embedding-005', 'AlloyDB is a managed, cloud-hosted SQL database service.');

これにより、クエリ内のサンプル テキストのエンベディング ベクトル(浮動小数点数の配列)が返されます。次のように表示されます。

25a1d7ef0e49e91e.png

abstract_embeddings ベクトル フィールドを更新する

次の DML を実行して、テーブル内のコンテンツの説明を対応するエンベディングで更新します。

UPDATE apparels SET embedding = embedding('text-embedding-005',pdt_desc)::vector 
WHERE pdt_desc IS NOT NULL;

Google Cloud のトライアル クレジットの請求先アカウントを使用している場合、少数のエンベディング(最大 20 ~ 25 個)を超えるエンベディングを生成できないことがあります。そのため、挿入スクリプトの行数を制限します。

画像エンベディング(マルチモーダル コンテキスト検索の実行用)を生成する場合は、次の更新も実行します。

update apparels set img_embeddings = ai.image_embedding(
  model_id => 'multimodalembedding@001',
  image => gsutil_uri,
  mimetype => 'image/jpg')       
where gsutil_uri is not null

6. データベース向け MCP ツールボックス(AlloyDB)

バックグラウンドでは、堅牢なツールと適切に構造化されたアプリケーションにより、スムーズな運用が実現されています。

データベース向け MCP(Model Context Protocol)ツールボックスを使用すると、生成 AI ツールとエージェント ツールを AlloyDB と簡単に統合できます。これは、接続プーリング、認証、データベース機能の AI エージェントや他のアプリケーションへの安全な公開を効率化するオープンソース サーバーとして機能します。

アプリケーションでは、すべてのインテリジェント ハイブリッド検索クエリの抽象化レイヤとして MCP Toolbox for Databases を使用しています。

以下の手順に沿って、ユースケースに合わせて Toolbox を設定してデプロイします。

MCP Toolbox for Databases でサポートされているデータベースの 1 つが AlloyDB であることがわかります。前のセクションで AlloyDB をすでにプロビジョニングしているため、ツールボックスの設定に進みましょう。

  1. Cloud Shell ターミナルに移動し、プロジェクトが選択されてターミナルのプロンプトに表示されていることを確認します。Cloud Shell ターミナルから次のコマンドを実行して、プロジェクト ディレクトリに移動します。
mkdir gemini-cli-project

cd gemini-cli-project
  1. 次のコマンドを実行して、新しいフォルダにツールボックスをダウンロードしてインストールします。
# see releases page for other versions
export VERSION=0.7.0
curl -O https://storage.googleapis.com/genai-toolbox/v$VERSION/linux/amd64/toolbox
chmod +x toolbox

これにより、現在のディレクトリにツールボックスが作成されます。ツールボックスのパスをコピーします。

  1. Cloud Shell エディタ(コード編集モード)に移動し、プロジェクトのルートフォルダ「gemini-cli-project」に「tools.yaml」というファイルを追加します。
sources:
    alloydb:
        kind: "alloydb-postgres"
        project: "<<YOUR_PROJECT_ID>>"
        region: "us-central1"
        cluster: "vector-cluster"
        instance: "vector-instance"
        database: "postgres"
        user: "postgres"
        password: "alloydb"


tools:
   get-apparels:
    kind: postgres-sql
    source: alloydb
    description: Get all apparel data.
    statement: |
      select id, content, uri, category, sub_category,color,gender from apparels;

tools.yaml について説明します。

ソースは、ツールが操作できるさまざまなデータソースを表します。ソースは、ツールが操作できるデータソースを表します。tools.yaml ファイルの sources セクションで、ソースをマップとして定義できます。通常、移行元構成には、データベースに接続して操作するために必要な情報が含まれます。

ツールは、エージェントが実行できるアクション(ソースへの読み取りや書き込みなど)を定義します。ツールは、エージェントが実行できるアクション(SQL ステートメントの実行など)を表します。tools.yaml ファイルの tools セクションで、ツールをマップとして定義できます。通常、ツールは処理対象のソースを必要とします。

tools.yaml の構成の詳細については、こちらのドキュメントをご覧ください。

上記の Tools.yaml ファイルでわかるように、ツール「get-apparels」はデータベースからすべての衣料品の詳細を一覧表示します。

7. Gemini CLI を設定する

Cloud Shell エディタで、gemini-cli-project フォルダ内に .gemini という名前の新しいフォルダを作成し、その中に settings.json という名前の新しいファイルを作成します。

{
  "mcpServers": {
"AlloyDBServer": {
  "command": "/home/user/gemini-cli-project/toolbox",
  "args": ["--tools-file", "tools.yaml", "--stdio"]
}
  }
}

上記のスニペットのコマンド セクションで、「/home/user/gemini-cli-project/toolbox」を toolbox へのパスに置き換えます。

Gemini CLI をインストールする

最後に、Cloud Shell ターミナルから、次のコマンドを実行して、同じディレクトリ gemini-cli-project に Gemini CLI をインストールします。

sudo npm install -g @google/gemini-cli

プロジェクト ID を設定する

環境にアクティブなプロジェクト ID が設定されていることを確認します。

export GOOGLE_CLOUD_PROJECT=<<YOUR_PROJECT_ID>>

Gemini CLI を使ってみる

コマンドラインで次のコマンドを入力します。

gemini

次のようなレスポンスが表示されます。

94f16dd7b5e2ca77.png

認証して次のステップに進みます。

8. Gemini CLI の操作を開始する

/mcp コマンドを使用して、構成されている MCP サーバーを一覧表示します。

83e1c54ec68add5c.png

構成した 2 つの MCP サーバー(GitHub と MCP Toolbox for Databases)が、ツールとともに一覧表示されます。

84b59c3027d370e2.png

私の場合は、さらに多くのツールがあります。ここでは無視します。AlloyDB MCP サーバーに get-apparels ツールが表示されます。

MCP Toolbox を使用してデータベースのクエリを開始する

自然言語で質問して、使用しているデータセットの回答とクエリを取得してみましょう。

> How many types of genders the apparel dataset has?

ae24caa625ef871b.png

> Give me the SQL that I can use to find the number of apparels that are footwear 

b75da65679031c7.png

> What are the unique sub categories that are there?
that I can use to find the number of apparels that are footwear 

c04fd9e113a4ed95.png

分析と多くのクエリに基づいて詳細なクエリを作成し、テストしたいとします。または、データベース エンジニアが次のように Tools.yaml を作成済みであるとします。

sources:
    alloydb:
        kind: "alloydb-postgres"
        project: "<<YOUR_PROJECT_ID>>"
        region: "us-central1"
        cluster: "vector-cluster"
        instance: "vector-instance"
        database: "postgres"
        user: "postgres"
        password: "alloydb"

tools:
   get-apparels:
    kind: postgres-sql
    source: alloydb
    description: Get all apparel data.
    statement: |
      select id, content, uri, category, sub_category,color,gender from apparels;

   filtered-vector-search:
    kind: postgres-sql
    source: alloydb
    description: Get the list of facet filter values from the retail dataset.
    parameters:
      - name: categories
        type: array
        description: List of categories preferred by the user.
        items:
          name: category 
          type: string
          description: Category value. 
      - name: subCategories
        type: array
        description: List of sub-categories preferred by the user.
        items:
          name: subCategory 
          type: string
          description: Sub-Category value.
      - name: colors
        type: array
        description: List of colors preferred by the user.
        items:
          name: color 
          type: string
          description: Color value.
      - name: genders
        type: array
        description: List of genders preferred by the user for apparel fitting.
        items:
          name: gender 
          type: string
          description: Gender name.
      - name: searchtext
        type: string
        description: Description of the product that the user wants to find database matches for.    
    statement: |
      SELECT id, content, uri, category, sub_category,color,gender FROM apparels 
      where category = ANY($1) and sub_Category = ANY($2) and color = ANY($3) and gender = ANY($4)
      order by embedding <=> embedding('text-embedding-005',$5)::vector limit 10

次に、自然言語検索を試してみましょう。

> How many yellow shirts are there for boys?

5c3890cf69e3dacb.png

4ec79f49b2eaebbd.png

便利だと思いませんか?これにより、クエリの高度化のために YAML ファイルを修正しながら、アプリケーションの新しい機能を短期間で提供できるようになりました。

9. 迅速なアプリ開発

Gemini CLI と MCP Toolbox を介してデータベース機能を IDE に直接導入するメリットは、理論的なものだけではありません。これにより、特にハイブリッド小売業のような複雑なアプリケーションで、ワークフローのスピードアップが実現します。いくつかのシナリオを見てみましょう。

1. 商品フィルタリング ロジックの迅速な反復処理

たとえば、「夏用アクティブウェア」の新しいプロモーションを開始したとします。ファセット フィルタ(ブランド、サイズ、色、価格帯など)がこの新しいカテゴリとどのように連携するかをテストします。

IDE 統合なしの場合:

別の SQL クライアントに切り替えてクエリを作成し、実行して結果を分析し、IDE に戻ってアプリケーション コードを調整し、クライアントに戻って繰り返す、という流れになるでしょう。このコンテキスト切り替えは大きな負担になります。

Gemini CLI と MCP を使用する場合:

IDE などで作業を続けられる:

  • クエリ: (仮説データセット)「SELECT DISTINCT brand FROM products WHERE category = ‘activewear' AND season = ‘summer'」を使用して、yaml のクエリをすばやく更新し、ターミナルで直接試すことができます。
  • データ探索: 返品されたブランドをすぐに確認できます。特定のブランドとサイズの商品在庫を確認する必要がある場合は、別の簡単なクエリを使用します。「SELECT COUNT(*) FROM products WHERE brand = ‘SummitGear' AND size = ‘M' AND category = ‘activewear' AND season = ‘summer'」
  • コードの統合: これらの迅速な IDE 内のデータ分析に基づいて、フロントエンドのフィルタリング ロジックやバックエンドの API 呼び出しをすぐに調整できるため、フィードバック ループを大幅に短縮できます。

2. 商品レコメンデーション用のベクトル検索のファインチューニング

Google のハイブリッド検索は、関連性の高い商品のおすすめにベクトル エンベディングを使用しています。たとえば、「男性用ランニング シューズ」の最適化案のクリック率が低下しているとします。

IDE 統合なしの場合:

データベース ツールでカスタム スクリプトやクエリを実行して、おすすめの靴の類似性スコアを分析し、ユーザーのインタラクション データと比較して、パターンを関連付けようとします。

Gemini CLI と MCP を使用する場合:

  • エンベディングの分析: 商品エンベディングとその関連メタデータを直接クエリできます。「SELECT product_id, name, vector_embedding FROM products WHERE category = ‘running shoes' AND gender = ‘male' LIMIT 10」
  • 相互参照: 選択した商品とそのレコメンデーションの実際のベクトル類似度をその場で簡単に確認することもできます。たとえば、商品 B を閲覧したユーザーに商品 A がおすすめされた場合、クエリを実行してベクトル エンベディングを取得し、比較できます。
  • デバッグ: デバッグと仮説検証を迅速に行うことができます。エンベディング モデルは想定どおりに動作するか?推奨事項の品質に影響する異常値がデータに含まれていないか?コーディング環境を離れることなく、最初の回答を得ることができます。

3. 新機能のスキーマとデータ分布を理解する

たとえば、「顧客レビュー」機能を追加することを計画しているとします。バックエンド API を作成する前に、既存の顧客データとレビューの構造を理解する必要があります。

IDE 統合なしの場合:

データベース クライアントに接続し、顧客や注文などのテーブルで DESCRIBE コマンドを実行してから、サンプルデータをクエリして、リレーションシップとデータ型を理解する必要があります。

Gemini CLI と MCP を使用する場合:

  • スキーマの探索: yaml ファイル内のテーブルをクエリして、ターミナルで直接実行できます。
  • データ サンプリング: 次に、サンプルデータを取得して、顧客のユーザー属性と購入履歴を把握できます。「SELECT customer_id, name, signup_date, total_orders FROM customers ORDER BY signup_date DESC LIMIT 5」
  • 計画: スキーマとデータ分布にすばやくアクセスできるため、新しいレビュー テーブルの設計方法、設定する外部キー、レビューと顧客や商品を効率的にリンクする方法について、新しい機能のアプリケーション コードを 1 行も記述する前に、情報に基づいた意思決定を行うことができます。

これらはほんの一例ですが、摩擦を減らしてデベロッパーのベロシティを高めるという主なメリットを強調しています。AlloyDB のインタラクションを IDE に直接組み込むことで、Gemini CLI と MCP Toolbox を活用して、より優れた応答性の高いアプリケーションを迅速に構築できます。

10. クリーンアップ

この投稿で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

  1. Google Cloud コンソールで、[リソース マネージャー] ページに移動します。
  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
  4. または、[DELETE CLUSTER] ボタンをクリックして、このプロジェクト用に作成した AlloyDB クラスタを削除することもできます(構成時にクラスタに us-central1 を選択しなかった場合は、このハイパーリンクのロケーションを変更してください)。

11. 完了

おめでとうございます!MCP ツールボックスを IDE に直接統合して AlloyDB とシームレスにやり取りし、Gemini CLI を活用して小売業の e コマース データセットとやり取りし、通常は別のツールが必要となるクエリを作成しました。テーブル構造の確認からデータの簡単な健全性チェックの実行まで、IDE 内の使い慣れたコマンドライン インターフェースを使用して、データをプローブして理解する新しい方法を学びました。

repoをクローンして分析し、Gemini CLI とデータベース向け MCP ツールボックスを使用してアプリケーションを強化したかどうかをお知らせください。

Gemini CLI と MCP を使用して構築され、サーバーレス ランタイムにデプロイされたこのようなデータドリブン アプリケーションの詳細については、Code Vipassana の今後のシーズンにご登録ください。インストラクター主導の実践的なセッションや、このような Codelab を受講できます。