> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Auth0データベース接続へのユーザーデータの一括インポート

> データベース接続の一括インポートを使用して、既存のデータベースやサービスから Auth0 へユーザーを移行します。

export const AuthCodeGroup = ({children, dropdown}) => {
  const [processedChildren, setProcessedChildren] = useState(children);
  useEffect(() => {
    let unsubscribe = null;
    function init() {
      unsubscribe = window.autorun(() => {
        const processChildren = node => {
          if (typeof node === "string") {
            let processedNode = node;
            for (const [key, value] of window.rootStore.variableStore.values.entries()) {
              const escapedKey = key.replaceAll(/[.*+?^${}()|[\]\\]/g, (String.raw)`\$&`);
              processedNode = processedNode.replaceAll(new RegExp(escapedKey, "g"), value);
            }
            return processedNode;
          } else if (Array.isArray(node)) {
            return node.map(processChildren);
          } else if (node && node.props && node.props.children) {
            return {
              ...node,
              props: {
                ...node.props,
                children: processChildren(node.props.children)
              }
            };
          }
          return node;
        };
        setProcessedChildren(processChildren(children));
      });
    }
    if (window.rootStore) {
      init();
    } else {
      window.addEventListener("adu:storeReady", init);
    }
    return () => {
      window.removeEventListener("adu:storeReady", init);
      unsubscribe?.();
    };
  }, [children]);
  return <CodeGroup dropdown={dropdown}>{processedChildren}</CodeGroup>;
};

export const AuthCodeBlock = ({filename, icon, language, highlight, children}) => {
  const [displayText, setDisplayText] = useState(children);
  const [copyText, setCopyText] = useState(children);
  const wrapperRef = React.useRef(null);
  useEffect(() => {
    let unsubscribe = null;
    function init() {
      if (!window.autorun || !window.rootStore) {
        return;
      }
      unsubscribe = window.autorun(() => {
        let processedChildrenForDisplay = children;
        let processedChildrenForCopy = children;
        for (const [key, value] of window.rootStore.variableStore.values.entries()) {
          const escapedKey = key.replaceAll(/[.*+?^${}()|[\]\\]/g, (String.raw)`\$&`);
          let displayValue = value;
          if (key === "{yourClientSecret}" && value !== "{yourClientSecret}") {
            displayValue = value.substring(0, 3) + "*****MASKED*****";
          }
          processedChildrenForDisplay = processedChildrenForDisplay.replaceAll(new RegExp(escapedKey, "g"), displayValue);
          processedChildrenForCopy = processedChildrenForCopy.replaceAll(new RegExp(escapedKey, "g"), value);
        }
        setDisplayText(processedChildrenForDisplay);
        setCopyText(processedChildrenForCopy);
      });
    }
    if (window.rootStore) {
      init();
    } else {
      window.addEventListener("adu:storeReady", init);
    }
    return () => {
      window.removeEventListener("adu:storeReady", init);
      unsubscribe?.();
    };
  }, [children]);
  useEffect(() => {
    if (!wrapperRef.current) return;
    const originalWriteText = navigator.clipboard.writeText.bind(navigator.clipboard);
    let isOverriding = false;
    const handleClick = e => {
      const button = e.target.closest('[data-testid="copy-code-button"]');
      if (!button || !wrapperRef.current.contains(button)) return;
      isOverriding = true;
      navigator.clipboard.writeText = text => {
        if (isOverriding) {
          isOverriding = false;
          navigator.clipboard.writeText = originalWriteText;
          return originalWriteText(copyText);
        }
        return originalWriteText(text);
      };
      setTimeout(() => {
        if (isOverriding) {
          isOverriding = false;
          navigator.clipboard.writeText = originalWriteText;
        }
      }, 100);
    };
    const wrapper = wrapperRef.current;
    wrapper.addEventListener('click', handleClick, true);
    return () => {
      wrapper.removeEventListener('click', handleClick, true);
      if (navigator.clipboard.writeText !== originalWriteText) {
        navigator.clipboard.writeText = originalWriteText;
      }
    };
  }, [copyText]);
  return <div ref={wrapperRef}>
      <CodeBlock filename={filename} icon={icon} language={language} lines highlight={highlight}>
        {displayText}
      </CodeBlock>
    </div>;
};

既存のユーザーデータを Auth0 のデータベース接続に一括インポートできます。これは、既存のデータベースやサービスから Auth0 へユーザーを移行する際に便利です。

ユーザーデータを一括インポートするには、まず Auth0 が想定する JSON 形式のユーザーデータファイルを作成し、次に Auth0 Dashboard または Management API を使用してそのデータをインポートするジョブを開始します。

<div id="prerequisites">
  ## 前提条件
</div>

<Tabs>
  <Tab title="Auth0 Dashboard">
    * ユーザーデータのインポート先となる[データベース接続](/docs/ja-jp/authenticate/database-connections)が必要です。以下のいずれかを使用できます。
      * Auth0 user store を使用するデータベース接続。
      * インポートモードをオンにした外部 user store を使用する[カスタムデータベース接続](/docs/ja-jp/authenticate/database-connections/custom-db)。

    * 次のいずれかの[テナントメンバーのロール](/docs/ja-jp/get-started/manage-dashboard-access/feature-access-by-role)が必要です。
      * **Admin**
      * **Editor - Users**
  </Tab>

  <Tab title="Management API">
    * ユーザーデータのインポート先となる[データベース接続](/docs/ja-jp/authenticate/database-connections)が必要です。以下のいずれかを使用できます。
      * Auth0 user store を使用するデータベース接続。
      * インポートモードをオンにした外部 user store を使用する[カスタムデータベース接続](/docs/ja-jp/authenticate/database-connections/custom-db)。

    * ジョブ エンドポイント へのリクエストには、[ユーザーインポートジョブを作成 エンドポイント](/docs/ja-jp/api/management/v2/jobs/post-users-imports)に必要な scopes を持つ[Management API トークン](/docs/ja-jp/secure/tokens/access-tokens/management-api-access-tokens)が必要です。まだない場合は作成してください。
  </Tab>
</Tabs>

<div id="1-create-the-user-data-file">
  ## 1. ユーザーデータファイルを作成する
</div>

まず、[ユーザーデータ JSON スキーマおよびプロパティリファレンス](/docs/ja-jp/manage-users/user-migration/bulk-user-import-database-schema-and-examples)で定義されている構造に従って、既存のユーザーデータを Auth0 にインポートするための JSON 形式に整えます。

ユーザーデータファイルを作成する際は、以下の点を参考にしてください。

* 一括インポート のファイルサイズ上限は 500KB です。データがこの上限を超える場合は、ユーザーデータを複数の小さなファイルに分割し、複数の ジョブ に分けてアップロードする必要があります。

  目安として、ユーザーあたりのメタデータ field が 10 未満のユーザー約 1,000 件であれば、通常はファイルサイズ上限内に収まります。

* [Auth0 ユーザーデータエクスポート](/docs/ja-jp/manage-users/user-migration/bulk-user-exports)を利用する場合：

  * 一括インポート は JSON 形式をサポートしていますが、Auth0 で生成されるユーザーエクスポートは [NDJSON](https://github.com/ndjson/ndjson-spec) 形式です。[`jq`](https://jqlang.org/) などのツールを使用して、NDJSON を JSON に変換できます。

  * 一括インポート では、インポートされた user ID に `auth0|` プレフィックスが自動的に追加されますが、Auth0 で生成されるユーザーエクスポートの user ID には、すでに `auth0|` プレフィックスが付いています。

  同じ user ID を維持するには、インポートするすべての user ID から `auth0|` プレフィックスを削除してください。削除しない場合、user ID にはプレフィックスが 2 回付与されます (`auth0|auth0|<user_id>`) 。

* [サポート対象の algorithm](./bulk-user-import-schema#param-algorithm)でハッシュ化されたパスワードを含むユーザーデータをインポートできます。サポートされていない algorithm でハッシュ化されたパスワードを持つユーザーは、一括インポート 後、初めて log in するときにパスワードをリセットする必要があります。

  ユーザーが最初にインポートした `custom_password_hash` を使用して log in していない場合は、upsert を有効にした新しい ジョブ で `custom_password_hash` に別の値を指定し、ユーザーデータを再送信することで更新できます。

<div id="2-import-the-user-data-into-your-database-connection">
  ## 2. ユーザーデータをデータベース接続にインポートする
</div>

<Tabs>
  <Tab title="Auth0 Dashboard">
    Auth0 Dashboardを使用してユーザーデータをインポートするには：

    1. [**Dashboard > User Management > Users**](https://manage.auth0.com/#/users)に移動します。

    2. ページの右上にある**ユーザーのインポート/エクスポート**を選択して、**ユーザーのインポート/エクスポート**ページに移動します。

    3. **ユーザーをインポート**を選択して、**ユーザーをインポート**ページに移動します。

           <Frame>
             <img src="https://mintcdn.com/translations/mMSz-RNYLuOm2GmQ/docs/images/cdy7uua7fh8z/KrknYhAUOaYBzzBrgHp4M/b2389f5926122a306eab10e54b917da6/import.png?fit=max&auto=format&n=mMSz-RNYLuOm2GmQ&q=85&s=82d3a5fe838c13ea26eee50e388ee421" alt="" width="1999" height="1444" data-path="docs/images/cdy7uua7fh8z/KrknYhAUOaYBzzBrgHp4M/b2389f5926122a306eab10e54b917da6/import.png" />
           </Frame>

    4. **ユーザーJSONファイル**で、**+ ファイルを選択**を選択し、ユーザーデータのJSONファイルをアップロードします。

    5. **接続**でドロップダウンメニューを開き、ユーザーデータのインポート先となるデータベース接続を選択します。

    6. 必要に応じて、**Upsert pre-existing users in connection**をオンにします。インポートするユーザーがデータベース接続内の既存ユーザーと一致した場合、データをアップサートするかどうかを選択できます。

       * デフォルトでは、アップサートは無効です。メールアドレス、ユーザーID、phone、またはユーザー名が一致するユーザーのインポートは失敗します。

       * アップサートを有効にすると、メールアドレスが一致するユーザーをインポートした際に、すべての[アップサート可能な属性](/docs/ja-jp/manage-users/user-migration/bulk-user-import-database-schema-and-examples)が更新されます。

    7. 必要に応じて、**すべてのテナント所有者に完了メールを送信**をオンにします。有効にすると、ジョブの成功または失敗時に、すべてのテナント管理者に完了メールが送信されます。

    8. ジョブを送信するには、**ユーザーをインポート**を選択します。
  </Tab>

  <Tab title="Management API">
    Management APIを使用してユーザーデータをインポートするには、[ユーザーインポートジョブを作成エンドポイント](/docs/ja-jp/api/management/v2/jobs/post-users-imports) (`POST /jobs/users-imports`) を呼び出します。ボディのパラメーターや応答のスキーマの詳細については、エンドポイントのドキュメントを参照してください。

    以下の例を使用するには：

    * プレースホルダー変数 `MGMT_API_ACCESS_TOKEN`、`USERS_IMPORT_FILE.json`、`CONNECTION_ID`、`EXTERNAL_ID` をそれぞれの値に置き換えます。

          <Tip>
            [Auth0 Dashboardでデータベース接続のIDを確認する](/docs/ja-jp/authenticate/identity-providers/locate-the-connection-id)か、Management APIの[すべての接続を取得するエンドポイント](/docs/ja-jp/api/management/v2/connections/get-connections)を使用して取得できます。
          </Tip>

    * 必要に応じて、`upsert` を設定します。インポートしたユーザーがデータベース接続内の既存ユーザーと一致する場合、データをアップサートするかどうかを選択できます。

      * デフォルトでは、アップサートは無効です。メールアドレス、ユーザー ID、電話番号、またはユーザー名が一致するユーザーをインポートすると失敗します。

      * `upsert` を有効にすると、メールアドレスが一致するユーザーをインポートした際に、[アップサート可能なすべての属性](/docs/ja-jp/manage-users/user-migration/bulk-user-import-database-schema-and-examples)が更新されます。

    * 必要に応じて、\`send\_completion\_email を設定すると、ジョブの成功または失敗時にすべてのテナント管理者へ完了メールが送信されます。

    <AuthCodeGroup>
      ```bash cURL theme={null}
      curl --request POST \
        --url 'https://{yourDomain}/api/v2/jobs/users-imports' \
        --header 'authorization: Bearer MGMT_API_ACCESS_TOKEN' \
        --form users=@USERS_IMPORT_FILE.json \
        --form connection_id=CONNECTION_ID \
        --form external_id=EXTERNAL_ID
      ```

      ```csharp C# theme={null}
      var client = new RestClient("https://{yourDomain}/api/v2/jobs/users-imports");
      var request = new RestRequest(Method.POST);
      request.AddHeader("authorization", "Bearer MGMT_API_ACCESS_TOKEN");
      request.AddHeader("content-type", "multipart/form-data; boundary=---011000010111000001101001");
      request.AddParameter("multipart/form-data; boundary=---011000010111000001101001", "-----011000010111000001101001\r
      Content-Disposition: form-data; name="users"; filename="USERS_IMPORT_FILE.json"\r
      Content-Type: text/json\r
      \r
      \r
      -----011000010111000001101001\r
      Content-Disposition: form-data; name="connection_id"\r
      \r
      CONNECTION_ID\r
      -----011000010111000001101001\r
      Content-Disposition: form-data; name="external_id"\r
      \r
      EXTERNAL_ID\r
      -----011000010111000001101001--\r
      ", ParameterType.RequestBody);
      IRestResponse response = client.Execute(request);
      ```

      ```go Go theme={null}
      package main

      import (
      	"fmt"
      	"strings"
      	"net/http"
      	"io/ioutil"
      )

      func main() {

      	url := "https://{yourDomain}/api/v2/jobs/users-imports"

      	payload := strings.NewReader("-----011000010111000001101001\r
      Content-Disposition: form-data; name="users"; filename="USERS_IMPORT_FILE.json"\r
      Content-Type: text/json\r
      \r
      \r
      -----011000010111000001101001\r
      Content-Disposition: form-data; name="connection_id"\r
      \r
      CONNECTION_ID\r
      -----011000010111000001101001\r
      Content-Disposition: form-data; name="external_id"\r
      \r
      EXTERNAL_ID\r
      -----011000010111000001101001--\r
      ")

      	req, _ := http.NewRequest("POST", url, payload)

      	req.Header.Add("authorization", "Bearer MGMT_API_ACCESS_TOKEN")
      	req.Header.Add("content-type", "multipart/form-data; boundary=---011000010111000001101001")

      	res, _ := http.DefaultClient.Do(req)

      	defer res.Body.Close()
      	body, _ := ioutil.ReadAll(res.Body)

      	fmt.Println(res)
      	fmt.Println(string(body))

      }
      ```

      ```java Java theme={null}
      HttpResponse<String> response = Unirest.post("https://{yourDomain}/api/v2/jobs/users-imports")
        .header("authorization", "Bearer MGMT_API_ACCESS_TOKEN")
        .header("content-type", "multipart/form-data; boundary=---011000010111000001101001")
        .body("-----011000010111000001101001\r
      Content-Disposition: form-data; name="users"; filename="USERS_IMPORT_FILE.json"\r
      Content-Type: text/json\r
      \r
      \r
      -----011000010111000001101001\r
      Content-Disposition: form-data; name="connection_id"\r
      \r
      CONNECTION_ID\r
      -----011000010111000001101001\r
      Content-Disposition: form-data; name="external_id"\r
      \r
      EXTERNAL_ID\r
      -----011000010111000001101001--\r
      ")
        .asString();
      ```

      ```javascript Node.JS theme={null}
      var axios = require("axios").default;

      var options = {
        method: 'POST',
        url: 'https://{yourDomain}/api/v2/jobs/users-imports',
        headers: {
          authorization: 'Bearer MGMT_API_ACCESS_TOKEN',
          'content-type': 'multipart/form-data; boundary=---011000010111000001101001'
        },
        data: '-----011000010111000001101001\r
      Content-Disposition: form-data; name="users"; filename="USERS_IMPORT_FILE.json"\r
      Content-Type: text/json\r
      \r
      \r
      -----011000010111000001101001\r
      Content-Disposition: form-data; name="connection_id"\r
      \r
      CONNECTION_ID\r
      -----011000010111000001101001\r
      Content-Disposition: form-data; name="external_id"\r
      \r
      EXTERNAL_ID\r
      -----011000010111000001101001--\r
      '
      };

      axios.request(options).then(function (response) {
        console.log(response.data);
      }).catch(function (error) {
        console.error(error);
      });
      ```

      ```php PHP theme={null}
      $curl = curl_init();

      curl_setopt_array($curl, [
        CURLOPT_URL => "https://{yourDomain}/api/v2/jobs/users-imports",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => "-----011000010111000001101001\r
      Content-Disposition: form-data; name="users"; filename="USERS_IMPORT_FILE.json"\r
      Content-Type: text/json\r
      \r
      \r
      -----011000010111000001101001\r
      Content-Disposition: form-data; name="connection_id"\r
      \r
      CONNECTION_ID\r
      -----011000010111000001101001\r
      Content-Disposition: form-data; name="external_id"\r
      \r
      EXTERNAL_ID\r
      -----011000010111000001101001--\r
      ",
        CURLOPT_HTTPHEADER => [
          "authorization: Bearer MGMT_API_ACCESS_TOKEN",
          "content-type: multipart/form-data; boundary=---011000010111000001101001"
        ],
      ]);

      $response = curl_exec($curl);
      $err = curl_error($curl);

      curl_close($curl);

      if ($err) {
        echo "cURL Error #:" . $err;
      } else {
        echo $response;
      }
      ```

      ```python Python theme={null}
      import http.client

      conn = http.client.HTTPSConnection("{yourDomain}")

      # ユーザーインポートファイルを読み込む
      with open("USERS_IMPORT_FILE.json", "rb") as f:
          file_contents = f.read()

      payload = (
          "-----011000010111000001101001\r\n"
          "Content-Disposition: form-data; name=\"users\"; filename=\"USERS_IMPORT_FILE.json\"\r\n"
          "Content-Type: application/json\r\n"
          "\r\n"
          + file_contents.decode("utf-8") + "\r\n"
          "-----011000010111000001101001\r\n"
          "Content-Disposition: form-data; name=\"connection_id\"\r\n"
          "\r\n"
          "CONNECTION_ID\r\n"
          "-----011000010111000001101001\r\n"
          "Content-Disposition: form-data; name=\"external_id\"\r\n"
          "\r\n"
          "EXTERNAL_ID\r\n"
          "-----011000010111000001101001--\r\n"
      )

      headers = {
          'authorization': "Bearer MGMT_API_ACCESS_TOKEN",
          'content-type': "multipart/form-data; boundary=---011000010111000001101001"
          }

      conn.request("POST", "/api/v2/jobs/users-imports", payload, headers)

      res = conn.getresponse()
      data = res.read()

      print(data.decode("utf-8"))
      ```

      ```ruby Ruby theme={null}
      require 'uri'
      require 'net/http'
      require 'openssl'

      url = URI("https://{yourDomain}/api/v2/jobs/users-imports")

      http = Net::HTTP.new(url.host, url.port)
      http.use_ssl = true
      http.verify_mode = OpenSSL::SSL::VERIFY_PEER

      request = Net::HTTP::Post.new(url)
      request["authorization"] = 'Bearer MGMT_API_ACCESS_TOKEN'
      request["content-type"] = 'multipart/form-data; boundary=---011000010111000001101001'
      request.body = "-----011000010111000001101001\r
      Content-Disposition: form-data; name="users"; filename="USERS_IMPORT_FILE.json"\r
      Content-Type: text/json\r
      \r
      \r
      -----011000010111000001101001\r
      Content-Disposition: form-data; name="connection_id"\r
      \r
      CONNECTION_ID\r
      -----011000010111000001101001\r
      Content-Disposition: form-data; name="external_id"\r
      \r
      EXTERNAL_ID\r
      -----011000010111000001101001--\r
      "

      response = http.request(request)
      puts response.read_body
      ```
    </AuthCodeGroup>

    ジョブの作成に成功すると、戻り値としてジョブIDを含むジョブの情報が返されます。
  </Tab>
</Tabs>

<div id="3-check-job-status">
  ## 3. ジョブのステータスを確認する
</div>

<Tabs>
  <Tab title="Auth0 Dashboard">
    ジョブのステータスを確認するには、次の手順に従います。

    1. [**Dashboard > User Management > Users**](https://manage.auth0.com/#/users)に移動します。

    2. ページ右上の**Import/Export Users**を選択して、**Import/Export Users**ページに移動します。少なくとも1つのジョブを開始すると、このページに送信したジョブの一覧が表示されます。

    3. ジョブの詳細を確認するには、対象のジョブの横にある**More info**を選択します。

    ジョブのステータスには、**Job creation failed**、**Job created, user import failed**、**Job created, user import succeeded**があります。
  </Tab>

  <Tab title="Management API">
    ジョブのステータスを確認するには、ジョブのIDを指定して[Get a job エンドポイント](/docs/ja-jp/api/management/v2/jobs/get-jobs-by-id) (`GET /jobs`) を呼び出します。エンドポイントのパラメータとレスポンススキーマの詳細については、エンドポイントのドキュメントを参照してください。

    返されたジョブの`status`は、`pending`、`completed`、または`failed`です。ジョブが完了した場合、レスポンスの`summary`オブジェクトには、成功、失敗、挿入、更新されたレコードの合計数が含まれます。

    ジョブが失敗した場合は、ジョブのIDを指定して[Get job error details エンドポイント](https://auth0.com/docs/api/management/v2#!/Jobs/get_errors) (`GET /jobs/{id}/errors`) を呼び出すことで、エラーの詳細を取得できます。レスポンス内の各エラーオブジェクトには、エラーコードとエラーの詳細を説明するメッセージが含まれます。使用可能なエラーコードは次のとおりです。

    * `ANY_OF_MISSING`
    * `ARRAY_LENGTH_LONG`
    * `ARRAY_LENGTH_SHORT`
    * `CONFLICT`
    * `CONFLICT_EMAIL`
    * `CONFLICT_USERNAME`
    * `CONNECTION_NOT_FOUND`
    * `DUPLICATED_USER`
    * `ENUM_MISMATCH`
    * `FORMAT`
    * `INVALID_TYPE`
    * `MAX_LENGTH`
    * `MAXIMUM`
    * `MFA_FACTORS_FAILED`
    * `MIN_LENGTH`
    * `MINIMUM`
    * `NOT_PASSED`
    * `OBJECT_REQUIRED`
    * `PATTERN`
  </Tab>
</Tabs>

エラーが発生するとジョブは失敗しますが、無効なメールアドレスなど、無効なユーザー情報が含まれていても失敗しません。

<div id="limits">
  ## 制限
</div>

* テナントごとに同時に実行できるインポートジョブは2件までです。

* ユーザーインポートジョブは2時間でタイムアウトします。この時間内にジョブが完了しない場合、失敗としてマークされます。

* ジョブ関連のデータはすべて24時間後に自動的に削除されます。

* インポートファイル内に重複したユーザーエントリがあるとエラーになります。インポート後にupsertが行われることはありません。

* upsertでは`user_metadata`または`app_metadata`はマージされません。既存のメタデータは新しいメタデータで完全に上書きされます。

<div id="best-practices-for-large-scale-migrations">
  ## 大規模な移行に関するベストプラクティス
</div>

大量のユーザーデータをインポートする場合 (10 件以上のジョブが必要な場合) は、次の戦略を推奨します。

* **ジョブスケジューラフレームワークを使用する** ([Bull](https://github.com/OptimalBits/bull) や [Agenda](https://github.com/agenda/agenda) など) 。これにより、次のことが可能になります。

  * 必要な同時実行数の上限を設定する。

  * ネットワーク接続の切断や一時的な障害に対応する再試行戦略を組み込む。

  * 削除期限を過ぎてもジョブの結果とエラーの詳細を保存する。

* **1 人のユーザーで失敗してもインポートを中断しない。** 代わりに、生成されたすべてのジョブを確認し、失敗したレコードを新しいファイルに収集する「ファイナライザー」ジョブを実装します。収集した失敗レコードのエラーを修正し、新しいジョブとしてインポートします。

* **`upsert` モードを有効にする際は注意する。** upsert を使用したインポートは標準のインポートよりも遅く、メタデータはマージされません。既存のユーザーを更新する必要があり、これらの制限事項を理解している場合にのみ upsert モードを使用してください。
