` を、DOM へのレスポンスに追加します。
+
+以下は、Zombie.js を使用してフォームとやり取りする方法の例です。
+
+```js
+test('Submit the surname "Polo" in the HTML form', function (done) {
+ browser.fill('surname', 'Polo').then(() => {
+ browser.pressButton('submit', () => {
+ browser.assert.success();
+ browser.assert.text('span#name', 'Marco');
+ browser.assert.text('span#surname', 'Polo');
+ browser.assert.elements('span#dates', 1);
+ done();
+ });
+ });
+});
+```
+
+まず、`browser` オブジェクトの `fill` メソッドにより、フォームの `surname` フィールドに値 `'Polo'` を入力します。 `fill` は promise を返すので、そこから `then` でつなぎます。
+
+`then` コールバック内で、`browser` オブジェクトの `pressButton` メソッドを使用して、フォームの `submit` イベントリスナーを呼び出します。 `pressButton` メソッドは非同期です。
+
+その後、AJAX リクエストからレスポンスを受信すると、いくつかのアサーションが実行され、以下が確定します。
+
+1. レスポンスのステータスは、`200` です。
+2. `
` 要素内のテキストは、`'Marco'` と一致します。
+3. `
` 要素内のテキストは、`'Polo'` と一致します。
+4. `1` という内容の `
` 要素があります。
+
+最後に、`done` コールバックを呼び出します。これは非同期テストのために必要です。
+
+# --instructions--
+
+`tests/2_functional-tests.js` 内の `'Submit the surname "Colombo" in the HTML form'` テスト (`// #5`) で、以下を自動化してください。
+
+1. フォームに姓 `Colombo` を入力します。
+2. 送信ボタンを押します。
+
+`pressButton` コールバック内で以下を実行してください。
+
+1. ステータスが OK `200` であることをアサートします。
+2. 要素 `span#name` 内のテキストが `'Cristoforo'` であることをアサートします。
+3. 要素 `span#surname` 内のテキストが `'Colombo'` であることをアサートします。
+4. 要素 `span#dates` が存在し、そのカウントが `1` であることをアサートします。
+
+`assert.fail()` 呼び出しを削除することを忘れないでください。
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=functional&n=5').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+ヘッドレスブラウザーのリクエストが成功したことをアサートする必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=functional&n=5').then(
+ (data) => {
+ assert.equal(data.assertions[0].method, 'browser.success');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+要素 `span#name` 内のテキストが `'Cristoforo'` であることをアサートする必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=functional&n=5').then(
+ (data) => {
+ assert.equal(data.assertions[1].method, 'browser.text');
+ assert.match(data.assertions[1].args[0], /('|")span#name\1/);
+ assert.match(data.assertions[1].args[1], /('|")Cristoforo\1/);
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+要素 `span#surname` 内のテキストが `'Colombo'` であることをアサートする必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=functional&n=5').then(
+ (data) => {
+ assert.equal(data.assertions[2].method, 'browser.text');
+ assert.match(data.assertions[2].args[0], /('|")span#surname\1/);
+ assert.match(data.assertions[2].args[1], /('|")Colombo\1/);
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+要素 `span#dates` が存在し、カウントが 1 であることをアサートする必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=functional&n=5').then(
+ (data) => {
+ assert.equal(data.assertions[3].method, 'browser.elements');
+ assert.match(data.assertions[3].args[0], /('|")span#dates\1/);
+ assert.equal(data.assertions[3].args[1], 1);
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/simulate-actions-using-a-headless-browser.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/simulate-actions-using-a-headless-browser.md
new file mode 100644
index 0000000000..d43c60901e
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/simulate-actions-using-a-headless-browser.md
@@ -0,0 +1,72 @@
+---
+id: 587d824f367417b2b2512c5c
+title: ヘッドレスブラウザーを使用してアクションをシミュレートする
+challengeType: 2
+dashedName: simulate-actions-using-a-headless-browser
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) の始動プロジェクト、または [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/) からクローンされたプロジェクトに基づいて構築されています。
+
+次のチャレンジでは、ヘッドレスブラウザーを使用してページと人間のやり取りをシミュレートします。
+
+ヘッドレスブラウザーは、GUI を持たないウェブブラウザーです。 通常のブラウザーと同じように、HTML、CSS、および JavaScript をレンダーして解釈することができます。 特にウェブページのテストに役立ちます。
+
+以降のチャレンジでは、Zombie.js を使用します。これは、追加のバイナリをインストールしなくても動作する軽量のヘッドレスブラウザーです。 この機能により、Replit のような限られた環境で使用できます。 ただし、他にも多くの高機能なヘッドレスブラウザーがあります。
+
+Mocha では、実際のテストが実行される前にコードを実行できます。 これは、以降のテストで使用するデータベースへのエントリの追加などの操作を行うのに便利です。
+
+ヘッドレスブラウザーでテストを行う前に、テストを行うページに**アクセス**してください。
+
+`suiteSetup` フックは、テストスイートの始めに一度だけ実行されます。
+
+他にも、各テストの前、各テストの後、またはテストスイートの終わりにコードを実行できるいくつかのフックタイプがあります。 詳細については、Mocha のドキュメントを参照してください。
+
+# --instructions--
+
+`tests/2_functional-tests.js` の中の `Browser` 宣言の直後で、変数の `site` プロパティにプロジェクトの URL を追加してください。
+
+```js
+Browser.site = 'https://boilerplate-mochachai.your-username.repl.co'; // Your URL here
+```
+
+次に、`'Functional Tests with Zombie.js'` スイートのルートレベルで、次のコードを使用して `Browser` オブジェクトの新しいインスタンスを生成してください。
+
+```js
+const browser = new Browser();
+```
+
+そして、次のコードを使用して、`suiteSetup`フックで `browser` を `/` ルートに移動させてください。
+
+```js
+suiteSetup(function(done) {
+ return browser.visit('/', done);
+});
+```
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=functional&n=4').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-for-truthiness.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-for-truthiness.md
new file mode 100644
index 0000000000..004378c288
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-for-truthiness.md
@@ -0,0 +1,101 @@
+---
+id: 587d824b367417b2b2512c49
+title: 真かどうかをテストする
+challengeType: 2
+forumTopicId: 301596
+dashedName: test-for-truthiness
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) の始動プロジェクト、または [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/) からクローンされたプロジェクトに基づいて構築されています。
+
+`isTrue()` は、ブール値 `true` かどうかをテストし、`isNotTrue()` は、ブール値 `true` 以外の値である場合にテストにパスします。
+
+```js
+assert.isTrue(true, 'This will pass with the boolean value true');
+assert.isTrue('true', 'This will NOT pass with the string value "true"');
+assert.isTrue(1, 'This will NOT pass with the number value 1');
+```
+
+`isFalse()` と `isNotFalse()` もあり、ブール値 `false` かどうかを調べること以外は対応する true 版のメソッドと同様に動作します。
+
+# --instructions--
+
+`tests/1_unit-tests.js` の中の、`Basic Assertions` スイート内の `#4` に分類されたテストにおいて、テストを合格にする (`true` と評価する必要があります) ために、それぞれの `assert` を `assert.isTrue` または `assert.isNotTrue` に変更してください。 アサートに渡された引数を変更しないでください。
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=3').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+最初のアサーションに対して、正しいメソッドを選ぶ必要があります - `isTrue` もしくは `isNotTrue` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=3').then(
+ (data) => {
+ assert.equal(data.assertions[0].method, 'isTrue', 'True is true');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+2 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `isTrue` もしくは `isNotTrue` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=3').then(
+ (data) => {
+ assert.equal(
+ data.assertions[1].method,
+ 'isTrue',
+ 'Double negation of a truthy value is true'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+3 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `isTrue` もしくは `isNotTrue` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=3').then(
+ (data) => {
+ assert.equal(
+ data.assertions[2].method,
+ 'isNotTrue',
+ 'A truthy object is not true - neither is a false one'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-string-contains-a-substring.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-string-contains-a-substring.md
new file mode 100644
index 0000000000..dc5b99a720
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-string-contains-a-substring.md
@@ -0,0 +1,79 @@
+---
+id: 587d824d367417b2b2512c53
+title: 文字列に部分文字列が含まれているかどうかをテストする
+challengeType: 2
+forumTopicId: 301597
+dashedName: test-if-a-string-contains-a-substring
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) の始動プロジェクト、または [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/) からクローンされたプロジェクトに基づいて構築されています。
+
+`include()` と `notInclude()` は、文字列でも動作します! `include()` は、実際の文字列が期待される部分文字列を含んでいることをアサートします。
+
+# --instructions--
+
+`tests/1_unit-tests.js` の中の、`Strings` スイート内の `#14` に分類されたテストにおいて、テストを合格にする (`true` と評価する必要があります) ために、それぞれの `assert` を `assert.include` または `assert.notInclude` に変更してください。 アサートに渡された引数を変更しないでください。
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=13').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+最初のアサーションに対して、正しいメソッドを選ぶ必要があります - `include` もしくは `notInclude` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=13').then(
+ (data) => {
+ assert.equal(
+ data.assertions[0].method,
+ 'include',
+ "'Arrow' contains 'row'..."
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+2 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `include` もしくは `notInclude` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=13').then(
+ (data) => {
+ assert.equal(
+ data.assertions[1].method,
+ 'notInclude',
+ "... a 'dart' doesn't contain a 'queue'"
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-falls-within-a-specific-range.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-falls-within-a-specific-range.md
new file mode 100644
index 0000000000..5e2d357f4f
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-falls-within-a-specific-range.md
@@ -0,0 +1,87 @@
+---
+id: 587d824c367417b2b2512c4f
+title: 値が特定の範囲内かどうかをテストする
+challengeType: 2
+forumTopicId: 301598
+dashedName: test-if-a-value-falls-within-a-specific-range
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) の始動プロジェクト、または [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/) からクローンされたプロジェクトに基づいて構築されています。
+
+```javascript
+.approximately(actual, expected, delta, [message])
+```
+
+`actual` が `expected`に等しく +/- `delta` の範囲内であることをアサートします。
+
+# --instructions--
+
+`tests/1_unit-tests.js` の中の、`Comparisons` スイート内の `#10` に分類されたテストにおいて、テストを合格にする (`true` と評価する必要があります) ために、それぞれの `assert` を `assert.approximately` に変更してください。
+
+テストを常に合格にするには、最小範囲 (3 番目のパラメータ) を選択してください。 範囲は、1 未満でなければなりません。
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=9').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+最初のアサーションに対して、正しい範囲を選ぶ必要があります - `approximately(actual, expected, range)` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=9').then(
+ (data) => {
+ assert.equal(data.assertions[0].method, 'approximately');
+ assert.equal(
+ data.assertions[0].args[2],
+ 0.5,
+ "weirdNumbers(0.5) is in the range (0.5, 1.5]. It's within 1 +/- 0.5"
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+2 番目のアサーションに対して、正しい範囲を選ぶ必要があります - `approximately(actual, expected, range)` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=9').then(
+ (data) => {
+ assert.equal(data.assertions[1].method, 'approximately');
+ assert.equal(
+ data.assertions[1].args[2],
+ 0.8,
+ "weirdNumbers(0.2) is in the range (0.2, 1.2]. It's within 1 +/- 0.8"
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-a-string.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-a-string.md
new file mode 100644
index 0000000000..38654b91da
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-a-string.md
@@ -0,0 +1,93 @@
+---
+id: 587d824d367417b2b2512c52
+title: 値が文字列かどうかをテストする
+challengeType: 2
+forumTopicId: 301599
+dashedName: test-if-a-value-is-a-string
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) の始動プロジェクト、または [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/) からクローンされたプロジェクトに基づいて構築されています。
+
+`isString` または `isNotString` は、実際の値が文字列であることをアサートします。
+
+# --instructions--
+
+`tests/1_unit-tests.js` の中の、`Strings` スイート内の `#13` に分類されたテストにおいて、テストを合格にする (`true` と評価する必要があります) ために、それぞれの `assert` を `assert.isString` または `assert.isNotString` に変更してください。 アサートに渡された引数を変更しないでください。
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=12').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+最初のアサーションに対して、正しいメソッドを選ぶ必要があります - `isString` もしくは `isNotString` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=12').then(
+ (data) => {
+ assert.equal(
+ data.assertions[0].method,
+ 'isNotString',
+ 'A float number is not a string'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+2 番目のアサーションに対して、正しいメソッドを選ぶ必要があります- `isString` もしくは `isNotString` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=12').then(
+ (data) => {
+ assert.equal(
+ data.assertions[1].method,
+ 'isString',
+ 'environment vars are strings (or undefined)'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+3 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `isString` もしくは `isNotString` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=12').then(
+ (data) => {
+ assert.equal(data.assertions[2].method, 'isString', 'A JSON is a string');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-an-array.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-an-array.md
new file mode 100644
index 0000000000..8b1b55e119
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-an-array.md
@@ -0,0 +1,77 @@
+---
+id: 587d824d367417b2b2512c50
+title: 値が配列かどうかをテストする
+challengeType: 2
+forumTopicId: 301600
+dashedName: test-if-a-value-is-an-array
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) の始動プロジェクト、または [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/) からクローンされたプロジェクトに基づいて構築されています。
+
+# --instructions--
+
+`tests/1_unit-tests.js` の中の、`Arrays` スイート内の `#11` に分類されたテストにおいて、テストを合格にする (`true` と評価する必要があります) ために、それぞれの `assert` を `assert.isArray` または `assert.isNotArray` に変更してください。 アサート に渡された引数を変更しないでください。
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=10').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+最初のアサーションに対して、正しいメソッドを選ぶ必要があります - `isArray` もしくは `isNotArray`です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=10').then(
+ (data) => {
+ assert.equal(
+ data.assertions[0].method,
+ 'isArray',
+ 'String.prototype.split() returns an Array'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+2 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `isArray` もしくは `isNotArray` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=10').then(
+ (data) => {
+ assert.equal(
+ data.assertions[1].method,
+ 'isNotArray',
+ 'Array.prototype.indexOf() returns a number'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-of-a-specific-data-structure-type.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-of-a-specific-data-structure-type.md
new file mode 100644
index 0000000000..26c17b8f3c
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-of-a-specific-data-structure-type.md
@@ -0,0 +1,133 @@
+---
+id: 587d824e367417b2b2512c56
+title: 値が特定のデータ構造タイプかどうかをテストする
+challengeType: 2
+forumTopicId: 301601
+dashedName: test-if-a-value-is-of-a-specific-data-structure-type
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) の始動プロジェクト、または [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/) からクローンされたプロジェクトに基づいて構築されています。
+
+`#typeOf` は、値のタイプが、`Object.prototype.toString` で決まるとおりの与えられた文字列であることをアサートします。
+
+# --instructions--
+
+`tests/1_unit-tests.js` の中の、`Objects` スイート内の `#17` に分類されたテストにおいて、テストを合格にする (`true` と評価する必要があります) ために、それぞれの `assert` を `assert.typeOf` または `assert.notTypeOf` に変更してください。 アサートに渡された引数を変更しないでください。
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=16').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+最初のアサーションに対して、正しいメソッドを選ぶ必要があります - `typeOf` もしくは `notTypeOf` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=16').then(
+ (data) => {
+ assert.equal(
+ data.assertions[0].method,
+ 'typeOf',
+ 'myCar is typeOf Object'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+2 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `typeOf` もしくは `notTypeOf` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=16').then(
+ (data) => {
+ assert.equal(
+ data.assertions[1].method,
+ 'typeOf',
+ 'Car.model is a String'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+3 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `typeOf` もしくは `notTypeOf` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=16').then(
+ (data) => {
+ assert.equal(
+ data.assertions[2].method,
+ 'notTypeOf',
+ 'Plane.wings is a Number (not a String)'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+4 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `typeOf` もしくは `notTypeOf`です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=16').then(
+ (data) => {
+ assert.equal(
+ data.assertions[3].method,
+ 'typeOf',
+ 'Plane.engines is an Array'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+5 番目のアサーションに対して、正しいメソッドを選択する必要があります - `typeOf` もしくは `notTypeOf` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=16').then(
+ (data) => {
+ assert.equal(
+ data.assertions[4].method,
+ 'typeOf',
+ 'Car.wheels is a Number'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-variable-or-function-is-defined.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-variable-or-function-is-defined.md
new file mode 100644
index 0000000000..daef67d383
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-variable-or-function-is-defined.md
@@ -0,0 +1,95 @@
+---
+id: 587d824b367417b2b2512c47
+title: 変数または関数が定義されているかどうかをテストする
+challengeType: 2
+forumTopicId: 301602
+dashedName: test-if-a-variable-or-function-is-defined
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) の始動プロジェクト、または [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/) からクローンされたプロジェクトに基づいて構築されています。
+
+# --instructions--
+
+`tests/1_unit-tests.js` の中の、`Basic Assertions` スイート内の `#2` に分類されたテストにおいて、テストに合格にする (`true` と評価する必要があります) ために、それぞれの `assert` を `assert.isDefined()` または `assert.isUndefined()` に変更してください。 アサートに渡された引数を変更しないでください。
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=1').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+最初のアサーションに対して、正しいメソッドを選ぶ必要があります - `isDefined` もしくは `isUndefined` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=1').then(
+ (data) => {
+ assert.equal(
+ data.assertions[0].method,
+ 'isDefined',
+ 'Null is not undefined'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+2 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `isDefined` もしくは `isUndefined` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=1').then(
+ (data) => {
+ assert.equal(
+ data.assertions[1].method,
+ 'isUndefined',
+ 'Undefined is undefined'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+3 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `isDefined` もしくは `isUndefined` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=1').then(
+ (data) => {
+ assert.equal(
+ data.assertions[2].method,
+ 'isDefined',
+ 'A string is not undefined'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-array-contains-an-item.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-array-contains-an-item.md
new file mode 100644
index 0000000000..da67319632
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-array-contains-an-item.md
@@ -0,0 +1,77 @@
+---
+id: 587d824d367417b2b2512c51
+title: 配列にアイテムが含まれているかどうかをテストする
+challengeType: 2
+forumTopicId: 301603
+dashedName: test-if-an-array-contains-an-item
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) の始動プロジェクト、または [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/) からクローンされたプロジェクトに基づいて構築されています。
+
+# --instructions--
+
+`tests/1_unit-tests.js` の中の、`Arrays` スイート内の `#12` に分類されたテストにおいて、テストを合格にする (`true` と評価する必要があります) ために、それぞれの `assert` を `assert.include` または `assert.notInclude` に変更してください。 アサートに渡された引数を変更しないでください。
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=11').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+最初のアサーションに対して、正しいメソッドを選ぶ必要があります - `include` もしくは `notInclude` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=11').then(
+ (data) => {
+ assert.equal(
+ data.assertions[0].method,
+ 'notInclude',
+ "It's summer in july..."
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+2 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `include` もしくは `notInclude` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=11').then(
+ (data) => {
+ assert.equal(
+ data.assertions[1].method,
+ 'include',
+ 'JavaScript is a backend language !!'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-object-has-a-property.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-object-has-a-property.md
new file mode 100644
index 0000000000..bfed2d22b9
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-object-has-a-property.md
@@ -0,0 +1,93 @@
+---
+id: 587d824e367417b2b2512c55
+title: オブジェクトにプロパティがあるかどうかをテストする
+challengeType: 2
+forumTopicId: 301604
+dashedName: test-if-an-object-has-a-property
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) の始動プロジェクト、または [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/) からクローンされたプロジェクトに基づいて構築されています。
+
+`property` は、実際のオブジェクトに、与えられたプロパティがあることをアサートします。
+
+# --instructions--
+
+`tests/1_unit-tests.js` の中の、`Objects` スイート内の `#16` に分類されたテストにおいて、テストを合格にする (`true` と評価する必要があります) ために、それぞれの `assert` を `assert.property` または `assert.notProperty` に変更してください。 アサートに渡された引数を変更しないでください。
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=15').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+最初のアサーションに対して、正しいメソッドを選ぶ必要があります - `property` もしくは `notProperty` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=15').then(
+ (data) => {
+ assert.equal(
+ data.assertions[0].method,
+ 'notProperty',
+ 'A car has not wings'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+2 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `property` もしくは `notProperty` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=15').then(
+ (data) => {
+ assert.equal(
+ data.assertions[1].method,
+ 'property',
+ 'planes have engines'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+3 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `property` もしくは `notProperty` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=15').then(
+ (data) => {
+ assert.equal(data.assertions[2].method, 'property', 'Cars have wheels');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-object-is-an-instance-of-a-constructor.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-object-is-an-instance-of-a-constructor.md
new file mode 100644
index 0000000000..6ed4152bc3
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-object-is-an-instance-of-a-constructor.md
@@ -0,0 +1,115 @@
+---
+id: 587d824e367417b2b2512c57
+title: オブジェクトがコンストラクターのインスタンスであるかどうかをテストする
+challengeType: 2
+forumTopicId: 301605
+dashedName: test-if-an-object-is-an-instance-of-a-constructor
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) の始動プロジェクト、または [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/) からクローンされたプロジェクトに基づいて構築されています。
+
+`#instanceOf` は、オブジェクトがコンストラクターのインスタンスであることをアサートします。
+
+# --instructions--
+
+`tests/1_unit-tests.js` の中の、`Objects` スイート内の `#18` に分類されたテストにおいて、テストを合格にする (`true` と評価する必要があります) ために、それぞれの `assert` を `assert.instanceOf` または `assert.notInstanceOf` に変更してください。 アサートに渡された引数を変更しないでください。
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=17').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+最初のアサーションに対して、正しいメソッドを選ぶ必要があります - `instanceOf` もしくは `notInstanceOf` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=17').then(
+ (data) => {
+ assert.equal(
+ data.assertions[0].method,
+ 'notInstanceOf',
+ 'myCar is not an instance of Plane'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+2 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `instanceOf` もしくは `notInstanceOf` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=17').then(
+ (data) => {
+ assert.equal(
+ data.assertions[1].method,
+ 'instanceOf',
+ 'airlinePlane is an instance of Plane'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+3 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `instanceOf` もしくは `notInstanceOf` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=17').then(
+ (data) => {
+ assert.equal(
+ data.assertions[2].method,
+ 'instanceOf',
+ 'everything is an Object in JavaScript...'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+4 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `instanceOf` もしくは `notInstanceOf`です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=17').then(
+ (data) => {
+ assert.equal(
+ data.assertions[3].method,
+ 'notInstanceOf',
+ 'myCar.wheels is not an instance of String'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-one-value-is-below-or-at-least-as-large-as-another.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-one-value-is-below-or-at-least-as-large-as-another.md
new file mode 100644
index 0000000000..d7d1fba875
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-one-value-is-below-or-at-least-as-large-as-another.md
@@ -0,0 +1,109 @@
+---
+id: 587d824c367417b2b2512c4e
+title: ある値が、他の値より小さいか、もしくは他の値以上かをテストする
+challengeType: 2
+forumTopicId: 301606
+dashedName: test-if-one-value-is-below-or-at-least-as-large-as-another
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) の始動プロジェクト、または [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/) からクローンされたプロジェクトに基づいて構築されています。
+
+# --instructions--
+
+`tests/1_unit-tests.js` の中の、`Comparisons` スイート内の `#9` に分類されたテストにおいて、テストを合格にする (`true` と評価する必要があります) ために、それぞれの `assert` を `assert.isBelow` または `assert.isAtLeast` に変更してください。 アサートに渡された引数を変更しないでください。
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=8').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+最初のアサーションに対して、正しいメソッドを選ぶ必要があります - `isBelow` もしくは `isAtLeast` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=8').then(
+ (data) => {
+ assert.equal(
+ data.assertions[0].method,
+ 'isAtLeast',
+ '5 is at least (>=) 5'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+2 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `isBelow` もしくは `isAtLeast` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=8').then(
+ (data) => {
+ assert.equal(
+ data.assertions[1].method,
+ 'isAtLeast',
+ '2 * Math.random() is at least 0'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+3 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `isBelow` もしくは `isAtLeast` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=8').then(
+ (data) => {
+ assert.equal(data.assertions[2].method, 'isBelow', '1 is smaller than 2');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+4 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `isBelow` もしくは `isAtLeast` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=8').then(
+ (data) => {
+ assert.equal(
+ data.assertions[3].method,
+ 'isBelow',
+ '2/3 (0.6666) is smaller than 1'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/use-assert.isok-and-assert.isnotok.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/use-assert.isok-and-assert.isnotok.md
new file mode 100644
index 0000000000..70e50bc6cd
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/use-assert.isok-and-assert.isnotok.md
@@ -0,0 +1,87 @@
+---
+id: 587d824b367417b2b2512c48
+title: Assert.isOK と Assert.isNotOK を使用する
+challengeType: 2
+forumTopicId: 301607
+dashedName: use-assert-isok-and-assert-isnotok
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) の始動プロジェクト、または [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/) からクローンされたプロジェクトに基づいて構築されています。
+
+`isOk()` は真値かどうかをテストし、 `isNotOk()` は偽値かどうかをテストします。
+
+真値と偽値についてさらに学習するには、[Falsy Bouncer](https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/basic-algorithm-scripting/falsy-bouncer) チャレンジに挑戦してください。
+
+# --instructions--
+
+`tests/1_unit-tests.js` の中の、`Basic Assertions` スイート内の `#3` に分類されたテストにおいて、テストを合格にする (`true` と評価する必要があります) ために、それぞれの `assert` を `assert.isOk()` または `assert.isNotOk()` に変更してください。 アサートに渡された引数を変更しないでください。
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=2').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+最初のアサーションに対して、正しいメソッドを選ぶ必要があります - `isOk` もしくは `isNotOk` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=2').then(
+ (data) => {
+ assert.equal(data.assertions[0].method, 'isNotOk', 'Null is falsy');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+2 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `isOk` もしくは `isNotOk` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=2').then(
+ (data) => {
+ assert.equal(data.assertions[1].method, 'isOk', 'A string is truthy');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+3 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `isOk` もしくは `isNotOk` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=2').then(
+ (data) => {
+ assert.equal(data.assertions[2].method, 'isOk', 'true is truthy');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/use-regular-expressions-to-test-a-string.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/use-regular-expressions-to-test-a-string.md
new file mode 100644
index 0000000000..0b1817df7e
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/use-regular-expressions-to-test-a-string.md
@@ -0,0 +1,79 @@
+---
+id: 587d824d367417b2b2512c54
+title: 文字列をテストするために正規表現を使用する
+challengeType: 2
+forumTopicId: 301608
+dashedName: use-regular-expressions-to-test-a-string
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) の始動プロジェクト、または [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/) からクローンされたプロジェクトに基づいて構築されています。
+
+`match()` は、実際の値が 2 番目の引数の正規表現に一致することをアサートします。
+
+# --instructions--
+
+`tests/1_unit-tests.js` の中の、`Strings` スイート内の `#15` に分類されたテストにおいて、テストを合格にする (`true` と評価する必要があります) ために、それぞれの `assert` を `assert.match` または `assert.notMatch` に変更してください。 アサートに渡された引数を変更しないでください。
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=14').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+最初のアサーションに対して、正しいメソッドを選ぶ必要があります - `match` もしくは `notMatch` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=14').then(
+ (data) => {
+ assert.equal(
+ data.assertions[0].method,
+ 'match',
+ "'# name:John Doe, age:35' matches the regex"
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+2 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `match` もしくは `notMatch` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=14').then(
+ (data) => {
+ assert.equal(
+ data.assertions[1].method,
+ 'notMatch',
+ "'# name:Paul Smith III, age:twenty-four' does not match the regex (the age must be numeric)"
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/use-the-double-equals-to-assert-equality.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/use-the-double-equals-to-assert-equality.md
new file mode 100644
index 0000000000..a6092d6763
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/use-the-double-equals-to-assert-equality.md
@@ -0,0 +1,111 @@
+---
+id: 587d824b367417b2b2512c4a
+title: ダブルイコールを使用して等価をアサートする
+challengeType: 2
+forumTopicId: 301609
+dashedName: use-the-double-equals-to-assert-equality
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) の始動プロジェクト、または [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/) からクローンされたプロジェクトに基づいて構築されています。
+
+`equal()` は、`==` を使用してオブジェクトを比較します。
+
+# --instructions--
+
+`tests/1_unit-tests.js` の中の、`Equality` スイート内の `#5` に分類されたテストにおいて、テストを合格にする(`true` と評価する必要があります)ために、それぞれの `assert` を `assert.equal` または `assert.notEqual` に変更してください。 アサートに渡された引数を変更しないでください。
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=4').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+最初のアサーションに対して、正しいメソッドを選ぶ必要があります - `equal` もしくは `notEqual` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=4').then(
+ (data) => {
+ assert.equal(
+ data.assertions[0].method,
+ 'equal',
+ 'Numbers are coerced into strings with == '
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+2 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `equal` もしくは `notEqual` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=4').then(
+ (data) => {
+ assert.equal(
+ data.assertions[1].method,
+ 'notEqual',
+ ' == compares object references'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+3 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `equal` もしくは `notEqual` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=4').then(
+ (data) => {
+ assert.equal(
+ data.assertions[2].method,
+ 'equal',
+ "6 * '2' is 12 ! It should be equal to '12'"
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+4 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `equal` もしくは `notEqual` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=4').then(
+ (data) => {
+ assert.equal(data.assertions[3].method, 'notEqual', "6 + '2' is '62'...");
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/use-the-triple-equals-to-assert-strict-equality.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/use-the-triple-equals-to-assert-strict-equality.md
new file mode 100644
index 0000000000..afe61696d4
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-and-testing-with-chai/use-the-triple-equals-to-assert-strict-equality.md
@@ -0,0 +1,111 @@
+---
+id: 587d824b367417b2b2512c4b
+title: トリプルイコールを使用して厳密等価をアサートする
+challengeType: 2
+forumTopicId: 301610
+dashedName: use-the-triple-equals-to-assert-strict-equality
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) の始動プロジェクト、または [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/) からクローンされたプロジェクトに基づいて構築されています。
+
+`strictEqual()` は、`===` を使用してオブジェクトを比較します。
+
+# --instructions--
+
+`tests/1_unit-tests.js` 内で、`Equality` スイートの `#6` に分類されるテストにおいて、(`true` と評価する必要がある) テストに合格にするために、各 `assert` を `assert.strictEqual` または `assert.notStrictEqual` のいずれかに変更してください。 アサートに渡された引数を変更しないでください。
+
+# --hints--
+
+すべてのテストに合格する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=5').then(
+ (data) => {
+ assert.equal(data.state, 'passed');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+最初のアサーションに対して、正しいメソッドを選ぶ必要があります - `strictEqual` もしくは `notStrictEqual` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=5').then(
+ (data) => {
+ assert.equal(
+ data.assertions[0].method,
+ 'notStrictEqual',
+ 'with strictEqual the type must match'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+2 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `strictEqual` もしくは `notStrictEqual` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=5').then(
+ (data) => {
+ assert.equal(data.assertions[1].method, 'strictEqual', '3*2 = 6...');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+3 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `strictEqual` もしくは `notStrictEqual` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=5').then(
+ (data) => {
+ assert.equal(
+ data.assertions[2].method,
+ 'strictEqual',
+ "6 * '2' is 12. Types match !"
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+4 番目のアサーションに対して、正しいメソッドを選ぶ必要があります - `strictEqual` もしくは `notStrictEqual` です。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/get-tests?type=unit&n=5').then(
+ (data) => {
+ assert.equal(
+ data.assertions[3].method,
+ 'notStrictEqual',
+ 'Even if they have the same elements, the Arrays are notStrictEqual'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-projects/american-british-translator.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-projects/american-british-translator.md
new file mode 100644
index 0000000000..7110d3377b
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-projects/american-british-translator.md
@@ -0,0 +1,337 @@
+---
+id: 5e601c0d5ac9d0ecd8b94afe
+title: アメリカ英語とイギリス英語の変換機
+challengeType: 4
+forumTopicId: 462358
+dashedName: american-british-translator
+---
+
+# --description--
+
+
と同様の機能を持つフルスタック JavaScript アプリを構築してください。 プロジェクトに取り組むにあたり、以下の方法のうち 1 つを用いてコードを記述します。
+
+- [GitHub リポジトリ](https://github.com/freeCodeCamp/boilerplate-project-american-british-english-translator/)をクローンし、ローカル環境でプロジェクトを完了させる。
+- [Replit 始動プロジェクト](https://replit.com/github/freeCodeCamp/boilerplate-project-american-british-english-translator)を使用して、プロジェクトを完了させる。
+- 使い慣れたサイトビルダーを使用してプロジェクトを完了させる。 必ず GitHub リポジトリのすべてのファイルを取り込む。
+
+完了したら、プロジェクトの動作デモをどこか公開の場にホストしてください。 そして、`Solution Link` フィールドでデモへの URL を送信してください。 必要に応じて、`GitHub Link` フィールドでプロジェクトのソースコードへのリンクを送信してください。
+
+# --instructions--
+
+- すべてのロジックを `/components/translator.js` に含めてください。
+- `/routes/api.js` で `/api/translate` ルートを完成させてください。
+- `tests/1_unit-tests.js` および `tests/2_functional-tests.js` で、すべてのユニット/機能テストを作成してください。
+- アプリで変換すべきスペルと用語については、`/components` にある JavaScript ファイルを参照してください。
+- Replit でテストを実行するには、`.env` ファイル内で引用符を付けずに`NODE_ENV` を `test` に設定してください。
+- コンソールでテストを実行するには、コマンド `npm run test` を使用してください。 Replit コンソールを開くには、Ctrl+Shift+P (Macの場合はCmd) を押して「open shell」と入力してください。
+
+`tests/1_unit-tests.js` に以下のテストを記述してください。
+
+- `Mangoes are my favorite fruit.` をイギリス英語に変換してください
+- `I ate yogurt for breakfast.` をイギリス英語に変換してください
+- `We had a party at my friend's condo.` をイギリス英語に変換してください
+- `Can you toss this in the trashcan for me?` をイギリス英語に変換してください
+- `The parking lot was full.` をイギリス英語に変換してください
+- `Like a high tech Rube Goldberg machine.` をイギリス英語に変換してください
+- `To play hooky means to skip class or work.` をイギリス英語に変換してください
+- `No Mr. Bond, I expect you to die.` をイギリス英語に変換してください
+- `Dr. Grosh will see you now.` をイギリス英語に変換してください
+- `Lunch is at 12:15 today.` をイギリス英語に変換してください
+- `We watched the footie match for a while.` をイギリス英語に変換してください
+- `Paracetamol takes up to an hour to work.` をイギリス英語に変換してください
+- `First, caramelise the onions.` をイギリス英語に変換してください
+- `I spent the bank holiday at the funfair.` をイギリス英語に変換してください
+- `I had a bicky then went to the chippy.` をイギリス英語に変換してください
+- `I've just got bits and bobs in my bum bag.` をイギリス英語に変換してください
+- `The car boot sale at Boxted Airfield was called off.` をイギリス英語に変換してください
+- `Have you met Mrs Kalyani?` をイギリス英語に変換してください
+- `Prof Joyner of King's College, London.` をイギリス英語に変換してください
+- `Tea time is usually around 4 or 4.30.` をイギリス英語に変換してください
+- `Mangoes are my favorite fruit.` の変換をハイライト表示してください
+- `I ate yogurt for breakfast.` の変換をハイライト表示してください
+- `We watched the footie match for a while.` の変換をハイライト表示してください
+- `Paracetamol takes up to an hour to work.` の変換をハイライト表示してください
+
+`tests/2_functional-tests.js` に以下のテストを記述してください。
+
+- テキストとロケールフィールドの変換: `/api/translate` への POST リクエスト
+- テキストと無効なロケールフィールドの変換: `/api/translate` への POST リクエスト
+- 不足しているテキストフィールドの変換: `/api/translate` への POST リクエスト
+- 不足しているロケールフィールドの変換: `/api/translate` への POST リクエスト
+- 空のテキストの変換: `/api/translate` への POST リクエスト
+- 変換不要テキストの変換: `/api/translate` への POST リクエスト
+
+# --hints--
+
+サンプルの URL ではなく、自分で作成したプロジェクトを提供することができます。
+
+```js
+(getUserInput) => {
+ assert(
+ !/.*\/american-british-translator\.freecodecamp\.rocks/.test(
+ getUserInput('url')
+ )
+ );
+};
+```
+
+変換するテキストの `text` を含むボディと、`american-to-british` もしくは `british-to-american` のいずれかを含む `locale` を使用して、`/api/translate` へ `POST` できます。 返されるオブジェクトには、送信した `text` と、変換後のテキストを含む `translation` が含まれている必要があります。
+
+```js
+async (getUserInput) => {
+ try {
+ const text = 'Mangoes are my favorite fruit.';
+ const locale = 'american-to-british';
+ const output = {
+ text: 'Mangoes are my favorite fruit.',
+ translation:
+ 'Mangoes are my
favourite fruit.'
+ };
+ let data = await fetch(getUserInput('url') + '/api/translate', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ text, locale })
+ });
+ let parsed = await data.json();
+ assert.isObject(parsed);
+ assert.property(parsed, 'text');
+ assert.property(parsed, 'translation');
+ assert.deepEqual(parsed, output);
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+`/api/translate` ルートでは、時間をアメリカ英語とイギリス英語で記述する方法を使用する必要があります。 たとえば、10 時 30 分は、イギリス英語では「10.30」、アメリカ英語では「10:30」と記述します。 `span` 要素に時間文字列全体を含める必要があります。たとえば、`
10:30` などとします。
+
+```js
+async (getUserInput) => {
+ try {
+ const text = 'Lunch is at 12:15 today.';
+ const locale = 'american-to-british';
+ const output = {
+ text: text,
+ translation: 'Lunch is at
12.15 today.'
+ };
+ let data = await fetch(getUserInput('url') + '/api/translate', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ text, locale })
+ });
+ let parsed = await data.json();
+ assert.isObject(parsed);
+ assert.property(parsed, 'text');
+ assert.property(parsed, 'translation');
+ assert.deepEqual(parsed, output);
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+`/api/translate` ルートでは、肩書や敬語をアメリカ英語とイギリス英語で略記する方法も使用する必要があります。 たとえば、Doctor Wright は、イギリス英語では「Dr Wright」、アメリカ英語では「Dr. Wright」と 略記します。 アプリで使用すべきさまざまな肩書については、`/components/american-to-british-titles.js` を参照してください。
+
+```js
+async (getUserInput) => {
+ try {
+ const text = 'Dr. Grosh will see you now.';
+ const locale = 'american-to-british';
+ const output = {
+ text: text,
+ translation: '
Dr Grosh will see you now.'
+ };
+ let data = await fetch(getUserInput('url') + '/api/translate', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ text, locale })
+ });
+ let parsed = await data.json();
+ assert.isObject(parsed);
+ assert.property(parsed, 'text');
+ assert.property(parsed, 'translation');
+ assert.deepEqual(parsed, output);
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+変換されたスペルや用語を `
...` タグで囲み、緑色で表示します。
+
+```js
+async (getUserInput) => {
+ try {
+ const text = 'Mangoes are my favorite fruit.';
+ const locale = 'american-to-british';
+ const output = {
+ text: 'Mangoes are my favorite fruit.',
+ translation:
+ 'Mangoes are my
favourite fruit.'
+ };
+ let data = await fetch(getUserInput('url') + '/api/translate', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ text, locale })
+ });
+ let parsed = await data.json();
+ assert.isObject(parsed);
+ assert.property(parsed, 'text');
+ assert.property(parsed, 'translation');
+ assert.deepEqual(parsed, output);
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+1 つ以上の必須フィールドが存在しない場合は、`{ error: 'Required field(s) missing' }` を返します。
+
+```js
+async (getUserInput) => {
+ try {
+ const locale = 'american-to-british';
+ let data = await fetch(getUserInput('url') + '/api/translate', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ locale })
+ });
+ let parsed = await data.json();
+ assert.isObject(parsed);
+ assert.property(parsed, 'error');
+ assert.equal(parsed.error, 'Required field(s) missing');
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+`text` が空の場合は、`{ error: 'No text to translate' }` を返します。
+
+```js
+async (getUserInput) => {
+ try {
+ const locale = 'american-to-british';
+ let data = await fetch(getUserInput('url') + '/api/translate', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ text: '', locale })
+ });
+ let parsed = await data.json();
+ assert.isObject(parsed);
+ assert.property(parsed, 'error');
+ assert.equal(parsed.error, 'No text to translate');
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+`locale` が 2 つの指定されたロケールのいずれとも一致しない場合は、`{ error: 'Invalid value for locale field' }` を返します。
+
+```js
+async (getUserInput) => {
+ try {
+ const text = "Ceci n'est pas une pipe";
+ const locale = 'french-to-american';
+ let data = await fetch(getUserInput('url') + '/api/translate', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ text, locale })
+ });
+ let parsed = await data.json();
+ assert.isObject(parsed);
+ assert.property(parsed, 'error');
+ assert.equal(parsed.error, 'Invalid value for locale field');
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+`text` が変換を必要としない場合は、`translation` の値として `"Everything looks good to me!"` を返します。
+
+```js
+async (getUserInput) => {
+ try {
+ const locale = 'british-to-american';
+ const output = {
+ text: 'SaintPeter and nhcarrigan give their regards!',
+ translation: 'Everything looks good to me!'
+ };
+ let data = await fetch(getUserInput('url') + '/api/translate', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ text: output.text, locale })
+ });
+ let parsed = await data.json();
+ assert.isObject(parsed);
+ assert.isObject(parsed);
+ assert.property(parsed, 'text');
+ assert.property(parsed, 'translation');
+ assert.deepEqual(parsed, output);
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+24 種類のテストがすべて完了し、合格しています。 テストを記述すべき期待される動作については、`/tests/1_unit-tests.js` を参照してください。
+
+```js
+async (getUserInput) => {
+ try {
+ const getTests = await $.get(getUserInput('url') + '/_api/get-tests');
+ assert.isArray(getTests);
+ const unitTests = getTests.filter((test) => {
+ return !!test.context.match(/Unit Tests/gi);
+ });
+ assert.isAtLeast(unitTests.length, 24, 'At least 24 tests passed');
+ unitTests.forEach((test) => {
+ assert.equal(test.state, 'passed', 'Tests in Passed State');
+ assert.isAtLeast(
+ test.assertions.length,
+ 1,
+ 'At least one assertion per test'
+ );
+ });
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+6 種類の機能テストがすべて完了し、合格しています。 テストを記述すべき機能については、`/tests/2_functional-tests.js` を参照してください。
+
+```js
+async (getUserInput) => {
+ try {
+ const getTests = await $.get(getUserInput('url') + '/_api/get-tests');
+ assert.isArray(getTests);
+ const functTests = getTests.filter((test) => {
+ return !!test.context.match(/Functional Tests/gi);
+ });
+ assert.isAtLeast(functTests.length, 6, 'At least 6 tests passed');
+ functTests.forEach((test) => {
+ assert.equal(test.state, 'passed', 'Tests in Passed State');
+ assert.isAtLeast(
+ test.assertions.length,
+ 1,
+ 'At least one assertion per test'
+ );
+ });
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-projects/issue-tracker.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-projects/issue-tracker.md
new file mode 100644
index 0000000000..879ccb7c98
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-projects/issue-tracker.md
@@ -0,0 +1,369 @@
+---
+id: 587d8249367417b2b2512c42
+title: 課題トラッカー
+challengeType: 4
+forumTopicId: 301569
+dashedName: issue-tracker
+---
+
+# --description--
+
+
と同様の機能を持つフルスタック JavaScript アプリを構築してください。 プロジェクトに取り組むにあたり、以下の方法のうち 1 つを用いてコードを記述します。
+
+- [GitHub リポジトリ](https://github.com/freeCodeCamp/boilerplate-project-issuetracker/)をクローンし、ローカル環境でプロジェクトを完了させる。
+- [Replit 始動プロジェクト](https://replit.com/github/freeCodeCamp/boilerplate-project-issuetracker)を使用して、プロジェクトを完了させる。
+- 使い慣れたサイトビルダーを使用してプロジェクトを完了させる。 必ず GitHub リポジトリのすべてのファイルを取り込む。
+
+完了したら、プロジェクトの動作デモをどこか公開の場にホストしてください。 そして、`Solution Link` フィールドでデモへの URL を送信してください。 必要に応じて、`GitHub Link` フィールドでプロジェクトのソースコードへのリンクを送信してください。
+
+# --instructions--
+
+- `/routes/api.js` で、必要なルートを完成させてください。
+- `tests/2_functional-tests.js` にすべての機能テストを作成してください。
+- `sample.env` ファイルを `.env` にコピーし、変数を適切に設定してください。
+- テストを実行するには、`.env` ファイルの `NODE_ENV=test` をコメント解除してください。
+- コンソールでテストを実行するには、コマンド `npm run test` を使用してください。 Replit コンソールを開くには、Ctrl+Shift+P (Macの場合はCmd) を押して「open shell」と入力してください。
+
+`tests/2_functional-tests.js` に以下のテストを記述してください。
+
+- すべてのフィールドについて課題を作成してください: `/api/issues/{project}` への POST リクエスト
+- 必須フィールドのみについて課題を作成してください: `/api/issues/{project}` への POST リクエスト
+- 不足している必須フィールドについて課題を作成してください: `/api/issues/{project}` への POST リクエスト
+- プロジェクトの課題を表示してください: `/api/issues/{project}` への GET リクエスト
+- 1 つのフィルターでプロジェクトの課題を表示してください: `/api/issues/{project}` への GET リクエスト
+- 複数のフィルターでプロジェクトの課題を表示してください: `/api/issues/{project}` への GET リクエスト
+- 課題の 1 つのフィールドを更新してください: `/api/issues/{project}` への PUT リクエスト
+- 課題の複数フィールドを更新してください: `/api/issues/{project}` への PUT リクエスト
+- `_id` が不足している課題を更新してください: `/api/issues/{project}` への PUT リクエスト
+- 更新すべきフィールドがない課題を更新してください: `/api/issues/{project}` への PUT リクエスト
+- 無効な `_id` の課題を更新してください: `/api/issues/{project}` への PUT リクエスト
+- 課題を削除してください: `/api/issues/{project}` への DELETE リクエスト
+- 無効な `_id` の課題を削除してください: `/api/issues/{project}` への DELETE リクエスト
+- `_id` が不足している課題を削除してください: `/api/issues/{project}` への DELETE リクエスト
+
+# --hints--
+
+サンプルの URL ではなく、自分で作成したプロジェクトを提供することができます。
+
+```js
+(getUserInput) => {
+ assert(!/.*\/issue-tracker\.freecodecamp\.rocks/.test(getUserInput('url')));
+};
+```
+
+必須フィールド `issue_title`、`issue_text`、`created_by`、およびオプションフィールド `assigned_to` および `status_text` を含むフォームデータを使用して、`/api/issues/{projectname}` へ `POST` リクエストを送信することができます。
+
+```js
+async (getUserInput) => {
+ try {
+ let test_data = {
+ issue_title: 'Faux Issue Title',
+ issue_text: 'Functional Test - Required Fields Only',
+ created_by: 'fCC'
+ };
+ const data = await $.post(
+ getUserInput('url') + '/api/issues/fcc-project',
+ test_data
+ );
+ assert.isObject(data);
+ assert.nestedInclude(data, test_data);
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+`/api/issues/{projectname}` への `POST` リクエストは、作成されたオブジェクトを返します。また、送信したすべてのフィールドが含まれている必要があります。 除外されたオプションフィールドは空の文字列として返します。 さらに、`created_on` (日付/時間)、`updated_on` (日付/時間)、`open` (ブール値、open の場合はデフォルト値の `true`、closed の場合は `false`) および `_id` を含めてください。
+
+```js
+async (getUserInput) => {
+ try {
+ let test_data = {
+ issue_title: 'Faux Issue Title 2',
+ issue_text: 'Functional Test - Every field filled in',
+ created_by: 'fCC',
+ assigned_to: 'Chai and Mocha'
+ };
+ const data = await $.post(
+ getUserInput('url') + '/api/issues/fcc-project',
+ test_data
+ );
+ assert.isObject(data);
+ assert.nestedInclude(data, test_data);
+ assert.property(data, 'created_on');
+ assert.isNumber(Date.parse(data.created_on));
+ assert.property(data, 'updated_on');
+ assert.isNumber(Date.parse(data.updated_on));
+ assert.property(data, 'open');
+ assert.isBoolean(data.open);
+ assert.isTrue(data.open);
+ assert.property(data, '_id');
+ assert.isNotEmpty(data._id);
+ assert.property(data, 'status_text');
+ assert.isEmpty(data.status_text);
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+`/api/issues/{projectname}` への `POST` リクエストを必須フィールドなしで送信した場合は、エラー `{ error: 'required field(s) missing' }` を返します。
+
+```js
+async (getUserInput) => {
+ try {
+ let test_data = { created_by: 'fCC' };
+ const data = await $.post(getUserInput('url') + '/api/issues/fcc-project', {
+ created_by: 'fCC'
+ });
+ assert.isObject(data);
+ assert.property(data, 'error');
+ assert.equal(data.error, 'required field(s) missing');
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+特定の `projectname` に対するすべての課題の配列 (課題ごとにすべてのフィールドが存在します) に対して、`/api/issues/{projectname}` へ `GET` リクエストを送信できます。
+
+```js
+async (getUserInput) => {
+ try {
+ let test_data = { issue_text: 'Get Issues Test', created_by: 'fCC' };
+ const url =
+ getUserInput('url') +
+ '/api/issues/get_issues_test_' +
+ Date.now().toString().substring(7);
+ const data1 = await $.post(
+ url,
+ Object.assign(test_data, { issue_title: 'Faux Issue 1' })
+ );
+ assert.isObject(data1);
+ const data2 = await $.post(
+ url,
+ Object.assign(test_data, { issue_title: 'Faux Issue 2' })
+ );
+ assert.isObject(data2);
+ const data3 = await $.post(
+ url,
+ Object.assign(test_data, { issue_title: 'Faux Issue 3' })
+ );
+ assert.isObject(data3);
+ const getIssues = await $.get(url);
+ assert.isArray(getIssues);
+ assert.lengthOf(getIssues, 3);
+ let re = new RegExp('Faux Issue \\d');
+ getIssues.forEach((issue) => {
+ assert.property(issue, 'issue_title');
+ assert.match(issue.issue_title, re);
+ assert.property(issue, 'issue_text');
+ assert.property(issue, 'created_by');
+ assert.property(issue, 'assigned_to');
+ assert.property(issue, 'status_text');
+ assert.property(issue, 'open');
+ assert.property(issue, 'created_on');
+ assert.property(issue, 'updated_on');
+ assert.property(issue, '_id');
+ });
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+`/api/issues/{projectname}` へ `GET` リクエストを送信し、任意のフィールドと値を URL クエリとして渡すことにより、リクエストをフィルターで絞り込むことができます (例: `/api/issues/{project}?open=false`)。 1 つ以上のフィールド/値のペアを一度に渡すことができます。
+
+```js
+async (getUserInput) => {
+ try {
+ let test_data = {
+ issue_title: 'To be Filtered',
+ issue_text: 'Filter Issues Test'
+ };
+ const url =
+ getUserInput('url') +
+ '/api/issues/get_issues_test_' +
+ Date.now().toString().substring(7);
+ const data1 = await $.post(
+ url,
+ Object.assign(test_data, { created_by: 'Alice', assigned_to: 'Bob' })
+ );
+ const data2 = await $.post(
+ url,
+ Object.assign(test_data, { created_by: 'Alice', assigned_to: 'Bob' })
+ );
+ const data3 = await $.post(
+ url,
+ Object.assign(test_data, { created_by: 'Alice', assigned_to: 'Eric' })
+ );
+ const data4 = await $.post(
+ url,
+ Object.assign(test_data, { created_by: 'Carol', assigned_to: 'Eric' })
+ );
+ const getSingle = await $.get(url + '?created_by=Alice');
+ assert.isArray(getSingle);
+ assert.lengthOf(getSingle, 3);
+ const getMultiple = await $.get(url + '?created_by=Alice&assigned_to=Bob');
+ assert.isArray(getMultiple);
+ assert.lengthOf(getMultiple, 2);
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+`_id` と 1 つ 以上の更新すべきフィールドを指定して、`/api/issues/{projectname}` へ `PUT` リクエストを送信することができます。 成功した場合は、`updated_on` フィールドを更新し、 `{ result: 'successfully updated', '_id': _id }` を返す必要があります。
+
+```js
+async (getUserInput) => {
+ try {
+ let initialData = {
+ issue_title: 'Issue to be Updated',
+ issue_text: 'Functional Test - Put target',
+ created_by: 'fCC'
+ };
+ const url = getUserInput('url') + '/api/issues/fcc-project';
+ const itemToUpdate = await $.post(url, initialData);
+ const updateSucccess = await $.ajax({
+ url: url,
+ type: 'PUT',
+ data: { _id: itemToUpdate._id, issue_text: 'New Issue Text' }
+ });
+ assert.isObject(updateSucccess);
+ assert.deepEqual(updateSucccess, {
+ result: 'successfully updated',
+ _id: itemToUpdate._id
+ });
+ const getUpdatedId = await $.get(url + '?_id=' + itemToUpdate._id);
+ assert.isArray(getUpdatedId);
+ assert.isObject(getUpdatedId[0]);
+ assert.isAbove(
+ Date.parse(getUpdatedId[0].updated_on),
+ Date.parse(getUpdatedId[0].created_on)
+ );
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+`/api/issues/{projectname}` へ送信した `PUT` リクエストに `_id` が含まれていない場合、戻り値は `{ error: 'missing _id' }` です。
+
+```js
+async (getUserInput) => {
+ try {
+ const url = getUserInput('url') + '/api/issues/fcc-project';
+ const badUpdate = await $.ajax({ url: url, type: 'PUT' });
+ assert.isObject(badUpdate);
+ assert.property(badUpdate, 'error');
+ assert.equal(badUpdate.error, 'missing _id');
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+`/api/issues/{projectname}` へ送信した `PUT` リクエストに更新フィールドが含まれていない 場合、戻り値は `{ error: 'no update field(s) sent', '_id': _id }` です。 それ以外のエラーでは、戻り値は `{ error: 'could not update', '_id': _id }` です。
+
+```js
+async (getUserInput) => {
+ try {
+ const url = getUserInput('url') + '/api/issues/fcc-project';
+ const badUpdate = await $.ajax({
+ url: url,
+ type: 'PUT',
+ data: { _id: '5f665eb46e296f6b9b6a504d' }
+ });
+ assert.deepEqual(badUpdate, {
+ error: 'no update field(s) sent',
+ _id: '5f665eb46e296f6b9b6a504d'
+ });
+ const badIdUpdate = await $.ajax({
+ url: url,
+ type: 'PUT',
+ data: { _id: '5f665eb46e296f6b9b6a504d', issue_text: 'New Issue Text' }
+ });
+ assert.deepEqual(badIdUpdate, {
+ error: 'could not update',
+ _id: '5f665eb46e296f6b9b6a504d'
+ });
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+`_id` を指定して `/api/issues/{projectname}` へ `DELETE` リクエストを送信して、課題を削除することができます。 `_id` が送信されていない場合、戻り値は `{ error: 'missing _id' }` です。 成功した場合、戻り値は `{ result: 'successfully deleted', '_id': _id }` です。 失敗した場合、戻り値は `{ error: 'could not delete', '_id': _id }` です。
+
+```js
+async (getUserInput) => {
+ try {
+ let initialData = {
+ issue_title: 'Issue to be Deleted',
+ issue_text: 'Functional Test - Delete target',
+ created_by: 'fCC'
+ };
+ const url = getUserInput('url') + '/api/issues/fcc-project';
+ const itemToDelete = await $.post(url, initialData);
+ assert.isObject(itemToDelete);
+ const deleteSuccess = await $.ajax({
+ url: url,
+ type: 'DELETE',
+ data: { _id: itemToDelete._id }
+ });
+ assert.isObject(deleteSuccess);
+ assert.deepEqual(deleteSuccess, {
+ result: 'successfully deleted',
+ _id: itemToDelete._id
+ });
+ const noId = await $.ajax({ url: url, type: 'DELETE' });
+ assert.isObject(noId);
+ assert.deepEqual(noId, { error: 'missing _id' });
+ const badIdDelete = await $.ajax({
+ url: url,
+ type: 'DELETE',
+ data: { _id: '5f665eb46e296f6b9b6a504d', issue_text: 'New Issue Text' }
+ });
+ assert.isObject(badIdDelete);
+ assert.deepEqual(badIdDelete, {
+ error: 'could not delete',
+ _id: '5f665eb46e296f6b9b6a504d'
+ });
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+14 種類の機能テストがすべて完了し、合格しています。
+
+```js
+async (getUserInput) => {
+ try {
+ const getTests = await $.get(getUserInput('url') + '/_api/get-tests');
+ assert.isArray(getTests);
+ assert.isAtLeast(getTests.length, 14, 'At least 14 tests passed');
+ getTests.forEach((test) => {
+ assert.equal(test.state, 'passed', 'Test in Passed State');
+ assert.isAtLeast(
+ test.assertions.length,
+ 1,
+ 'At least one assertion per test'
+ );
+ });
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-projects/metric-imperial-converter.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-projects/metric-imperial-converter.md
new file mode 100644
index 0000000000..a81675ac55
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-projects/metric-imperial-converter.md
@@ -0,0 +1,318 @@
+---
+id: 587d8249367417b2b2512c41
+title: メートル法とヤード・ポンド法の換算機
+challengeType: 4
+forumTopicId: 301570
+dashedName: metric-imperial-converter
+---
+
+# --description--
+
+
と同様の機能を持つフルスタック JavaScript アプリを構築してください。 プロジェクトに取り組むにあたり、以下の方法のうち 1 つを用いてコードを記述します。
+
+- [ GitHub リポジトリ](https://github.com/freeCodeCamp/boilerplate-project-metricimpconverter/)をクローンし、ローカル環境でプロジェクトを完了させる。
+- [Replit 始動プロジェクト](https://replit.com/github/freeCodeCamp/boilerplate-project-metricimpconverter)を使用して、プロジェクトを完了させる。
+- 使い慣れたサイトビルダーを使用してプロジェクトを完了させる。 必ず GitHub リポジトリのすべてのファイルを取り込む。
+
+完了したら、プロジェクトの動作デモをどこか公開の場にホストしてください。 そして、`Solution Link` フィールドでデモへの URL を送信してください。 必要に応じて、`GitHub Link` フィールドでプロジェクトのソースコードへのリンクを送信してください。
+
+# --instructions--
+
+- `/controllers/convertHandler.js` で、必要な変換ロジックを完成させてください。
+- `/routes/api.js` で、必要なルートを完成させてください。
+- `sample.env` ファイルを `.env` にコピーし、変数を適切に設定してください。
+- テストを実行するには、`.env` ファイルの `NODE_ENV=test` をコメント解除してください。
+- コンソールでテストを実行するには、コマンド `npm run test` を使用してください。 Replit コンソールを開くには、Ctrl+Shift+P (Macの場合はCmd) を押して「open shell」と入力してください。
+
+`tests/1_unit-tests.js` に以下のテストを記述してください。
+
+- `convertHandler` は、整数入力を正しく読み取る必要があります。
+- `convertHandler` は、小数入力を正しく読み取る必要があります。
+- `convertHandler` は、分数入力を正しく読み取る必要があります。
+- `convertHandler` は、小数による分数入力を正しく読み取る必要があります。
+- `convertHandler` は、二重分数 (`3/2/3` など) の場合にエラーを正しく返す必要があります。
+- 数字が入力されていない場合、`convertHandler` は、デフォルトで数字 `1` を正しく入力する必要があります。
+- `convertHandler` は、それぞれの有効な入力単位を正しく読み取る必要があります。
+- `convertHandler` は、無効な入力単位の場合にエラーを正しく返す必要があります。
+- `convertHandler` は、有効な入力単位ごとに正しい戻り値単位を返す必要があります。
+- `convertHandler` は、有効な入力単位ごとに文字列単位を略さずに正しく返す必要があります。
+- `convertHandler` は、`gal` を `L` に正しく変換する必要があります。
+- `convertHandler` は、`L` を `gal` に正しく変換する必要があります。
+- `convertHandler` は、`mi` を `km` に正しく変換する必要があります。
+- `convertHandler` は、`km` を `mi` に正しく変換する必要があります。
+- `convertHandler` は、`lbs` を `kg` に正しく変換する必要があります。
+- `convertHandler` は、`kg` を `lbs` に正しく変換する必要があります。
+
+`tests/2_functional-tests.js` に以下のテストを記述してください。
+
+- `10L` などの有効な入力を変換してください: `/api/convert` への `GET` リクエスト
+- `32g` などの無効な入力を変換してください: `/api/convert` への`GET` リクエスト
+- `3/7.2/4kg` などの無効な数字を変換してください: `/api/convert` への `GET` リクエスト
+- `3/7.2/4kilomegagram` などの無効な数字かつ単位を変換してください: `/api/convert` への `GET` リクエスト
+- `kg` などの数字のない入力を変換してください: `/api/convert` への `GET` リクエスト
+
+# --hints--
+
+サンプルの URL ではなく、自分で作成したプロジェクトを提供することができます。
+
+```js
+getUserInput => {
+ assert(
+ !/.*\/metric-imperial-converter\.freecodecamp\.rocks/.test(
+ getUserInput('url')
+ )
+ );
+};
+```
+
+受け取った数字と単位を含む単一のパラメータを設定して `/api/convert` への `GET` を実行し、変換を実行することができます。 (ヒント: 単位の始まりを示す最初の文字のインデックスを探して入力を分割してください)
+
+```js
+
+```
+
+`'gal'` を `'L'` に変換できます。その逆も可能です。 (1 gal を 3.78541 L へ)
+
+```js
+async getUserInput => {
+ try {
+ const data1 = await $.get(getUserInput('url') + '/api/convert?input=1gal');
+ assert.equal(data1.returnNum, 3.78541);
+ assert.equal(data1.returnUnit, 'L');
+ const data2 = await $.get(getUserInput('url') + '/api/convert?input=10gal');
+ assert.equal(data2.returnNum, 37.8541);
+ assert.equal(data2.returnUnit, 'L');
+ const data3 = await $.get(getUserInput('url') + '/api/convert?input=1l');
+ assert.equal(data3.returnNum, 0.26417);
+ assert.equal(data3.returnUnit, 'gal');
+ const data4 = await $.get(getUserInput('url') + '/api/convert?input=10l');
+ assert.equal(data4.returnNum, 2.64172);
+ assert.equal(data4.returnUnit, 'gal');
+ } catch (xhr) {
+ throw new Error(xhr.responseText || xhr.message);
+ }
+};
+```
+
+`'lbs'` を `'kg'` に変換できます。その逆も可能です。 (1 lbs を 0.453592 kg へ)
+
+```js
+async getUserInput => {
+ try {
+ const data1 = await $.get(getUserInput('url') + '/api/convert?input=1lbs');
+ assert.equal(data1.returnNum, 0.45359);
+ assert.equal(data1.returnUnit, 'kg');
+ const data2 = await $.get(getUserInput('url') + '/api/convert?input=10lbs');
+ assert.equal(data2.returnNum, 4.53592);
+ assert.equal(data2.returnUnit, 'kg');
+ const data3 = await $.get(getUserInput('url') + '/api/convert?input=1kg');
+ assert.equal(data3.returnNum, 2.20462);
+ assert.equal(data3.returnUnit, 'lbs');
+ const data4 = await $.get(getUserInput('url') + '/api/convert?input=10kg');
+ assert.equal(data4.returnNum, 22.04624);
+ assert.equal(data4.returnUnit, 'lbs');
+ } catch (xhr) {
+ throw new Error(xhr.responseText || xhr.message);
+ }
+};
+```
+
+`'mi'` を `'km'` に変換できます。その逆も可能です。 (1 mi を 1.60934 km へ)
+
+```js
+async getUserInput => {
+ try {
+ const data1 = await $.get(getUserInput('url') + '/api/convert?input=1mi');
+ assert.equal(data1.returnNum, 1.60934);
+ assert.equal(data1.returnUnit, 'km');
+ const data2 = await $.get(getUserInput('url') + '/api/convert?input=10mi');
+ assert.equal(data2.returnNum, 16.0934);
+ assert.equal(data2.returnUnit, 'km');
+ const data3 = await $.get(getUserInput('url') + '/api/convert?input=1km');
+ assert.equal(data3.returnNum, 0.62137);
+ assert.equal(data3.returnUnit, 'mi');
+ const data4 = await $.get(getUserInput('url') + '/api/convert?input=10km');
+ assert.equal(data4.returnNum, 6.21373);
+ assert.equal(data4.returnUnit, 'mi');
+ } catch (xhr) {
+ throw new Error(xhr.responseText || xhr.message);
+ }
+};
+```
+
+すべての入力単位は大文字と小文字の両方で受け入れられるようにする必要がありますが、小文字の `initUnit` と `returnUnit` で返す必要があります。ただし、liter のみは例外で、大文字の `'L'` で表示する必要があります。
+
+```js
+async getUserInput => {
+ try {
+ const data1 = await $.get(getUserInput('url') + '/api/convert?input=1gal');
+ assert.equal(data1.initUnit, 'gal');
+ assert.equal(data1.returnUnit, 'L');
+ const data2 = await $.get(getUserInput('url') + '/api/convert?input=10L');
+ assert.equal(data2.initUnit, 'L');
+ assert.equal(data2.returnUnit, 'gal');
+ const data3 = await $.get(getUserInput('url') + '/api/convert?input=1l');
+ assert.equal(data3.initUnit, 'L');
+ assert.equal(data3.returnUnit, 'gal');
+ const data4 = await $.get(getUserInput('url') + '/api/convert?input=10KM');
+ assert.equal(data4.initUnit, 'km');
+ assert.equal(data4.returnUnit, 'mi');
+ } catch (xhr) {
+ throw new Error(xhr.responseText || xhr.message);
+ }
+};
+```
+
+尺度の単位が無効の場合は、`'invalid unit'` を返します。
+
+```js
+async getUserInput => {
+ try {
+ const data = await $.get(getUserInput('url') + '/api/convert?input=1min');
+ assert(data.error === 'invalid unit' || data === 'invalid unit');
+ } catch (xhr) {
+ throw new Error(xhr.responseText || xhr.message);
+ }
+};
+```
+
+数値が無効の場合は、`'invalid number'` を返します。
+
+```js
+async getUserInput => {
+ try {
+ const data = await $.get(
+ getUserInput('url') + '/api/convert?input=1//2gal'
+ );
+ assert(data.error === 'invalid number' || data === 'invalid number');
+ } catch (xhr) {
+ throw new Error(xhr.responseText || xhr.message);
+ }
+};
+```
+
+単位と数値の両方が無効な場合は、`'invalid number and unit'` を返します。
+
+```js
+async getUserInput => {
+ try {
+ const data = await $.get(
+ getUserInput('url') + '/api/convert?input=1//2min'
+ );
+ assert(
+ data.error === 'invalid number and unit' ||
+ data === 'invalid number and unit'
+ );
+ } catch (xhr) {
+ throw new Error(xhr.responseText || xhr.message);
+ }
+};
+```
+
+パラメーターでは分数、小数または両方を使用できますが (5、1/2、2.5/6 など)、何も指定されていない場合はデフォルトで 1 になります。
+
+```js
+async getUserInput => {
+ try {
+ const data1 = await $.get(getUserInput('url') + '/api/convert?input=mi');
+ assert.approximately(data1.initNum, 1, 0.001);
+ assert.approximately(data1.returnNum, 1.60934, 0.001);
+ assert.equal(data1.returnUnit, 'km');
+ const data2 = await $.get(getUserInput('url') + '/api/convert?input=1/5mi');
+ assert.approximately(data2.initNum, 1 / 5, 0.1);
+ assert.approximately(data2.returnNum, 0.32187, 0.001);
+ assert.equal(data2.returnUnit, 'km');
+ const data3 = await $.get(
+ getUserInput('url') + '/api/convert?input=1.5/7km'
+ );
+ assert.approximately(data3.initNum, 1.5 / 7, 0.001);
+ assert.approximately(data3.returnNum, 0.13315, 0.001);
+ assert.equal(data3.returnUnit, 'mi');
+ const data4 = await $.get(
+ getUserInput('url') + '/api/convert?input=3/2.7km'
+ );
+ assert.approximately(data4.initNum, 3 / 2.7, 0.001);
+ assert.approximately(data4.returnNum, 0.69041, 0.001);
+ assert.equal(data4.returnUnit, 'mi');
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+`initNum`、`initUnit`、`returnNum`、`returnUnit` および `string` を返し、単位は `'{initNum} {initUnitString} converts to {returnNum} {returnUnitString}'` という形式でスペルアウトし、結果を小数点 5 桁に丸めます。
+
+```js
+async getUserInput => {
+ try {
+ const data = await $.get(getUserInput('url') + '/api/convert?input=2mi');
+ assert.equal(data.initNum, 2);
+ assert.equal(data.initUnit, 'mi');
+ assert.approximately(data.returnNum, 3.21868, 0.001);
+ assert.equal(data.returnUnit, 'km', 'returnUnit did not match');
+ assert.equal(data.string, '2 miles converts to 3.21868 kilometers');
+ } catch (xhr) {
+ throw new Error(xhr.responseText || xhr.message);
+ }
+};
+```
+
+16 種類のテストがすべて完了し、合格しています。
+
+```js
+async getUserInput => {
+ try {
+ const getTests = await $.get(getUserInput('url') + '/_api/get-tests');
+ assert.isArray(getTests);
+ const unitTests = getTests.filter(test => {
+ return !!test.context.match(/Unit Tests/gi);
+ });
+ assert.isAtLeast(unitTests.length, 16, 'At least 16 tests passed');
+ unitTests.forEach(test => {
+ assert.equal(test.state, 'passed', 'Tests in Passed State');
+ assert.isAtLeast(
+ test.assertions.length,
+ 1,
+ 'At least one assertion per test'
+ );
+ });
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+5 種類の機能テストがすべて完了し、合格しています。
+
+```js
+async getUserInput => {
+ try {
+ const getTests = await $.get(getUserInput('url') + '/_api/get-tests');
+ assert.isArray(getTests);
+ const functTests = getTests.filter(test => {
+ return !!test.context.match(/Functional Tests/gi);
+ });
+ assert.isAtLeast(functTests.length, 5, 'At least 5 tests passed');
+ functTests.forEach(test => {
+ assert.equal(test.state, 'passed', 'Tests in Passed State');
+ assert.isAtLeast(
+ test.assertions.length,
+ 1,
+ 'At least one assertion per test'
+ );
+ });
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-projects/personal-library.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-projects/personal-library.md
new file mode 100644
index 0000000000..0446f1827d
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-projects/personal-library.md
@@ -0,0 +1,220 @@
+---
+id: 587d824a367417b2b2512c43
+title: 個人図書館
+challengeType: 4
+forumTopicId: 301571
+dashedName: personal-library
+---
+
+# --description--
+
+
と同様の機能を持つフルスタック JavaScript アプリを構築してください。 プロジェクトに取り組むにあたり、以下の方法のうち 1 つを用いてコードを記述します。
+
+- [GitHub レポジトリ](https://github.com/freeCodeCamp/boilerplate-project-library)をクローンし、ローカル環境でチャレンジを完了させる。
+- [Replit 始動プロジェクト](https://replit.com/github/freeCodeCamp/boilerplate-project-library)を使用して、プロジェクトを完了させる。
+- 使い慣れたサイトビルダーを使用してプロジェクトを完了させる。 必ず GitHub リポジトリのすべてのファイルを取り込む。
+
+完了したら、プロジェクトの動作デモをどこか公開の場にホストしてください。 そして、`Solution Link` フィールドでデモへの URL を送信してください。 必要に応じて、`GitHub Link` フィールドでプロジェクトのソースコードへのリンクを送信してください。
+
+# --instructions--
+
+1. `.env` に、MongoDB 接続文字列を `DB` として引用符を使用せずに追加してください。例: `DB=mongodb://admin:pass@1234.mlab.com:1234/fccpersonallib`
+2. `.env` ファイルで、引用符を使用せずに `NODE_ENV` に `test` を設定してください。
+3. `routes/api.js` 内に、すべてのルートを作成する必要があります。
+4. `tests/2_functional-tests.js` に、すべての機能テストを作成します。
+
+# --hints--
+
+サンプルの URL ではなく、自分で作成したプロジェクトを提供することができます。
+
+```js
+(getUserInput) => {
+ assert(
+ !/.*\/personal-library\.freecodecamp\.rocks/.test(getUserInput('url'))
+ );
+};
+```
+
+フォームデータの一部として `title` を指定して、`/api/books` へ
POST リクエストを送信し、ブックを追加することができます。 返されるレスポンスは、`title` と一意の `_id` をキーとして持つオブジェクトになります。 `title` がリクエストに含まれていない場合、返されるレスポンスは文字列 `missing required field title` である必要があります。
+
+```js
+async (getUserInput) => {
+ try {
+ let data1 = await $.post(getUserInput('url') + '/api/books', {
+ title: 'Faux Book 1'
+ });
+ assert.isObject(data1);
+ assert.property(data1, 'title');
+ assert.equal(data1.title, 'Faux Book 1');
+ assert.property(data1, '_id');
+ let data2 = await $.post(getUserInput('url') + '/api/books');
+ assert.isString(data2);
+ assert.equal(data2, 'missing required field title');
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+
GET リクエストを `/api/books` へ送信し、すべてのブックを表す JSON レスポンスを受け取ることができます。 JSON レスポンスはオブジェクトの配列であり、それぞれのオブジェクト (ブック) に `title`、`_id` および `commentcount` プロパティが含まれます。
+
+```js
+async (getUserInput) => {
+ try {
+ let url = getUserInput('url') + '/api/books';
+ let a = $.post(url, { title: 'Faux Book A' });
+ let b = $.post(url, { title: 'Faux Book B' });
+ let c = $.post(url, { title: 'Faux Book C' });
+ await Promise.all([a, b, c]).then(async () => {
+ let data = await $.get(url);
+ assert.isArray(data);
+ assert.isAtLeast(data.length, 3);
+ data.forEach((book) => {
+ assert.isObject(book);
+ assert.property(book, 'title');
+ assert.isString(book.title);
+ assert.property(book, '_id');
+ assert.property(book, 'commentcount');
+ assert.isNumber(book.commentcount);
+ });
+ });
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+
GET リクエストを `/api/books/{_id}` へ送信して、プロパティ `title`、`_id` および `comments` 配列 (コメントがない場合は、空の配列) を含むブックの単一のオブジェクトを取得できます。 ブックが見つからない場合は、文字列 `no book exists` を返してください。
+
+```js
+async (getUserInput) => {
+ try {
+ let url = getUserInput('url') + '/api/books';
+ let noBook = await $.get(url + '/5f665eb46e296f6b9b6a504d');
+ assert.isString(noBook);
+ assert.equal(noBook, 'no book exists');
+ let sampleBook = await $.post(url, { title: 'Faux Book Alpha' });
+ assert.isObject(sampleBook);
+ let bookId = sampleBook._id;
+ let bookQuery = await $.get(url + '/' + bookId);
+ assert.isObject(bookQuery);
+ assert.property(bookQuery, 'title');
+ assert.equal(bookQuery.title, 'Faux Book Alpha');
+ assert.property(bookQuery, 'comments');
+ assert.isArray(bookQuery.comments);
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+`comment` を含む フォームボディデータとして指定して、
POST リクエストを `/api/books/{_id}` へ送信し、ブックにコメントを追加することができます。 返されるレスポンスは、前述のテストの
GET `/api/books/{_id}` リクエストと同様のブックオブジェクトになります。 `comment` がリクエストに含まれていない場合は、文字列 `missing required field comment` を返してください。 ブックが見つからない場合は、文字列 `no book exists` を返してください。
+
+```js
+async (getUserInput) => {
+ try {
+ let url = getUserInput('url') + '/api/books';
+ let commentTarget = await $.post(url, { title: 'Notable Book' });
+ assert.isObject(commentTarget);
+ let bookId = commentTarget._id;
+ let bookCom1 = await $.post(url + '/' + bookId, {
+ comment: 'This book is fab!'
+ });
+ let bookCom2 = await $.post(url + '/' + bookId, {
+ comment: 'I did not care for it'
+ });
+ assert.isObject(bookCom2);
+ assert.property(bookCom2, '_id');
+ assert.property(bookCom2, 'title');
+ assert.property(bookCom2, 'comments');
+ assert.lengthOf(bookCom2.comments, 2);
+ bookCom2.comments.forEach((comment) => {
+ assert.isString(comment);
+ assert.oneOf(comment, ['This book is fab!', 'I did not care for it']);
+ });
+ let commentErr = await $.post(url + '/' + bookId);
+ assert.isString(commentErr);
+ assert.equal(commentErr, 'missing required field comment');
+ let failingComment = await $.post(url + '/5f665eb46e296f6b9b6a504d', {
+ comment: 'Never Seen Comment'
+ });
+ assert.isString(failingComment);
+ assert.equal(failingComment, 'no book exists');
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+
DELETE リクエストを `/api/books/{_id}` へ送信して、コレクションからブックを削除できます。 成功した場合、文字列 `delete successful` のレスポンスを返します。 ブックが見つからない場合、文字列 `no book exists` を返してください。
+
+```js
+async (getUserInput) => {
+ try {
+ let url = getUserInput('url') + '/api/books';
+ let deleteTarget = await $.post(url, { title: 'Deletable Book' });
+ assert.isObject(deleteTarget);
+ let bookId = deleteTarget._id;
+ let doDelete = await $.ajax({ url: url + '/' + bookId, type: 'DELETE' });
+ assert.isString(doDelete);
+ assert.equal(doDelete, 'delete successful');
+ let failingDelete = await $.ajax({
+ url: url + '/5f665eb46e296f6b9b6a504d',
+ type: 'DELETE'
+ });
+ assert.isString(failingDelete);
+ assert.equal(failingDelete, 'no book exists');
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+
DELETE リクエストを `/api/books` へ送信して、データベース内のすべてのブックを削除することができます。 成功した場合、文字列 `'complete delete successful` のレスポンスを返します。
+
+```js
+async (getUserInput) => {
+ try {
+ const deleteAll = await $.ajax({
+ url: getUserInput('url') + '/api/books',
+ type: 'DELETE'
+ });
+ assert.isString(deleteAll);
+ assert.equal(deleteAll, 'complete delete successful');
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+10 種類の必須の機能テストがすべて完了し、合格しています。
+
+```js
+async (getUserInput) => {
+ try {
+ const getTests = await $.get(getUserInput('url') + '/_api/get-tests');
+ assert.isArray(getTests);
+ assert.isAtLeast(getTests.length, 10, 'At least 10 tests passed');
+ getTests.forEach((test) => {
+ assert.equal(test.state, 'passed', 'Test in Passed State');
+ assert.isAtLeast(
+ test.assertions.length,
+ 1,
+ 'At least one assertion per test'
+ );
+ });
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-projects/sudoku-solver.md b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-projects/sudoku-solver.md
new file mode 100644
index 0000000000..dd5bea386d
--- /dev/null
+++ b/curriculum/challenges/japanese/06-quality-assurance/quality-assurance-projects/sudoku-solver.md
@@ -0,0 +1,379 @@
+---
+id: 5e601bf95ac9d0ecd8b94afd
+title: 数独ソルバー
+challengeType: 4
+forumTopicId: 462357
+dashedName: sudoku-solver
+---
+
+# --description--
+
+
と同様の機能を持つフルスタック JavaScript アプリを構築してください。 プロジェクトに取り組むにあたり、以下の方法のうち 1 つを用いてコードを記述します。
+
+- [GitHub レポジトリ](https://github.com/freecodecamp/boilerplate-project-sudoku-solver)をクローンし、ローカル環境でチャレンジを完了させる。
+- [Replit 始動プロジェクト](https://replit.com/github/freeCodeCamp/boilerplate-project-sudoku-solver)を使用して、プロジェクトを完了させる。
+- 使い慣れたサイトビルダーを使用してプロジェクトを完了させる。 必ず GitHub リポジトリのすべてのファイルを取り込む。
+
+完了したら、プロジェクトの動作デモをどこか公開の場にホストしてください。 そして、`Solution Link` フィールドでデモへの URL を送信してください。 必要に応じて、`GitHub Link` フィールドでプロジェクトのソースコードへのリンクを送信してください。
+
+# --instructions--
+
+- すべてのパズルロジックを `/controllers/sudoku-solver.js` に含めてください。
+ - `validate` 関数は、与えられたパズル文字列を受け取り、入力に 81 の有効な文字があるかどうかを確認する必要があります。
+ - `check` 関数は、ボードの*現在の*状態を確認する必要があります。
+ - `solve` 関数は、テスト入力と解答だけでなく、与えられた任意の有効なパズル文字列を解く処理を行う必要があります。 パズルを解くためのロジックを記述することが求められます。
+- すべてのルーティングロジックを `/routes/api.js` に含めてください。
+- アプリで解くべきパズルのサンプルについては、`/controllers` の `puzzle-strings.js` ファイルを参照してください。
+- このページでチャレンジテストを実行するには、`.env` ファイル内で引用符を付けずに `NODE_ENV` を `test` に設定してください。
+- コンソールでテストを実行するには、コマンド `npm run test` を使用してください。 Replit コンソールを開くには、Ctrl+Shift+P (Macの場合はCmd) を押して「open shell」と入力してください。
+
+`tests/1_unit-tests.js` に以下のテストを記述してください。
+
+- ロジックは、81 文字の有効なパズル文字列を処理します。
+- ロジックは、(1~9 でも `.` でもない) 無効な文字が含まれているパズル文字列を処理します。
+- ロジックは、81 文字ではないパズル文字列を処理します。
+- ロジックは、有効な行の配置を処理します。
+- ロジックは、無効な行の配置を処理します。
+- ロジックは、有効な列の配置を処理します。
+- ロジックは、無効な列の配置を処理します。
+- ロジックは、有効な領域 (3x3 グリッド) の配置を処理します。
+- ロジックは、無効な領域 (3x3 グリッド) の配置を処理します。
+- 有効なパズルの文字列は、ソルバーをパスします。
+- 無効なパズル文字列は、ソルバーをパスしません。
+- 不完全なパズルの場合、ソルバーは期待される解答を返します。
+
+`tests/2_functional-tests.js` に以下のテストを記述してください。
+
+- 有効なパズル文字列のパズルを解いてください: `/api/solve` への POST リクエスト
+- パズル文字列が不足しているパズルを解いてください: `/api/solve` への POST リクエスト
+- 無効な文字のパズルを解いてください: `/api/solve` への POST リクエスト
+- 誤った長さのパズルを解いてください: `/api/solve` への POST リクエスト
+- 解くことができないパズルを解いてください: `/api/solve` への POST リクエスト
+- すべてのフィールドのパズル配置を確認してください: `/api/check` への POST リクエスト
+- 1 つの配置が競合しているパズル配置を確認してください: `/api/check` への POST リクエスト
+- 複数の配置が競合しているパズル配置を確認してください: `/api/check` への POST リクエスト
+- すべての配置が競合しているパズルの配置を確認してください: `/api/check` への POST リクエスト
+- 必須フィールドがないパズル配置を確認してください: `/api/check`への POST リクエスト
+- 無効な文字のパズル配置を確認してください: `/api/check` への POST リクエスト
+- 誤った長さのパズル配置を確認してください: `/api/check` への POST リクエスト
+- 無効な配置座標のパズル配置を確認してください: `/api/check` への POST リクエスト
+- 無効な配置値のパズル配置を確認してください: `/api/check` への POST リクエスト
+
+# --hints--
+
+サンプルの URL ではなく、自分で作成したプロジェクトを提供する必要があります。
+
+```js
+(getUserInput) => {
+ const url = getUserInput('url');
+ assert(!/.*\/sudoku-solver\.freecodecamp\.rocks/.test(getUserInput('url')));
+};
+```
+
+数字 (1~9) と空白を表すピリオド `.` の組み合わせを含む文字列である `puzzle` を含むフォームデータを指定して、`POST` `/api/solve` を実行することができます。 返されるオブジェクトには、解いたパズルを含む `solution` プロパティが含まれます。
+
+```js
+async (getUserInput) => {
+ const input =
+ '..9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..';
+ const output =
+ '769235418851496372432178956174569283395842761628713549283657194516924837947381625';
+ const data = await fetch(getUserInput('url') + '/api/solve', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ puzzle: input })
+ });
+ const parsed = await data.json();
+ assert.property(parsed, 'solution');
+ assert.equal(parsed.solution, output);
+};
+```
+
+`/api/solve` へ送信されたオブジェクトに `puzzle` がない場合、戻り値は `{ error: 'Required field missing' }` になります。
+
+```js
+async (getUserInput) => {
+ const input =
+ '..9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..';
+ const output = 'Required field missing';
+ const data = await fetch(getUserInput('url') + '/api/solve', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ notpuzzle: input })
+ });
+ const parsed = await data.json();
+ assert.property(parsed, 'error');
+ assert.equal(parsed.error, output);
+};
+```
+
+`/api/solve` へ送信されたパズルに数字でもピリオドでもない値が含まれている場合、戻り値は `{ error: 'Invalid characters in puzzle' }` になります。
+
+```js
+async (getUserInput) => {
+ const input =
+ 'AA9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..';
+ const output = 'Invalid characters in puzzle';
+ const data = await fetch(getUserInput('url') + '/api/solve', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ puzzle: input })
+ });
+ const parsed = await data.json();
+ assert.property(parsed, 'error');
+ assert.equal(parsed.error, output);
+};
+```
+
+`/api/solve` へ送信されたパズルの文字数が 81 文字より多いまたは少ない場合、戻り値は `{ error: 'Expected puzzle to be 81 characters long' }` になります。
+
+```js
+async (getUserInput) => {
+ const input =
+ '9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..';
+ const output = 'Expected puzzle to be 81 characters long';
+ const data = await fetch(getUserInput('url') + '/api/solve', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ puzzle: input })
+ });
+ const parsed = await data.json();
+ assert.property(parsed, 'error');
+ assert.equal(parsed.error, output);
+};
+```
+
+`/api/solve` へ送信されたパズルが無効もしくは解けない場合、戻り値は `{ error: 'Puzzle cannot be solved' }` になります。
+
+```js
+async (getUserInput) => {
+ const input =
+ '9.9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..';
+ const output = 'Puzzle cannot be solved';
+ const data = await fetch(getUserInput('url') + '/api/solve', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ puzzle: input })
+ });
+ const parsed = await data.json();
+ assert.property(parsed, 'error');
+ assert.equal(parsed.error, output);
+};
+```
+
+`/api/check` オブジェクトへの `POST` で、`puzzle`、`coordinate` および `value` を含むオブジェクトを指定できます。`coordinate` は行を示す文字 A~I で、その後に列を示す 1~9 の数字が続きます。`value` は 1~9 の数字です。
+
+```js
+async (getUserInput) => {
+ const input =
+ '..9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..';
+ const coordinate = 'A1';
+ const value = '7';
+ const data = await fetch(getUserInput('url') + '/api/check', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ puzzle: input, coordinate, value })
+ });
+ const parsed = await data.json();
+ assert.property(parsed, 'valid');
+ assert.isTrue(parsed.valid);
+};
+```
+
+`/api/check` への `POST` の戻り値は、`valid` プロパティを含むオブジェクトになります。このプロパティは、指定された座標に数字を配置できる場合は `true` になり、そうでない場合は `false` になります。 false の場合、返されるオブジェクトには `conflict` プロパティも含まれます。このプロパティは、文字列 `"row"`、`"column"`、`"region"` の任意の組み合わせを含む配列になります (どれが配置を無効にしているのかによります)。
+
+```js
+async (getUserInput) => {
+ const input =
+ '..9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..';
+ const coordinate = 'A1';
+ const value = '1';
+ const conflict = ['row', 'column'];
+ const data = await fetch(getUserInput('url') + '/api/check', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ puzzle: input, coordinate, value })
+ });
+ const parsed = await data.json();
+ assert.property(parsed, 'valid');
+ assert.isFalse(parsed.valid);
+ assert.property(parsed, 'conflict');
+ assert.include(parsed.conflict, 'row');
+ assert.include(parsed.conflict, 'column');
+};
+```
+
+`/api/check` へ送信された `value` がすでに `puzzle` のその `coordinate` に配置されている場合、戻り値は `valid` プロパティを含むオブジェクトになり、`value` が競合していなければ `true` となります。
+
+```js
+async (getUserInput) => {
+ const input =
+ '..9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..';
+ const coordinate = 'C3';
+ const value = '2';
+ const data = await fetch(getUserInput('url') + '/api/check', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ puzzle: input, coordinate, value })
+ });
+ const parsed = await data.json();
+ assert.property(parsed, 'valid');
+ assert.isTrue(parsed.valid);
+};
+```
+
+`/api/check` へ送信されたパズルに数字でもピリオドでもない値が含まれている場合、戻り値は `{ error: 'Invalid characters in puzzle' }` になります。
+
+```js
+async (getUserInput) => {
+ const input =
+ 'AA9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..';
+ const coordinate = 'A1';
+ const value = '1';
+ const output = 'Invalid characters in puzzle';
+ const data = await fetch(getUserInput('url') + '/api/check', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ puzzle: input, coordinate, value })
+ });
+ const parsed = await data.json();
+ assert.property(parsed, 'error');
+ assert.equal(parsed.error, output);
+};
+```
+
+`/api/check` へ送信されたパズルが 81 文字より多いか少ない場合、戻り値は `{ error: 'Expected puzzle to be 81 characters long' }` になります。
+
+```js
+async (getUserInput) => {
+ const input =
+ '9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..';
+ const coordinate = 'A1';
+ const value = '1';
+ const output = 'Expected puzzle to be 81 characters long';
+ const data = await fetch(getUserInput('url') + '/api/check', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ puzzle: input, coordinate, value })
+ });
+ const parsed = await data.json();
+ assert.property(parsed, 'error');
+ assert.equal(parsed.error, output);
+};
+```
+
+`/api/check` へ送信されたオブジェクトに `puzzle`、`coordinate` もしくは `value` がない場合、戻り値は、`{ error: Required field(s) missing }` になります。
+
+```js
+async (getUserInput) => {
+ const input =
+ '..9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..';
+ const output = 'Required field(s) missing';
+ const data = await fetch(getUserInput('url') + '/api/check', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ puzzle: input })
+ });
+ const parsed = await data.json();
+ assert.property(parsed, 'error');
+ assert.equal(parsed.error, output);
+};
+```
+
+`api/check` へ送信された座標が既存のグリッドセルを指し示していない場合、戻り値は `{ error: 'Invalid coordinate'}` になります。
+
+```js
+async (getUserInput) => {
+ const input =
+ '..9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..';
+ const output = 'Invalid coordinate';
+ const coordinate = 'XZ18';
+ const value = '7';
+ const data = await fetch(getUserInput('url') + '/api/check', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ puzzle: input, coordinate, value })
+ });
+ const parsed = await data.json();
+ assert.property(parsed, 'error');
+ assert.equal(parsed.error, output);
+};
+```
+
+`/api/check` へ送信された `value` が 1 から 9 の数字でない場合、戻り値は `{ error: 'Invalid value' }` になります。
+
+```js
+async (getUserInput) => {
+ const input =
+ '..9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..';
+ const output = 'Invalid value';
+ const coordinate = 'A1';
+ const value = 'X';
+ const data = await fetch(getUserInput('url') + '/api/check', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ puzzle: input, coordinate, value })
+ });
+ const parsed = await data.json();
+ assert.property(parsed, 'error');
+ assert.equal(parsed.error, output);
+};
+```
+
+12 種類のテストがすべて完了し、合格しています。 テストを記述すべき期待される動作については、`/tests/1_unit-tests.js` を参照してください。
+
+```js
+async (getUserInput) => {
+ try {
+ const getTests = await $.get(getUserInput('url') + '/_api/get-tests');
+ assert.isArray(getTests);
+ const units = getTests.filter((el) => el.context.includes('UnitTests'));
+ assert.isAtLeast(units.length, 12, 'At least 12 tests passed');
+ units.forEach((test) => {
+ assert.equal(test.state, 'passed', 'Test in Passed State');
+ assert.isAtLeast(
+ test.assertions.length,
+ 1,
+ 'At least one assertion per test'
+ );
+ });
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+14 種類の機能テストがすべて完了し、合格しています。 テストを記述すべき機能については、`/tests/2_functional-tests.js` を参照してください。
+
+```js
+async (getUserInput) => {
+ try {
+ const getTests = await $.get(getUserInput('url') + '/_api/get-tests');
+ assert.isArray(getTests);
+ const funcs = getTests.filter((el) =>
+ el.context.includes('Functional Tests')
+ );
+ assert.isAtLeast(funcs.length, 14, 'At least 14 tests passed');
+ funcs.forEach((test) => {
+ assert.equal(test.state, 'passed', 'Test in Passed State');
+ assert.isAtLeast(
+ test.assertions.length,
+ 1,
+ 'At least one assertion per test'
+ );
+ });
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+};
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/build-your-own-functions.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/build-your-own-functions.md
new file mode 100644
index 0000000000..e813f2f69f
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/build-your-own-functions.md
@@ -0,0 +1,71 @@
+---
+id: 5e7b9f060b6c005b0e76f05b
+title: 独自の関数を作成する
+challengeType: 11
+videoId: nLDychdBwUg
+bilibiliIds:
+ aid: 249487483
+ bvid: BV1Fv411J7bS
+ cid: 376340281
+dashedName: build-your-own-functions
+---
+
+# --description--
+
+その他のリソース:
+
+\- [演習](https://www.youtube.com/watch?v=ksvGhDsjtpw)
+
+# --question--
+
+## --text--
+
+次の Python プログラムは何を出力しますか?
+
+```python
+def fred():
+ print("Zap")
+def jane():
+ print("ABC")
+
+jane()
+fred()
+jane()
+```
+
+## --answers--
+
+
Zap
+ABC
+jane
+fred
+jane
+
+---
+
+
Zap
+ABC
+Zap
+
+---
+
+
ABC
+Zap
+jane
+
+---
+
+
ABC
+Zap
+ABC
+
+---
+
+
Zap
+Zap
+Zap
+
+## --video-solution--
+
+4
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/comparing-and-sorting-tuples.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/comparing-and-sorting-tuples.md
new file mode 100644
index 0000000000..72249b87b2
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/comparing-and-sorting-tuples.md
@@ -0,0 +1,61 @@
+---
+id: 5e7b9f0b0b6c005b0e76f06d
+title: タプルの比較と並べ替え
+challengeType: 11
+videoId: dZXzBXUxxCs
+bilibiliIds:
+ aid: 931886163
+ bvid: BV1HM4y1T7TK
+ cid: 376533673
+dashedName: comparing-and-sorting-tuples
+---
+
+# --description--
+
+その他のリソース:
+
+\- [演習](https://www.youtube.com/watch?v=EhQxwzyT16E)
+
+# --question--
+
+## --text--
+
+次のコードと同じ動作をするものはどれですか?
+
+```python
+lst = []
+for key, val in counts.items():
+ newtup = (val, key)
+ lst.append(newtup)
+lst = sorted(lst, reverse=True)
+print(lst)
+```
+
+## --answers--
+
+```python
+print( sorted( [ (v,k) for k,v in counts.items() ], reverse=True ) )
+```
+
+---
+
+```python
+print( [ (k,v) for k,v in counts.items().sorted() ] )
+```
+
+---
+
+```python
+print( sorted( [ (v,k) for k,v in counts.keys() ] ) )
+```
+
+---
+
+```python
+print( [ (k,v) for k,v in counts.values().sort() ] )
+```
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/conditional-execution.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/conditional-execution.md
new file mode 100644
index 0000000000..b61942880d
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/conditional-execution.md
@@ -0,0 +1,54 @@
+---
+id: 5e7b9f050b6c005b0e76f058
+title: 条件付き実行
+challengeType: 11
+videoId: gz_IfIsZQtc
+bilibiliIds:
+ aid: 206949935
+ bvid: BV1Jh411z7bY
+ cid: 376337035
+dashedName: conditional-execution
+---
+
+# --question--
+
+## --text--
+
+x = 0 かつ y = 10 の場合、”Yes” を出力するために正しくインデントされているコードはどれですか?
+
+## --answers--
+
+```python
+if 0 == x:
+if y == 10:
+print("Yes")
+```
+
+---
+
+```python
+if 0 == x:
+ if y == 10:
+ print("Yes")
+```
+
+---
+
+```python
+if 0 == x:
+if y == 10:
+ print("Yes")
+```
+
+---
+
+```python
+if 0 == x:
+ if y == 10:
+ print("Yes")
+```
+
+## --video-solution--
+
+4
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/data-visualization-mailing-lists.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/data-visualization-mailing-lists.md
new file mode 100644
index 0000000000..a3ccdc7848
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/data-visualization-mailing-lists.md
@@ -0,0 +1,56 @@
+---
+id: 5e7b9f6a0b6c005b0e76f097
+title: 'データ可視化: メーリングリスト'
+challengeType: 11
+videoId: RYdW660KkaQ
+bilibiliIds:
+ aid: 334465586
+ bvid: BV18w411R7dD
+ cid: 377545473
+dashedName: data-visualization-mailing-lists
+---
+
+# --description--
+
+その他のリソース:
+
+\- [演習: Geodata](https://www.youtube.com/watch?v=KfhslNzopxo)
+
+\- [演習: Gmane Model](https://www.youtube.com/watch?v=wSpl1-7afAk)
+
+\- [演習: Gmane Spider](https://www.youtube.com/watch?v=H3w4lOFBUOI)
+
+\- [演習: Gmane Viz](https://www.youtube.com/watch?v=LRqVPMEXByw)
+
+\- [演習: Page Rank](https://www.youtube.com/watch?v=yFRAZBkBDBs)
+
+\- [演習: Page Spider](https://www.youtube.com/watch?v=sXedPQ_AnWA)
+
+\- [演習: Page Viz](https://www.youtube.com/watch?v=Fm0hpkxsZoo)
+
+# --question--
+
+## --text--
+
+一般的な JavaScript 可視化ライブラリはどれですか?
+
+## --answers--
+
+DataViz.js
+
+---
+
+D3
+
+---
+
+Lowcharts
+
+---
+
+DATA6
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/data-visualization-page-rank.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/data-visualization-page-rank.md
new file mode 100644
index 0000000000..b0ff2dc87c
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/data-visualization-page-rank.md
@@ -0,0 +1,34 @@
+---
+id: 5e7b9f6a0b6c005b0e76f096
+title: 'データ可視化: Page Rank'
+challengeType: 11
+videoId: 6-w_qIUwaxU
+bilibiliIds:
+ aid: 376950472
+ bvid: BV1ho4y1Q72u
+ cid: 377544599
+dashedName: data-visualization-page-rank
+---
+
+# --question--
+
+## --text--
+
+PageRank アルゴリズムはどのように動作しますか?
+
+## --answers--
+
+どのページが最も接続数が多いかを判断する。
+
+---
+
+閲覧数に基づいてページをランク付けする。
+
+---
+
+どのページに最も重要なコンテンツが含まれているかを解析する。
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/dictionaries-and-loops.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/dictionaries-and-loops.md
new file mode 100644
index 0000000000..12552e6ef1
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/dictionaries-and-loops.md
@@ -0,0 +1,53 @@
+---
+id: 5e7b9f0a0b6c005b0e76f069
+title: 辞書とループ
+challengeType: 11
+videoId: EEmekKiKG70
+bilibiliIds:
+ aid: 589401038
+ bvid: BV1eq4y1X7xU
+ cid: 376387132
+dashedName: dictionaries-and-loops
+---
+
+# --description--
+
+その他のリソース:
+
+\- [演習](https://www.youtube.com/watch?v=PrhZ9qwBDD8)
+
+# --question--
+
+## --text--
+
+次のコードは何を表示しますか?
+
+```python
+counts = { 'chuck' : 1 , 'annie' : 42, 'jan': 100}
+for key in counts:
+ if counts[key] > 10:
+ print(key, counts[key])
+```
+
+## --answers--
+
+
annie 42
+jan 100
+
+---
+
+
chuck 1
+annie 42
+jan 100
+
+---
+
+
chuck 1
+
+---
+
+
[エラー]
+
+## --video-solution--
+
+1
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/dictionaries-common-applications.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/dictionaries-common-applications.md
new file mode 100644
index 0000000000..34fad79388
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/dictionaries-common-applications.md
@@ -0,0 +1,47 @@
+---
+id: 5e7b9f090b6c005b0e76f068
+title: '辞書: 一般的な例'
+challengeType: 11
+videoId: f17xPfIXct0
+bilibiliIds:
+ aid: 805747023
+ bvid: BV1v34y1D7ug
+ cid: 414168867
+dashedName: dictionaries-common-applications
+---
+
+# --question--
+
+## --text--
+
+次のコードは何を表示しますか?
+
+```python
+counts = { 'quincy' : 1 , 'mrugesh' : 42, 'beau': 100, '0': 10}
+print(counts.get('kris', 0))
+```
+
+## --answers--
+
+2
+
+---
+
+quincy
+
+---
+
+0
+
+---
+
+10
+
+---
+
+[エラーを返す]
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/files-as-a-sequence.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/files-as-a-sequence.md
new file mode 100644
index 0000000000..dfe26e78e6
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/files-as-a-sequence.md
@@ -0,0 +1,44 @@
+---
+id: 5e7b9f080b6c005b0e76f063
+title: ひと続きとして処理する
+challengeType: 11
+videoId: cIA0EokbaHE
+bilibiliIds:
+ aid: 974380307
+ bvid: BV1p44y1m7br
+ cid: 376388846
+dashedName: files-as-a-sequence
+---
+
+# --description--
+
+その他のリソース:
+
+\- [演習](https://www.youtube.com/watch?v=il1j4wkte2E)
+
+# --question--
+
+## --text--
+
+ループの途中で出現する「continue」という言葉は、何をすることを表していますか?
+
+## --answers--
+
+ループの直後のコードにスキップする。
+
+---
+
+コードの次の行にスキップする。
+
+---
+
+ループの次の繰り返しにスキップする。
+
+---
+
+次のコードブロックをスキップする。
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/intermediate-expressions.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/intermediate-expressions.md
new file mode 100644
index 0000000000..101de1ccc6
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/intermediate-expressions.md
@@ -0,0 +1,56 @@
+---
+id: 5e7b9f050b6c005b0e76f057
+title: 中間の式
+challengeType: 11
+videoId: dKgUaIa5ATg
+bilibiliIds:
+ aid: 334428894
+ bvid: BV1uw411R7gH
+ cid: 376318468
+dashedName: intermediate-expressions
+---
+
+# --description--
+
+その他のリソース:
+
+\- [演習 1](https://youtu.be/t_4DPwsaGDY)
+
+\- [演習 2](https://youtu.be/wgkC8SxraAQ)
+
+# --question--
+
+## --text--
+
+このコードを実行すると何が出力されますか?
+
+```python
+width = 15
+height = 12.0
+print(height/3)
+```
+
+## --answers--
+
+39
+
+---
+
+4
+
+---
+
+4.0
+
+---
+
+5.0
+
+---
+
+5
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/intermediate-strings.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/intermediate-strings.md
new file mode 100644
index 0000000000..6af49f32cb
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/intermediate-strings.md
@@ -0,0 +1,53 @@
+---
+id: 5e7b9f070b6c005b0e76f061
+title: 中間の文字列
+challengeType: 11
+videoId: KgT_fYLXnyk
+bilibiliIds:
+ aid: 291983121
+ bvid: BV1Zf4y157yG
+ cid: 376394116
+dashedName: intermediate-strings
+---
+
+# --description--
+
+その他のリソース:
+
+\- [演習](https://www.youtube.com/watch?v=1bSqHot-KwE)
+
+# --question--
+
+## --text--
+
+次のコードで i の値は何になりますか?
+
+```python
+word = "bananana"
+i = word.find("na")
+```
+
+## --answers--
+
+nanana
+
+---
+
+2
+
+---
+
+3
+
+---
+
+True
+
+---
+
+na
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/introduction-elements-of-python.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/introduction-elements-of-python.md
new file mode 100644
index 0000000000..c7b4c4bb50
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/introduction-elements-of-python.md
@@ -0,0 +1,40 @@
+---
+id: 5e6a54c358d3af90110a60a3
+title: 'はじめに: Python の要素'
+challengeType: 11
+videoId: aRY_xjL35v0
+bilibiliIds:
+ aid: 674420725
+ bvid: BV1MU4y1H7Lj
+ cid: 376315889
+dashedName: introduction-elements-of-python
+---
+
+# --question--
+
+## --text--
+
+次のプログラムは何を出力しますか?
+
+```python
+x = 43
+x = x + 1
+print(x)
+```
+
+## --answers--
+
+x
+
+---
+
+x + 1
+
+---
+
+44
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/introduction-hardware-achitecture.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/introduction-hardware-achitecture.md
new file mode 100644
index 0000000000..7083aa9a23
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/introduction-hardware-achitecture.md
@@ -0,0 +1,34 @@
+---
+id: 5e6a54af58d3af90110a60a1
+title: 'はじめに: ハードウェアアーキテクチャ'
+challengeType: 11
+videoId: H6qtjRTfSog
+bilibiliIds:
+ aid: 206977572
+ bvid: BV1zh411z7Ak
+ cid: 376199262
+dashedName: introduction-hardware-architecture
+---
+
+# --question--
+
+## --text--
+
+実行中のプログラムはどこに保存されていますか?
+
+## --answers--
+
+ハードドライブ
+
+---
+
+メモリ
+
+---
+
+中央処理装置
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/introduction-python-as-a-language.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/introduction-python-as-a-language.md
new file mode 100644
index 0000000000..1970dadab1
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/introduction-python-as-a-language.md
@@ -0,0 +1,43 @@
+---
+id: 5e6a54ba58d3af90110a60a2
+title: 'はじめに: 言語としての Python'
+challengeType: 11
+videoId: 0QeGbZNS_bY
+bilibiliIds:
+ aid: 674404602
+ bvid: BV1GU4y1H7vB
+ cid: 376315625
+dashedName: introduction-python-as-a-language
+---
+
+# --question--
+
+## --text--
+
+この 2 行のコードを実行すると何が出力されますか?
+
+```python
+x = 6
+print(x)
+```
+
+## --answers--
+
+x
+
+---
+
+6
+
+---
+
+x = 6
+
+---
+
+(x)
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/introduction-why-program.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/introduction-why-program.md
new file mode 100644
index 0000000000..bec73b54a0
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/introduction-why-program.md
@@ -0,0 +1,46 @@
+---
+id: 5e6a54a558d3af90110a60a0
+title: 'はじめに: なぜプログラムなのか?'
+challengeType: 11
+videoId: 3muQV-Im3Z0
+bilibiliIds:
+ aid: 206882253
+ bvid: BV1Fh411z7tr
+ cid: 376314257
+videoLocaleIds:
+ espanol: 3muQV-Im3Z0
+ italian: 3muQV-Im3Z0
+ portuguese: 3muQV-Im3Z0
+dashedName: introduction-why-program
+---
+
+# --description--
+
+その他のリソース:
+
+\- [Windows に Python をインストール](https://youtu.be/F7mtLrYzZP8)
+
+\- [MacOS に Python をインストール](https://youtu.be/wfLnZP-4sZw)
+
+# --question--
+
+## --text--
+
+誰がプログラミングを学ぶべきですか?
+
+## --answers--
+
+大学生
+
+---
+
+ソフトウェアの開発者になりたい人
+
+---
+
+すべての人
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/iterations-definite-loops.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/iterations-definite-loops.md
new file mode 100644
index 0000000000..55697d38ae
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/iterations-definite-loops.md
@@ -0,0 +1,43 @@
+---
+id: 5e7b9f070b6c005b0e76f05d
+title: '繰り返し: 有限ループ'
+challengeType: 11
+videoId: hiRTRAqNlpE
+bilibiliIds:
+ aid: 291987032
+ bvid: BV1ff4y157Q3
+ cid: 376385255
+dashedName: iterations-definite-loops
+---
+
+# --question--
+
+## --text--
+
+次のコードの出力は何行ですか?
+
+```python
+for i in [2,1,5]:
+ print(i)
+```
+
+## --answers--
+
+1
+
+---
+
+2
+
+---
+
+3
+
+---
+
+5
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/iterations-loop-idioms.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/iterations-loop-idioms.md
new file mode 100644
index 0000000000..3eb692fb59
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/iterations-loop-idioms.md
@@ -0,0 +1,49 @@
+---
+id: 5e7b9f070b6c005b0e76f05e
+title: '繰り返し: ループの用法'
+challengeType: 11
+videoId: AelGAcoMXbI
+bilibiliIds:
+ aid: 334491369
+ bvid: BV1tw411R7Mm
+ cid: 376530765
+dashedName: iterations-loop-idioms
+---
+
+# --question--
+
+## --text--
+
+次のコードでは、値のリストから最小値を見つけようとしています。 1 行にエラーがあり、コードが期待どおりに動作しません。 どの行ですか?
+
+```python
+smallest = None
+print("Before:", smallest)
+for itervar in [3, 41, 12, 9, 74, 15]:
+ if smallest is None or itervar < smallest:
+ smallest = itervar
+ break
+ print("Loop:", itervar, smallest)
+print("Smallest:", smallest)
+```
+
+## --answers--
+
+3
+
+---
+
+4
+
+---
+
+6
+
+---
+
+7
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/iterations-more-patterns.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/iterations-more-patterns.md
new file mode 100644
index 0000000000..ebc603df71
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/iterations-more-patterns.md
@@ -0,0 +1,52 @@
+---
+id: 5e7b9f070b6c005b0e76f05f
+title: '繰り返し: その他のパターン'
+challengeType: 11
+videoId: 9Wtqo6vha1M
+bilibiliIds:
+ aid: 674492981
+ bvid: BV1hU4y1H7tF
+ cid: 376531204
+dashedName: iterations-more-patterns
+---
+
+# --description--
+
+その他のリソース:
+
+\- [演習](https://www.youtube.com/watch?v=kjxXZQw0uPg)
+
+# --question--
+
+## --text--
+
+次のうち、どれが False と評価されますか?
+
+## --answers--
+
+```python
+0 == 0.0
+```
+
+---
+
+```python
+0 is 0.0
+```
+
+---
+
+```python
+0 is not 0.0
+```
+
+---
+
+```python
+0 = 0.0
+```
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/loops-and-iterations.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/loops-and-iterations.md
new file mode 100644
index 0000000000..52ee5f3a09
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/loops-and-iterations.md
@@ -0,0 +1,55 @@
+---
+id: 5e7b9f060b6c005b0e76f05c
+title: ループと繰り返し処理
+challengeType: 11
+videoId: dLA-szNRnUY
+bilibiliIds:
+ aid: 674492981
+ bvid: BV1hU4y1H7tF
+ cid: 376531204
+dashedName: loops-and-iterations
+---
+
+# --question--
+
+## --text--
+
+次のコードは何を表示しますか?
+
+```python
+n = 0
+while True:
+ if n == 3:
+ break
+ print(n)
+ n = n + 1
+```
+
+## --answers--
+
+
0
+1
+2
+
+---
+
+
0
+1
+2
+3
+
+---
+
+
1
+2
+
+---
+
+
1
+2
+3
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/make-a-relational-database.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/make-a-relational-database.md
new file mode 100644
index 0000000000..7b126fb5ca
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/make-a-relational-database.md
@@ -0,0 +1,52 @@
+---
+id: 5e7b9f170b6c005b0e76f08b
+title: リレーショナルデータベースを作成する
+challengeType: 11
+videoId: MQ5z4bdF92U
+bilibiliIds:
+ aid: 249380678
+ bvid: BV1vv411E76L
+ cid: 377531786
+dashedName: make-a-relational-database
+---
+
+# --question--
+
+## --text--
+
+メールアドレス `quincy@freecodecamp.org` を持つすべてのユーザーを取得するために使用する SQL コマンドはどれですか?
+
+## --answers--
+
+```sql
+SELECT Users WHERE email="quincy@freecodecamp.org"
+```
+
+---
+
+```sql
+SELECT Users WHERE email IS "quincy@freecodecamp.org"
+```
+
+---
+
+```sql
+SELECT ALL Users WHERE email="quincy@freecodecamp.org"
+```
+
+---
+
+```sql
+SELECT * FROM Users WHERE email IS "quincy@freecodecamp.org"
+```
+
+---
+
+```sql
+SELECT * FROM Users WHERE email="quincy@freecodecamp.org"
+```
+
+## --video-solution--
+
+5
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/more-conditional-structures.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/more-conditional-structures.md
new file mode 100644
index 0000000000..ead0168304
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/more-conditional-structures.md
@@ -0,0 +1,60 @@
+---
+id: 5e7b9f060b6c005b0e76f059
+title: その他の条件付き構造
+challengeType: 11
+videoId: HdL82tAZR20
+bilibiliIds:
+ aid: 631930118
+ bvid: BV1Nb4y1r7z2
+ cid: 376337449
+dashedName: more-conditional-structures
+---
+
+# --description--
+
+その他のリソース:
+
+\- [演習 1](https://www.youtube.com/watch?v=crLerB4ZxMI)
+
+\- [演習 2](https://www.youtube.com/watch?v=KJN3-7HH6yk)
+
+# --question--
+
+## --text--
+
+次のコードがあります。
+
+```python
+temp = "5 degrees"
+cel = 0
+fahr = float(temp)
+cel = (fahr - 32.0) * 5.0 / 9.0
+print(cel)
+```
+
+どの行を `try` ブロックで囲むべきですか?
+
+## --answers--
+
+1
+
+---
+
+3
+
+---
+
+3、4
+
+---
+
+4
+
+---
+
+該当なし
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-protocol.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-protocol.md
new file mode 100644
index 0000000000..3aef86521c
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-protocol.md
@@ -0,0 +1,38 @@
+---
+id: 5e7b9f0c0b6c005b0e76f072
+title: ネットワーキングプロトコル
+challengeType: 11
+videoId: c6vZGescaSc
+bilibiliIds:
+ aid: 931950996
+ bvid: BV1cM4y1N7K6
+ cid: 376388317
+dashedName: networking-protocol
+---
+
+# --question--
+
+## --text--
+
+ウェブサイトにアクセスするために通常使用する HTTP リクエストのタイプはどれですか?
+
+## --answers--
+
+POST
+
+---
+
+GET
+
+---
+
+WEB
+
+---
+
+ACCESS
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-text-processing.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-text-processing.md
new file mode 100644
index 0000000000..5a229f66d4
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-text-processing.md
@@ -0,0 +1,34 @@
+---
+id: 5e7b9f0c0b6c005b0e76f074
+title: 'ネットワーキング: テキスト処理'
+challengeType: 11
+videoId: Pv_pJgVu8WI
+bilibiliIds:
+ aid: 804442498
+ bvid: BV16y4y1j7WW
+ cid: 377329124
+dashedName: networking-text-processing
+---
+
+# --question--
+
+## --text--
+
+ほとんどのウェブサイトで使用されているエンコードのタイプはどれですか?
+
+## --answers--
+
+UTF-8
+
+---
+
+UTF-16
+
+---
+
+UTF-32
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-using-urllib-in-python.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-using-urllib-in-python.md
new file mode 100644
index 0000000000..2d112edd6a
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-using-urllib-in-python.md
@@ -0,0 +1,41 @@
+---
+id: 5e7b9f0d0b6c005b0e76f075
+title: 'ネットワーキング: Python で urllib を使用する'
+challengeType: 11
+videoId: 7lFM1T_CxBs
+bilibiliIds:
+ aid: 546908270
+ bvid: BV1Xq4y1H7e6
+ cid: 377331524
+dashedName: networking-using-urllib-in-python
+---
+
+# --question--
+
+## --text--
+
+次のコードの出力はどのようになりますか?
+
+```python
+import urllib.request
+fhand = urllib.request.urlopen('http://data.pr4e.org/romeo.txt')
+for line in fhand:
+ print(line.decode().strip())
+```
+
+## --answers--
+
+"romeo.txt" の内容のみ。
+
+---
+
+ヘッダーと "romeo.txt" の内容。
+
+---
+
+ヘッダー、フッター、および "romeo.txt" の内容。
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-web-scraping-with-python.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-web-scraping-with-python.md
new file mode 100644
index 0000000000..d0d5c1668b
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-web-scraping-with-python.md
@@ -0,0 +1,60 @@
+---
+id: 5e7b9f0d0b6c005b0e76f076
+title: 'ネットワーキング: Python でウェブスクレイピングを行う'
+challengeType: 11
+videoId: Uyioq2q4cEg
+bilibiliIds:
+ aid: 674382625
+ bvid: BV1oU4y1n7zQ
+ cid: 377331774
+dashedName: networking-web-scraping-with-python
+---
+
+# --description--
+
+その他のリソース:
+
+\- [演習: socket1](https://www.youtube.com/watch?v=dWLdI143W-g)
+
+\- [演習: urllib](https://www.youtube.com/watch?v=8yis2DvbBkI)
+
+\- [演習: urllinks](https://www.youtube.com/watch?v=g9flPDG9nnY)
+
+# --question--
+
+## --text--
+
+HTML ドキュメントの解析や HTML ドキュメントからのデータ抽出に使用する Python ライブラリはどれですか?
+
+## --answers--
+
+socket
+
+---
+
+http
+
+---
+
+BeautifulSoup
+
+---
+
+PrettyBiscuit
+
+---
+
+WonderfulSalad
+
+---
+
+HttpParser
+
+---
+
+GrunkleStan
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-with-python.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-with-python.md
new file mode 100644
index 0000000000..15239326c1
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-with-python.md
@@ -0,0 +1,38 @@
+---
+id: 5e7b9f0c0b6c005b0e76f071
+title: Python によるネットワーキング
+challengeType: 11
+videoId: _kJvneKVdNM
+bilibiliIds:
+ aid: 419494612
+ bvid: BV1r341167jT
+ cid: 376385858
+dashedName: networking-with-python
+---
+
+# --question--
+
+## --text--
+
+TCP ソケットへのアクセス手段を提供する Python ライブラリはどれですか?
+
+## --answers--
+
+tcp
+
+---
+
+socket
+
+---
+
+http
+
+---
+
+port
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-write-a-web-browser.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-write-a-web-browser.md
new file mode 100644
index 0000000000..c0ff28685d
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/networking-write-a-web-browser.md
@@ -0,0 +1,54 @@
+---
+id: 5e7b9f0c0b6c005b0e76f073
+title: 'ネットワーキング: ウェブブラウザーを作成する'
+challengeType: 11
+videoId: zjyT9DaAjx4
+bilibiliIds:
+ aid: 761908574
+ bvid: BV1j64y1x7wx
+ cid: 377319579
+dashedName: networking-write-a-web-browser
+---
+
+# --question--
+
+## --text--
+
+次のコードは何を作成しますか?
+
+```py
+import socket
+
+mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+mysock.connect(('data.pr4e.org', 80))
+cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n'.encode()
+mysock.send(cmd)
+
+while True:
+ data = mysock.recv(512)
+ if len(data) < 1:
+ break
+ print(data.decode(),end='')
+mysock.close()
+```
+
+## --answers--
+
+シンプルなウェブサーバー。
+
+---
+
+シンプルな電子メールクライアント。
+
+---
+
+シンプルな todo リスト。
+
+---
+
+シンプルなウェブブラウザー。
+
+## --video-solution--
+
+4
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/object-lifecycle.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/object-lifecycle.md
new file mode 100644
index 0000000000..9564fecbd8
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/object-lifecycle.md
@@ -0,0 +1,71 @@
+---
+id: 5e7b9f170b6c005b0e76f087
+title: オブジェクトのライフサイクル
+challengeType: 11
+videoId: p1r3h_AMMIM
+bilibiliIds:
+ aid: 461998717
+ bvid: BV1JL411n7Hr
+ cid: 377529681
+dashedName: object-lifecycle
+---
+
+# --question--
+
+## --text--
+
+次のプログラムは何を出力しますか?
+
+```python
+class PartyAnimal:
+ x = 0
+ name = ''
+ def __init__(self, nam):
+ self.name = nam
+ print(self.name,'constructed')
+ def party(self):
+ self.x = self.x + 1
+ print(self.name,'party count',self.x)
+
+q = PartyAnimal('Quincy')
+m = PartyAnimal('Miya')
+
+q.party()
+m.party()
+q.party()
+```
+
+## --answers--
+
+
+Quincy constructed
+Miya constructed
+Quincy party count 1
+Miya party count 2
+Quincy party count 3
+
+
+---
+
+
+Quincy constructed
+Miya constructed
+Quincy party count 1
+Miya party count 1
+Quincy party count 2
+
+
+---
+
+
+Quincy constructed
+Quincy party count 1
+Quincy party count 2
+Miya constructed
+Miya party count 1
+
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/objects-a-sample-class.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/objects-a-sample-class.md
new file mode 100644
index 0000000000..611dd78828
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/objects-a-sample-class.md
@@ -0,0 +1,62 @@
+---
+id: 5e7b9f160b6c005b0e76f086
+title: 'オブジェクト: サンプルクラス'
+challengeType: 11
+videoId: FiABKEuaSJ8
+bilibiliIds:
+ aid: 589451777
+ bvid: BV1rq4y1X7TG
+ cid: 377523194
+dashedName: objects-a-sample-class
+---
+
+# --question--
+
+## --text--
+
+次のプログラムは何を出力しますか?
+
+```python
+class PartyAnimal:
+ x = 0
+ def party(self):
+ self.x = self.x + 2
+ print(self.x)
+
+an = PartyAnimal()
+an.party()
+an.party()
+```
+
+## --answers--
+
+
+So far 1
+So far 2
+
+
+---
+
+
+0
+0
+
+
+---
+
+
+2
+2
+
+
+---
+
+
+2
+4
+
+
+## --video-solution--
+
+4
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/objects-inheritance.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/objects-inheritance.md
new file mode 100644
index 0000000000..6e5e2d5678
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/objects-inheritance.md
@@ -0,0 +1,38 @@
+---
+id: 5e7b9f170b6c005b0e76f088
+title: 'オブジェクト: 継承'
+challengeType: 11
+videoId: FBL3alYrxRM
+bilibiliIds:
+ aid: 631990691
+ bvid: BV1sb4y1r7GF
+ cid: 377529901
+dashedName: objects-inheritance
+---
+
+# --question--
+
+## --text--
+
+オブジェクト指向プログラミングにおける継承とは何ですか?
+
+## --answers--
+
+親クラスが拡張されたときに作成される新しいクラス。
+
+---
+
+クラスの構築されたインスタンス。
+
+---
+
+既存のクラスを拡張して新しいクラスを作成する機能。
+
+---
+
+オブジェクトを構築するためにクラスが使用された時点で呼び出されるメソッド。
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/python-dictionaries.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/python-dictionaries.md
new file mode 100644
index 0000000000..081fd135ac
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/python-dictionaries.md
@@ -0,0 +1,59 @@
+---
+id: 5e7b9f090b6c005b0e76f067
+title: Python の辞書
+challengeType: 11
+videoId: dnzvfimrRMg
+bilibiliIds:
+ aid: 631893305
+ bvid: BV19b4y167kj
+ cid: 376386176
+dashedName: python-dictionaries
+---
+
+# --question--
+
+## --text--
+
+このコードを実行した後、dict はどれに等しくなりますか?
+
+```python
+dict = {"Fri": 20, "Thu": 6, "Sat": 1}
+dict["Thu"] = 13
+dict["Sat"] = 2
+dict["Sun"] = 9
+```
+
+## --answers--
+
+```python
+{'Fri': 20, 'Thu': 6, 'Sat': 1}
+```
+
+---
+
+```python
+{'Fri': 20, 'Thu': 6, 'Sat': 1, 'Thu': 13, 'Sat': 2, 'Sun': 9}
+```
+
+---
+
+```python
+{'Sun': 9}
+```
+
+---
+
+```python
+{'Thu': 13, 'Sat': 2, 'Sun': 9}
+```
+
+---
+
+```python
+{'Fri': 20, 'Thu': 13, 'Sat': 2, 'Sun': 9}
+```
+
+## --video-solution--
+
+5
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/python-functions.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/python-functions.md
new file mode 100644
index 0000000000..1350773de1
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/python-functions.md
@@ -0,0 +1,42 @@
+---
+id: 5e7b9f060b6c005b0e76f05a
+title: Python の関数
+challengeType: 11
+videoId: 3JGF-n3tDPU
+bilibiliIds:
+ aid: 631881917
+ bvid: BV1Xb4y167P4
+ cid: 376337920
+dashedName: python-functions
+---
+
+# --question--
+
+## --text--
+
+Python の "def" キーワードの用途は何ですか?
+
+## --answers--
+
+「次のコードは本当にクールです」という意味のスラング。
+
+---
+
+関数の始まりを示す。
+
+---
+
+以降のインデントされたコードセクションを後で保存する必要があることを示す。
+
+---
+
+関数の始まりを示し、以降のインデントされたコードセクションを後で保存する必要があることを示す。
+
+---
+
+上記のいずれでもない。
+
+## --video-solution--
+
+4
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/python-lists.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/python-lists.md
new file mode 100644
index 0000000000..2ab037c765
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/python-lists.md
@@ -0,0 +1,43 @@
+---
+id: 5e7b9f080b6c005b0e76f064
+title: Python のリスト
+challengeType: 11
+videoId: Y0cvfDpYC_c
+bilibiliIds:
+ aid: 249460305
+ bvid: BV1Dv411E7Uj
+ cid: 376532993
+dashedName: python-lists
+---
+
+# --question--
+
+## --text--
+
+このコードを実行した後の x の値は何ですか?
+
+```python
+fruit = "banana"
+x = fruit[1]
+```
+
+## --answers--
+
+banana
+
+---
+
+a
+
+---
+
+b
+
+---
+
+True
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/python-objects.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/python-objects.md
new file mode 100644
index 0000000000..27c20f63fc
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/python-objects.md
@@ -0,0 +1,38 @@
+---
+id: 5e7b9f160b6c005b0e76f085
+title: Python のオブジェクト
+challengeType: 11
+videoId: uJxGeTYy0us
+bilibiliIds:
+ aid: 889496260
+ bvid: BV1ZP4y1s7G6
+ cid: 377522762
+dashedName: python-objects
+---
+
+# --question--
+
+## --text--
+
+Python のオブジェクトについての説明として正しくないのはどれですか?
+
+## --answers--
+
+オブジェクトは作成され、使用される。
+
+---
+
+オブジェクトはコードやデータの集まりである。
+
+---
+
+オブジェクトは詳細を隠す。
+
+---
+
+オブジェクトは 5 つの標準的なデータ型のうちの 1 つである。
+
+## --video-solution--
+
+4
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/reading-files.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/reading-files.md
new file mode 100644
index 0000000000..0e3336f48a
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/reading-files.md
@@ -0,0 +1,42 @@
+---
+id: 5e7b9f080b6c005b0e76f062
+title: ファイルを読み取る
+challengeType: 11
+videoId: Fo1tW09KIwo
+bilibiliIds:
+ aid: 334439927
+ bvid: BV1pw411R7UK
+ cid: 376532076
+dashedName: reading-files
+---
+
+# --question--
+
+## --text--
+
+文字列の新しい行を示すために使用するものは何ですか?
+
+## --answers--
+
+\\n
+
+---
+
+{new_line}
+
+---
+
+{n}
+
+---
+
+/n
+
+---
+
+/new
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/regular-expressions-matching-and-extracting-data.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/regular-expressions-matching-and-extracting-data.md
new file mode 100644
index 0000000000..f2a058d9dc
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/regular-expressions-matching-and-extracting-data.md
@@ -0,0 +1,45 @@
+---
+id: 5e7b9f0b0b6c005b0e76f06f
+title: '正規表現: データの照合と抽出'
+challengeType: 11
+videoId: LaCZnTbQGkE
+bilibiliIds:
+ aid: 975629041
+ bvid: BV1i44y1b7hE
+ cid: 414167130
+dashedName: regular-expressions-matching-and-extracting-data
+---
+
+# --question--
+
+## --text--
+
+次のプログラムは何を出力しますか?
+
+```python
+import re
+s = 'A message from csev@umich.edu to cwen@iupui.edu about meeting @2PM'
+lst = re.findall('\\S+@\\S+', s)
+print(lst)
+```
+
+## --answers--
+
+['csev@umich.edu', 'cwen@iupui.edu']
+
+---
+
+['csev@umich.edu']
+
+---
+
+['umich.edu', 'iupui.edu']
+
+---
+
+['csev@', 'cwen@']
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/regular-expressions-practical-applications.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/regular-expressions-practical-applications.md
new file mode 100644
index 0000000000..ee42499410
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/regular-expressions-practical-applications.md
@@ -0,0 +1,38 @@
+---
+id: 5e7b9f0b0b6c005b0e76f070
+title: '正規表現: 実用的な例'
+challengeType: 11
+videoId: xCjFU9G6x48
+bilibiliIds:
+ aid: 546924659
+ bvid: BV1mq4y1H7rZ
+ cid: 376386493
+dashedName: regular-expressions-practical-applications
+---
+
+# --question--
+
+## --text--
+
+正規表現で "$" を検索するものは何ですか?
+
+## --answers--
+
+$
+
+---
+
+\\dollar\\
+
+---
+
+\\$
+
+---
+
+!$
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/regular-expressions.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/regular-expressions.md
new file mode 100644
index 0000000000..b60bbf455d
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/regular-expressions.md
@@ -0,0 +1,42 @@
+---
+id: 5e7b9f0b0b6c005b0e76f06e
+title: 正規表現
+challengeType: 11
+videoId: Yud_COr6pZo
+bilibiliIds:
+ aid: 759422542
+ bvid: BV1W64y167YD
+ cid: 376387549
+dashedName: regular-expressions
+---
+
+# --question--
+
+## --text--
+
+空白文字のみにマッチする正規表現はどれですか?
+
+## --answers--
+
+\\S
+
+---
+
+\\s
+
+---
+
+.
+
+---
+
+\_
+
+---
+
+\\.
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/relational-database-design.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/relational-database-design.md
new file mode 100644
index 0000000000..965c13ce2d
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/relational-database-design.md
@@ -0,0 +1,38 @@
+---
+id: 5e7b9f180b6c005b0e76f08c
+title: リレーショナルデータベースの設計
+challengeType: 11
+videoId: AqdfbrpkbHk
+bilibiliIds:
+ aid: 504388066
+ bvid: BV1Qg411j742
+ cid: 377532216
+dashedName: relational-database-design
+---
+
+# --question--
+
+## --text--
+
+文字列データをデータベースに保存する際にベストプラクティスとなっている保存回数は何回ですか?
+
+## --answers--
+
+0
+
+---
+
+1
+
+---
+
+2
+
+---
+
+3
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/relational-databases-and-sqlite.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/relational-databases-and-sqlite.md
new file mode 100644
index 0000000000..391701abb7
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/relational-databases-and-sqlite.md
@@ -0,0 +1,38 @@
+---
+id: 5e7b9f170b6c005b0e76f08a
+title: リレーショナルデータベースと SQLite
+challengeType: 11
+videoId: QlNod5-kFpA
+bilibiliIds:
+ aid: 249449958
+ bvid: BV12v411E74H
+ cid: 377530805
+dashedName: relational-databases-and-sqlite
+---
+
+# --question--
+
+## --text--
+
+データベースの主要なデータ構造「ではない」ものはどれですか?
+
+## --answers--
+
+インデックス
+
+---
+
+テーブル
+
+---
+
+行
+
+---
+
+列
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/relational-databases-join-operation.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/relational-databases-join-operation.md
new file mode 100644
index 0000000000..10e05495a0
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/relational-databases-join-operation.md
@@ -0,0 +1,34 @@
+---
+id: 5e7b9f180b6c005b0e76f08f
+title: 'リレーショナルデータベース: 結合操作'
+challengeType: 11
+videoId: jvDw3D9GKac
+bilibiliIds:
+ aid: 804461215
+ bvid: BV1Ry4y1j7tv
+ cid: 377542880
+dashedName: relational-databases-join-operation
+---
+
+# --question--
+
+## --text--
+
+SQL ステートメントで JOIN 句を使用する場合、ON は何を実行しますか?
+
+## --answers--
+
+JOIN を実行するテーブルを示す。
+
+---
+
+JOIN に使用するフィールドを指定する。
+
+---
+
+2 つのテーブルをどのように結合するかを示す。
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/relational-databases-many-to-many-relationships.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/relational-databases-many-to-many-relationships.md
new file mode 100644
index 0000000000..91b324bcf7
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/relational-databases-many-to-many-relationships.md
@@ -0,0 +1,52 @@
+---
+id: 5e7b9f190b6c005b0e76f090
+title: 'リレーショナルデータベース: 多対多のリレーションシップ'
+challengeType: 11
+videoId: z-SBYcvEQOc
+bilibiliIds:
+ aid: 291965127
+ bvid: BV1Af4y1L7BK
+ cid: 377543409
+dashedName: relational-databases-many-to-many-relationships
+---
+
+# --description--
+
+その他のリソース:
+
+\- [演習: Email](https://www.youtube.com/watch?v=uQ3Qv1z_Vao)
+
+\- [演習: Roster](https://www.youtube.com/watch?v=qEkUEAz8j3o)
+
+\- [演習: Tracks](https://www.youtube.com/watch?v=I-E7avcPeSE)
+
+\- [演習: Twfriends](https://www.youtube.com/watch?v=RZRAoBFIH6A)
+
+\- [演習: Twspider](https://www.youtube.com/watch?v=xBaJddvJL4A)
+
+# --question--
+
+## --text--
+
+多対多のリレーションシップの具体例はどれですか?
+
+## --answers--
+
+先生と生徒
+
+---
+
+客と注文
+
+---
+
+本とページ
+
+---
+
+都市と国
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/relational-databases-relationship-building.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/relational-databases-relationship-building.md
new file mode 100644
index 0000000000..65bbda5474
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/relational-databases-relationship-building.md
@@ -0,0 +1,34 @@
+---
+id: 5e7b9f180b6c005b0e76f08e
+title: 'リレーショナルデータベース: リレーションシップの構築'
+challengeType: 11
+videoId: CSbqczsHVnc
+bilibiliIds:
+ aid: 376996473
+ bvid: BV1jo4y1S7VY
+ cid: 377532966
+dashedName: relational-databases-relationship-building
+---
+
+# --question--
+
+## --text--
+
+SQL の INSERT コマンドは何を実行しますか?
+
+## --answers--
+
+新しい行を定義する。そのために、挿入したいフィールドを列挙し、その後に、新しい行に配置したい値を記述する。
+
+---
+
+新しい列を定義する。そのために、挿入したい行を列挙し、その後に、新しい列に配置したい値を記述する。
+
+---
+
+新しいテーブルを定義する。そのために、挿入したい行とフィールドを列挙し、その後に、テーブルに配置したい値を記述する。
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/representing-relationships-in-a-relational-database.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/representing-relationships-in-a-relational-database.md
new file mode 100644
index 0000000000..3bf5f7f3b0
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/representing-relationships-in-a-relational-database.md
@@ -0,0 +1,38 @@
+---
+id: 5e7b9f180b6c005b0e76f08d
+title: リレーショナルデータベースのリレーションシップを表現する
+challengeType: 11
+videoId: '-orenCNdC2Q'
+bilibiliIds:
+ aid: 931953070
+ bvid: BV1FM4y1N7hc
+ cid: 377532529
+dashedName: representing-relationships-in-a-relational-database
+---
+
+# --question--
+
+## --text--
+
+外部キーとは何ですか?
+
+## --answers--
+
+そこにあるはずのないキー。
+
+---
+
+非ラテン文字を使用するキー。
+
+---
+
+別のテーブルにある関連する行の主キーを指す数値。
+
+---
+
+"Real world" で行をルックアップ検索するために使用する可能性のあるキー。
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/strings-and-lists.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/strings-and-lists.md
new file mode 100644
index 0000000000..e9f9cf6532
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/strings-and-lists.md
@@ -0,0 +1,51 @@
+---
+id: 5e7b9f090b6c005b0e76f066
+title: 文字列とリスト
+challengeType: 11
+videoId: lxcFa7ldCi0
+bilibiliIds:
+ aid: 804401443
+ bvid: BV1By4y1j7F9
+ cid: 376385517
+dashedName: strings-and-lists
+---
+
+# --description--
+
+その他のリソース:
+
+\- [演習](https://www.youtube.com/watch?v=-9TfJF2dwHI)
+
+# --question--
+
+## --text--
+
+このコードで n は何に等しくなりますか?
+
+```python
+words = 'His e-mail is q-lar@freecodecamp.org'
+pieces = words.split()
+parts = pieces[3].split('-')
+n = parts[1]
+```
+
+## --answers--
+
+mail
+
+---
+
+q
+
+---
+
+lar
+
+---
+
+`lar@freecodecamp.org`
+
+## --video-solution--
+
+4
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/strings-in-python.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/strings-in-python.md
new file mode 100644
index 0000000000..b1f0474e7e
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/strings-in-python.md
@@ -0,0 +1,63 @@
+---
+id: 5e7b9f070b6c005b0e76f060
+title: Python の文字列
+challengeType: 11
+videoId: LYZj207fKpQ
+bilibiliIds:
+ aid: 504434218
+ bvid: BV1Lg41177s8
+ cid: 376531802
+dashedName: strings-in-python
+---
+
+# --question--
+
+## --text--
+
+次のコードは何を表示しますか?
+
+```python
+for n in "banana":
+ print(n)
+```
+
+## --answers--
+
+
+n
+n
+
+
+---
+
+
+0
+1
+
+
+---
+
+
+0
+1
+2
+3
+4
+5
+
+
+---
+
+
+b
+a
+n
+a
+n
+a
+
+
+## --video-solution--
+
+4
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/the-tuples-collection.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/the-tuples-collection.md
new file mode 100644
index 0000000000..99a8d88c07
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/the-tuples-collection.md
@@ -0,0 +1,63 @@
+---
+id: 5e7b9f0a0b6c005b0e76f06c
+title: タプルコレクション
+challengeType: 11
+videoId: 3Lxpladfh2k
+bilibiliIds:
+ aid: 334468209
+ bvid: BV1aw411R77G
+ cid: 376533308
+dashedName: the-tuples-collection
+---
+
+# --question--
+
+## --text--
+
+次のコードは何を表示しますか?
+
+```python
+d = dict()
+d['quincy'] = 1
+d['beau'] = 5
+d['kris'] = 9
+for (k,i) in d.items():
+ print(k, i)
+```
+
+## --answers--
+
+
+k i
+k i
+k i
+
+
+---
+
+
+quincy 0
+beau 1
+kris 2
+
+
+---
+
+
+quincy 1
+beau 5
+kris 9
+
+
+---
+
+
+1 quincy
+5 beau
+9 kris
+
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/using-web-services.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/using-web-services.md
new file mode 100644
index 0000000000..7b59ba7a4a
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/using-web-services.md
@@ -0,0 +1,42 @@
+---
+id: 5e7b9f0e0b6c005b0e76f07a
+title: ウェブサービスを利用する
+challengeType: 11
+videoId: oNl1OVDPGKE
+bilibiliIds:
+ aid: 759406136
+ bvid: BV1b64y16746
+ cid: 377332189
+dashedName: using-web-services
+---
+
+# --question--
+
+## --text--
+
+インターネットでデータを送信するための最も一般的な 2 つの方法は何ですか?
+
+## --answers--
+
+JSON と TXT
+
+---
+
+JSON と XML
+
+---
+
+XML と TXT
+
+---
+
+XML と PHP
+
+---
+
+PHP と TXT
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/variables-expressions-and-statements.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/variables-expressions-and-statements.md
new file mode 100644
index 0000000000..2a875ba41e
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/variables-expressions-and-statements.md
@@ -0,0 +1,38 @@
+---
+id: 5e7b9f050b6c005b0e76f056
+title: '変数、式、ステートメント'
+challengeType: 11
+videoId: nELR-uyyrok
+bilibiliIds:
+ aid: 419396811
+ bvid: BV1iV411p7Mn
+ cid: 376318116
+dashedName: variables-expressions-and-statements
+---
+
+# --question--
+
+## --text--
+
+代入ステートメントで使用する記号は何ですか?
+
+## --answers--
+
+~
+
+---
+
+&
+
+---
+
+=
+
+---
+
+\|
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/visualizing-data-with-python.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/visualizing-data-with-python.md
new file mode 100644
index 0000000000..b214ff43a1
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/visualizing-data-with-python.md
@@ -0,0 +1,42 @@
+---
+id: 5e7b9f690b6c005b0e76f095
+title: Python でデータを可視化する
+challengeType: 11
+videoId: e3lydkH0prw
+bilibiliIds:
+ aid: 291996462
+ bvid: BV15f4y1L7jH
+ cid: 377544192
+dashedName: visualizing-data-with-python
+---
+
+# --question--
+
+## --text--
+
+ほとんどのデータは使用する前に \_\_\_\_\_\_ する必要があります。
+
+## --answers--
+
+JSON 形式に変換
+
+---
+
+グラフ化
+
+---
+
+クリーニング
+
+---
+
+記憶
+
+---
+
+歌詞化
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-api-rate-limiting-and-security.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-api-rate-limiting-and-security.md
new file mode 100644
index 0000000000..7617e5a5c1
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-api-rate-limiting-and-security.md
@@ -0,0 +1,50 @@
+---
+id: 5e7b9f150b6c005b0e76f080
+title: 'ウェブサービス: API レート制限とセキュリティ'
+challengeType: 11
+videoId: pI-g0lI8ngs
+bilibiliIds:
+ aid: 249456172
+ bvid: BV1Sv411E7qa
+ cid: 377336269
+dashedName: web-services-api-rate-limiting-and-security
+---
+
+# --description--
+
+その他のリソース:
+
+\- [演習: GeoJSON](https://www.youtube.com/watch?v=TJGJN0T8tak)
+
+\- [演習: JSON](https://www.youtube.com/watch?v=vTmw5RtfGMY)
+
+\- [演習: Twitter](https://www.youtube.com/watch?v=2c7YwhvpCro)
+
+\- [演習: XML](https://www.youtube.com/watch?v=AopYOlDa-vY)
+
+# --question--
+
+## --text--
+
+Twitter API からリクエストを行う場合、常にリクエストと一緒に送信する必要がある情報は何ですか?
+
+## --answers--
+
+Twitter のユーザー名
+
+---
+
+日付の範囲
+
+---
+
+検索キーワード
+
+---
+
+キー
+
+## --video-solution--
+
+4
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-apis.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-apis.md
new file mode 100644
index 0000000000..a77809b422
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-apis.md
@@ -0,0 +1,38 @@
+---
+id: 5e7b9f150b6c005b0e76f07f
+title: 'ウェブサービス: API'
+challengeType: 11
+videoId: oUNn1psfBJg
+bilibiliIds:
+ aid: 589451017
+ bvid: BV1zq4y1X7A9
+ cid: 377336011
+dashedName: web-services-apis
+---
+
+# --question--
+
+## --text--
+
+API とは何の略ですか?
+
+## --answers--
+
+アプリケーション・ポータブル・インテリジェンス
+
+---
+
+アソシエイト・プログラミング・インターナショナル
+
+---
+
+アプリケーション・プログラム・インターフェイス
+
+---
+
+アクション・ポータブル・インターフェイス
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-json.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-json.md
new file mode 100644
index 0000000000..849974b079
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-json.md
@@ -0,0 +1,60 @@
+---
+id: 5e7b9f140b6c005b0e76f07d
+title: 'ウェブサービス: JSON'
+challengeType: 11
+videoId: ZJE-U56BppM
+bilibiliIds:
+ aid: 419491911
+ bvid: BV1r3411672w
+ cid: 377332928
+dashedName: web-services-json
+---
+
+# --question--
+
+## --text--
+
+次のコードは何を表示しますか?
+
+```python
+import json
+data = '''
+ [
+ { "id" : "001",
+ "x" : "2",
+ "name" : "Quincy"
+ } ,
+ { "id" : "009",
+ "x" : "7",
+ "name" : "Mrugesh"
+ }
+ ]
+'''
+info = json.loads(data)
+print(info[1]['name'])
+```
+
+## --answers--
+
+Quincy
+
+---
+
+Mrugesh
+
+---
+
+001
+
+---
+
+009
+
+---
+
+[エラー]
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-service-oriented-approach.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-service-oriented-approach.md
new file mode 100644
index 0000000000..1e087e6770
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-service-oriented-approach.md
@@ -0,0 +1,34 @@
+---
+id: 5e7b9f140b6c005b0e76f07e
+title: 'ウェブサービス: サービス指向のアプローチ'
+challengeType: 11
+videoId: muerlsCHExI
+bilibiliIds:
+ aid: 846899335
+ bvid: BV1E54y1J7oz
+ cid: 377333277
+dashedName: web-services-service-oriented-approach
+---
+
+# --question--
+
+## --text--
+
+サービス指向のウェブアプリ開発アプローチでは、データはどこに存在しますか?
+
+## --answers--
+
+インターネットまたは内部ネットワークを介して接続された多くのコンピューターシステムに散在している。
+
+---
+
+メインのウェブサーバー上の異なるサービス内にある。
+
+---
+
+別のデータベースサーバー上にある。
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-xml-schema.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-xml-schema.md
new file mode 100644
index 0000000000..f7d656b224
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-xml-schema.md
@@ -0,0 +1,34 @@
+---
+id: 5e7b9f0e0b6c005b0e76f07c
+title: 'ウェブサービス: XML スキーマ'
+challengeType: 11
+videoId: yWU9kTxW-nc
+bilibiliIds:
+ aid: 631951466
+ bvid: BV1Vb4y1r7m7
+ cid: 377332603
+dashedName: web-services-xml-schema
+---
+
+# --question--
+
+## --text--
+
+XSD とは何ですか?
+
+## --answers--
+
+XML に対する W3C スキーマ仕様。
+
+---
+
+MOZ からの標準 JSON スキーマ。
+
+---
+
+拡張可能な状況依存ドライバー。
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-xml.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-xml.md
new file mode 100644
index 0000000000..add041ed18
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/web-services-xml.md
@@ -0,0 +1,47 @@
+---
+id: 5e7b9f0e0b6c005b0e76f07b
+title: 'ウェブサービス: XML'
+challengeType: 11
+videoId: _pZ0srbg7So
+bilibiliIds:
+ aid: 761920032
+ bvid: BV1n64y1x7KW
+ cid: 377332379
+dashedName: web-services-xml
+---
+
+# --question--
+
+## --text--
+
+次の XML で何が間違っていますか?
+
+```xml
+
+ Chuck
+
+ +1 734 303 4456
+
+
+```
+
+## --answers--
+
+email タグに終了タグがない。
+
+---
+
+スペースの記述が原因で XML が無効になる。
+
+---
+
+phone タグに終了タグがない。
+
+---
+
+プレーンテキストは UTF-8 を使用してエンコードする必要がある。
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/working-with-lists.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/working-with-lists.md
new file mode 100644
index 0000000000..6b07a7a96d
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/python-for-everybody/working-with-lists.md
@@ -0,0 +1,38 @@
+---
+id: 5e7b9f090b6c005b0e76f065
+title: リストの操作
+challengeType: 11
+videoId: lCnHfTHkhbE
+bilibiliIds:
+ aid: 376965958
+ bvid: BV1No4y1S7oi
+ cid: 376387989
+dashedName: working-with-lists
+---
+
+# --question--
+
+## --text--
+
+リストの末尾にアイテムを追加するために使用するメソッドはどれですか?
+
+## --answers--
+
+insert
+
+---
+
+push
+
+---
+
+append
+
+---
+
+new
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/scientific-computing-with-python-projects/arithmetic-formatter.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/scientific-computing-with-python-projects/arithmetic-formatter.md
new file mode 100644
index 0000000000..21c6460649
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/scientific-computing-with-python-projects/arithmetic-formatter.md
@@ -0,0 +1,105 @@
+---
+id: 5e44412c903586ffb414c94c
+title: 計算の縦書き整形プログラム
+challengeType: 10
+forumTopicId: 462359
+dashedName: arithmetic-formatter
+---
+
+# --description--
+
+このプロジェクトは [Replit スターターコード](https://replit.com/github/freeCodeCamp/boilerplate-arithmetic-formatter)を使用して作業を行います。
+
+Python カリキュラムの対話式教育コンテンツを引き続き開発中です。 現在、下記の freeCodeCamp.org YouTube チャンネルで、このプロジェクトの完了に必要なすべての知識について説明する動画をいくつか公開しています。
+
+- [「みんなで Python」ビデオコース](https://www.freecodecamp.org/news/python-for-everybody/) (14 時間)
+- [「Python を学ぶ」ビデオコース](https://www.freecodecamp.org/news/learn-python-video-course/) (10 時間)
+
+# --instructions--
+
+小学校の算数では計算問題を解きやすくるために縦書きにすることが多くあります。 たとえば「235 + 52」を次のように記述します。
+
+```py
+ 235
++ 52
+-----
+```
+
+計算問題を表す文字列のリストを受け取り、問題を縦書きに整形して返す関数を作成してください。 この関数はオプションで第 2 引数を受け取る必要があります。 第 2 引数が `True` に設定されている場合は、解答を表示する必要があります。
+
+## 例
+
+関数呼び出し:
+
+```py
+arithmetic_arranger(["32 + 698", "3801 - 2", "45 + 43", "123 + 49"])
+```
+
+出力:
+
+```py
+ 32 3801 45 123
++ 698 - 2 + 43 + 49
+----- ------ ---- -----
+```
+
+関数呼び出し:
+
+```py
+arithmetic_arranger(["32 + 8", "1 - 3801", "9999 + 9999", "523 - 49"], True)
+```
+
+出力:
+
+```py
+ 32 1 9999 523
++ 8 - 3801 + 9999 - 49
+---- ------ ------ -----
+ 40 -3800 19998 474
+```
+
+## ルール
+
+入力された問題が正しく整形されている場合、この関数は正しい変換結果を返します。それ以外の場合は、**ユーザーにとって意味のあるエラーを記述した****文字列**を返します。
+
+
+- エラーを返す場合:
+ - 関数に入力した**問題の数が多すぎる**場合。 上限を **5** つとし、それを超える場合は `Error: Too many problems.` (エラー: 問題が多すぎます) を返します。
+ - 関数が受け取ることのできる適切な演算子は**足し算**と**引き算**です。 掛け算と割り算はエラーを返します。 この箇条書きで指示していない他の演算子についてはテストする必要はありません。 次のようなエラーを返します: `Error: Operator must be '+' or '-'.` (エラー: '+' または '-' の演算子を使用してください)。
+ - 数値 (オペランド) にはそれぞれ数字のみを含める必要があります。 数値以外の場合、関数は次のエラーを返します: `Error: Numbers must only contain digits.` (エラー: 数値には数字のみを含める必要があります)。
+ - それぞれのオペランド (演算子の両側の数値) の幅は最大 4 桁です。 それ以外の場合は、次のようなエラー文字列を返します: `Error: Numbers cannot be more than four digits.` (エラー: 数値は 4 桁以内にする必要があります)。
+- ユーザーが問題を正しい形式で入力した場合は、次のルールに従って変換結果を返します。
+ - 演算子と、2 つのオペランドのうち最も長いオペランドとの間に、スペースを 1 つ含めます。演算子は 2 つ目のオペランドと同じ行に表示し、両方のオペランドは入力されたとおりの順序で表示します (1 つ目のオペランドを上側に、2 つ目のオペランドを下側に表示します)。
+ - 数値は右揃えにする必要があります。
+ - それぞれの問題の間に 4 つのスペースが必要です。
+ - それぞれの問題の一番下にダッシュが必要です。 ダッシュは、各問題の全体の長さに沿った長さにする必要があります (上の表示例を参考にしてください)
+
+## 開発
+
+`arithmetic_arranger.py` でコードを記述してください。 開発には `main.py` を使用して `arithmetic_arranger()` 関数をテストすることができます。 「実行」ボタンをクリックすると `main.py` が実行されます。
+
+## テスト
+
+このプロジェクトの単体テストは `test_module.py` にあります。 `test_module.py` のテストを `main.py` で実行できるようになっています。 「実行」ボタンを押すと自動的にテストが実行されます。 または、コンソールに `pytest` と入力してテストを実行することもできます。
+
+## 提出
+
+プロジェクトの URL をコピーし、下記に提出してください。
+
+# --hints--
+
+計算問題を正しく整形し、すべてのテストに合格する必要があります。
+
+```js
+
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/scientific-computing-with-python-projects/budget-app.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/scientific-computing-with-python-projects/budget-app.md
new file mode 100644
index 0000000000..71548845e3
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/scientific-computing-with-python-projects/budget-app.md
@@ -0,0 +1,108 @@
+---
+id: 5e44413e903586ffb414c94e
+title: 予算アプリ
+challengeType: 10
+forumTopicId: 462361
+dashedName: budget-app
+---
+
+# --description--
+
+このプロジェクトは [Replit スターターコード](https://replit.com/github/freeCodeCamp/boilerplate-budget-app)を使用して作業を行います。
+
+Python カリキュラムの対話式教育コンテンツを引き続き開発中です。 現在、下記の freeCodeCamp.org YouTube チャンネルで、このプロジェクトの完了に必要なすべての知識について説明する動画をいくつか公開しています。
+
+- [「みんなで Python」ビデオコース](https://www.freecodecamp.org/news/python-for-everybody/) (14 時間)
+
+- [「Python を学ぶ」ビデオコース](https://www.freecodecamp.org/news/learn-python-video-course/) (10 時間)
+
+# --instructions--
+
+`budget.py` の `Category` クラスを完成させてください。 *食費*、*服飾費*、*娯楽費*など、さまざまな予算のカテゴリに応じてオブジェクトをインスタンス化できるようにする必要があります。 オブジェクトを作成したら、カテゴリの名前をオブジェクトに渡します。 クラスには、リスト形式の帳簿となる `ledger` というインスタンス変数が必要です。 クラスには次のメソッドも含める必要があります。
+
+- `deposit` (預け入れ) メソッド。金額と説明を受け取ります。 説明がない場合は、デフォルトで空の文字列にします。 このメソッドでは、`{"amount": amount, "description": description}` という形式で帳簿リストの末尾にオブジェクトを追加する必要があります。
+- `withdraw` (引き出し) メソッド。`deposit` メソッドに似ていますが、渡された金額を負数として帳簿に保存する必要があります。 十分な資金がない場合は、帳簿に何も追加しないでください。 このメソッドは、引き出しが行われた場合は `True` を返し、それ以外の場合は `False` を返す必要があります。
+- `get_balance` (残高確認) メソッド。発生した入出金に基づいて予算カテゴリの現在の残高を返します。
+- `transfer` (送金) メソッド。引数として金額と別の予算カテゴリを受け取ります。 このメソッドでは、金額と "Transfer to [Destination Budget Category]" ([送金先の予算カテゴリ] への送金) という記述からなる出金を追加する必要があります。 このメソッドによって、金額と "Transfer to [Destination Budget Category]" という記述からなる入金額が他の予算カテゴリに追加されます。 十分な資金がない場合は、どちらの帳簿にも何も追加しないでください。 このメソッドは、送金が行われた場合は `True` を返し、それ以外の場合は `False` を返す必要があります。
+- `check_funds` (資金確認) メソッド。引数として金額を受け取ります。 金額が予算カテゴリの残高よりも大きい場合は `False` を返し、それ以外の場合は `True` を返します。 このメソッドは `withdraw` メソッドと `transfer` メソッドの両方で使用する必要があります。
+
+予算オブジェクトを出力するときは次のように表示する必要があります。
+
+- 30 文字のタイトル行。`*` 文字を並べて 1 行とし、中央にカテゴリの名前を置きます。
+- 帳簿にある品目のリスト。 各行に説明と金額を表示します。 説明の最初の 23 文字を表示し、その後に金額を表示します。 金額は右揃えで、小数点以下 2 桁までを含み、最大 7 文字まで表示します。
+- カテゴリの合計を表示する行。
+
+出力の例を次に示します。
+
+```bash
+*************Food*************
+initial deposit 1000.00
+groceries -10.15
+restaurant and more foo -15.89
+Transfer to Clothing -50.00
+Total: 923.96
+```
+
+`Category` クラスの他に、カテゴリのリストを引数に取る `create_spend_chart` という関数を (クラスの外で) 作成してください。 この関数は棒グラフとなる文字列を返す必要があります。
+
+グラフでは、関数に渡された各カテゴリについて、その出費の割合を表示する必要があります。 出費の割合は、引き出し額でのみ計算する必要があり、預け入れ額では計算しません。 グラフの左下には 0 ~ 100 のラベルを付ける必要があります。 棒グラフの「棒」は文字 "o" を使用して作成する必要があります。 各棒の高さは最も近い 10 に切り下げる必要があります。 グラフの下の水平線は最後の棒からスペース 2 つ分だけ離す必要があります。 各カテゴリ名は棒の下に垂直に記述する必要があります。 一番上には "Percentage spent by category" (カテゴリ別の出費の割合) というタイトルを付ける必要があります。
+
+この関数は最大 4 つのカテゴリでテストされます。
+
+次の出力例を参考にして、出力の間隔を例と正確に合わせてください。
+
+```bash
+Percentage spent by category
+100|
+ 90|
+ 80|
+ 70|
+ 60| o
+ 50| o
+ 40| o
+ 30| o
+ 20| o o
+ 10| o o o
+ 0| o o o
+ ----------
+ F C A
+ o l u
+ o o t
+ d t o
+ h
+ i
+ n
+ g
+```
+
+このプロジェクトの単体テストは `test_module.py` にあります。
+
+## 開発
+
+`budget.py` でコードを記述してください。 開発には `main.py` を使用して `Category` クラスをテストすることができます。 「実行」ボタンをクリックすると `main.py` が実行されます。
+
+## テスト
+
+すでに `test_module.py` から `main.py` にテストをインポートしてあります。 「実行」ボタンを押すと自動的にテストが実行されます。
+
+## 提出
+
+プロジェクトの URL をコピーし、freeCodeCamp に提出してください。
+
+# --hints--
+
+Category クラスを作成し、すべてのテストに合格する必要があります。
+
+```js
+
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/scientific-computing-with-python-projects/polygon-area-calculator.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/scientific-computing-with-python-projects/polygon-area-calculator.md
new file mode 100644
index 0000000000..6719641228
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/scientific-computing-with-python-projects/polygon-area-calculator.md
@@ -0,0 +1,118 @@
+---
+id: 5e444147903586ffb414c94f
+title: 四角形の面積計算プログラム
+challengeType: 10
+forumTopicId: 462363
+dashedName: polygon-area-calculator
+---
+
+# --description--
+
+このプロジェクトは [Replit スターターコード](https://replit.com/github/freeCodeCamp/boilerplate-polygon-area-calculator)を使用して作業を行います。
+
+Python カリキュラムの対話式教育コンテンツを引き続き開発中です。 現在、下記の freeCodeCamp.org YouTube チャンネルで、このプロジェクトの完了に必要なすべての知識について説明する動画をいくつか公開しています。
+
+- [「みんなで Python」ビデオコース](https://www.freecodecamp.org/news/python-for-everybody/) (14 時間)
+
+- [「Python を学ぶ」ビデオコース](https://www.freecodecamp.org/news/learn-python-video-course/) (10 時間)
+
+# --instructions--
+
+このプロジェクトでは、オブジェクト指向プログラミングを使用して、Rectangle クラスと Square クラスを作成します。 Square クラスは Rectangle のサブクラスであり、メソッドと属性を継承する必要があります。
+
+## Rectangle クラス
+
+Rectangle オブジェクトが作成されるときは、`width` 属性と `height` 属性で初期化する必要があります。 クラスには、次のメソッドも含める必要があります。
+
+- `set_width`
+- `set_height`
+- `get_area`: 面積を返します (`width * height`)
+- `get_perimeter`: 外周を返します (`2 * width + 2 * height`)
+- `get_diagonal`: 対角線を返します(`(width ** 2 + height ** 2) ** .5`)
+- `get_picture`: "\*" の行を使用して図形を表す文字列を返します。 行数は高さと等しく、各行の"\*"の数は幅と等しくする必要があります。 各行の末尾に改行 (`\n`) が必要です。 幅または高さが 50 より大きい場合は、文字列 "Too big for picture." を返す必要があります。
+- `get_amount_inside`: 引数として別の図形 (正方形または長方形) を受け取ります。 渡された図形が、その図形の中に何個収まるかを返します (回転はしません)。 たとえば、幅が 4 で高さが 8 の長方形には、一辺が 4 の正方形が 2つ収まります。
+
+また、Rectangle のインスタンスを文字列として表現する場合は、`Rectangle(width=5, height=10)` のようにする必要があります。
+
+## Square クラス
+
+Square クラスは Rectangle のサブクラスである必要があります。 Square オブジェクトが生成されるときは、一辺の長さを渡します。 `__init__` メソッドでは、一辺の長さを Rectangle クラスの `width` 属性と `height` 属性の両方に格納する必要があります。
+
+Square クラスは、Rectangle クラスのメソッドにアクセスできる必要があり、加えて `set_side` メソッドも含める必要があります。 Square のインスタンスを文字列として表現する場合は、`Square(side=9)` のようにする必要があります。
+
+また、Square クラスの `set_width` と `set_height` メソッドでは、幅と高さの両方を設定する必要があります。
+
+## 使用例
+
+```py
+rect = shape_calculator.Rectangle(10, 5)
+print(rect.get_area())
+rect.set_height(3)
+print(rect.get_perimeter())
+print(rect)
+print(rect.get_picture())
+
+sq = shape_calculator.Square(9)
+print(sq.get_area())
+sq.set_side(4)
+print(sq.get_diagonal())
+print(sq)
+print(sq.get_picture())
+
+rect.set_height(8)
+rect.set_width(16)
+print(rect.get_amount_inside(sq))
+```
+
+上記のコードは次を返す必要があります。
+
+```bash
+50
+26
+Rectangle(width=10, height=3)
+**********
+**********
+**********
+
+81
+5.656854249492381
+Square(side=4)
+****
+****
+****
+****
+
+8
+```
+
+このプロジェクトの単体テストは `test_module.py` にあります。
+
+## 開発
+
+`shape_calculator.py` でコードを記述してください。 開発には `main.py` を使用して `shape_calculator()` 関数をテストすることができます。 「実行」ボタンをクリックすると `main.py` が実行されます。
+
+## テスト
+
+すでに `test_module.py` から `main.py` にテストをインポートしてあります。 「実行」ボタンを押すと自動的にテストが実行されます。
+
+## 提出
+
+プロジェクトの URL をコピーし、freeCodeCamp に提出してください。
+
+# --hints--
+
+Rectangle クラスと Square クラスを作成し、すべてのテストに合格する必要があります。
+
+```js
+
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/scientific-computing-with-python-projects/probability-calculator.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/scientific-computing-with-python-projects/probability-calculator.md
new file mode 100644
index 0000000000..a4f59e83b4
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/scientific-computing-with-python-projects/probability-calculator.md
@@ -0,0 +1,92 @@
+---
+id: 5e44414f903586ffb414c950
+title: 確率計算プログラム
+challengeType: 10
+forumTopicId: 462364
+dashedName: probability-calculator
+---
+
+# --description--
+
+このプロジェクトは [Replit スターターコード](https://replit.com/github/freeCodeCamp/boilerplate-probability-calculator)を使用して作業を行います。
+
+Python カリキュラムの対話式教育コンテンツを引き続き開発中です。 現在、下記の freeCodeCamp.org YouTube チャンネルで、このプロジェクトの完了に必要なすべての知識について説明する動画をいくつか公開しています。
+
+- [「みんなで Python」ビデオコース](https://www.freecodecamp.org/news/python-for-everybody/) (14 時間)
+
+- [「Python を学ぶ」ビデオコース](https://www.freecodecamp.org/news/learn-python-video-course/) (10 時間)
+
+# --instructions--
+
+帽子があり、その中に青いボールが 5 個、赤いボールが 4 個、緑のボールが 2 個入っているとします。 4 個のボールを無作為に取り出す場合、赤のボールが 1 個以上、緑のボールが 2 個含まれる確率は、いくらになりますか? 高度な数学を駆使して確率を計算することも可能ですが、多数の実験を実行しておおよその確率を推定するプログラムを記述する方が簡単です。
+
+このプロジェクトでは、特定のボールを帽子から無作為に取り出す場合のおおよその確率を調べるプログラムを作成します。
+
+まず、`prob_calculator.py` で `Hat` クラスを作成してください。 このクラスは、帽子に入っている各色のボールの数を指定する可変個の引数を受け取る必要があります。 たとえば、次のどの方法でもクラスオブジェクトを作成することができます。
+
+```py
+hat1 = Hat(yellow=3, blue=2, green=6)
+hat2 = Hat(red=5, orange=4)
+hat3 = Hat(red=5, orange=4, black=1, blue=0, pink=2, striped=9)
+```
+
+帽子は常に、少なくとも 1 個のボールが入った状態で作成されます。 作成時に帽子オブジェクトに渡された引数を、`contents` インスタンス変数に変換する必要があります。 `contents` は、帽子に入っているボールごとにアイテムを 1 つずつ含む文字列のリストである必要があります。 リスト内の各アイテムは、その色のボール 1 個分を表す色の名前である必要があります。 たとえば、帽子が `{"red": 2, "blue": 1}` の場合、`contents` は `["red", "red", "blue"]` になる必要があります。
+
+`Hat` クラスには `draw` メソッドが必要です。このメソッドは、帽子から取り出すボールの個数を示す引数を受け取ります。 draw メソッドは、`contents` からボールを無作為に取り除き、それらのボールを文字列のリストとして返す必要があります。 交換のできない壺の実験と同様に、取り出したボールは帽子に戻さないものとします。 取り出すボールの数が利用可能な数を超える場合は、すべてのボールを返してください。
+
+次に、(`Hat` クラスの中ではなく) `prob_calculator.py` で `experiment` 関数を作成してください。 この関数は次の引数を受け取る必要があります。
+
+- `hat`: 関数内でコピーする必要のあるボールを含む帽子オブジェクト。
+- `expected_balls`: 実験で帽子から取り出そうとするボールの正確なグループを示すオブジェクト。 たとえば、青のボール 2 個と赤のボール 1 個を帽子から取り出す確率を調べるには、`expected_balls` を `{"blue":2, "red":1}` に設定します。
+- `num_balls_drawn`: 各実験で帽子から取り出すボールの数。
+- `num_experiments`: 実行する実験の回数 (実験の回数が多いほど、おおよその確率の正確性が高まります)。
+
+`experiment` 関数は、確率を返す必要があります。
+
+たとえば、黒を 6 個、赤を 4 個、緑を 3 個含む帽子から 5 個のボールを取り出す場合に、赤のボールが少なくとも 2 個、緑のボールが少なくとも 1 個含まれる確率を求めたいとしましょう。 それには、`N` 回の実験を行い、赤のボールが少なくとも 2 個、緑のボールが少なくとも 1 個になった回数 `M` を数え、確率を `M/N` として推定します。 実験ではそれぞれ、指定されたボールの入った帽子の状態から始め、いくつかのボールを取り出し、期待されるボールを取り出したかどうかを確認します。
+
+上記の例で 2000 回の実験を行う場合は、`experiment` 関数を次のように呼び出します。
+
+```py
+hat = Hat(black=6, red=4, green=3)
+probability = experiment(hat=hat,
+ expected_balls={"red":2,"green":1},
+ num_balls_drawn=5,
+ num_experiments=2000)
+```
+
+この方法は無作為抽出に基づいているため、コードが実行されるたびに確率が多少変わります。
+
+*ヒント: `prob_calculator.py` の先頭ですでにインポートされているモジュールを使用することを検討してください。 `prob_calculator.py` の中で乱数シードを初期化しないでください。*
+
+## 開発
+
+`prob_calculator.py` でコードを記述してください。 開発には `main.py` を使用してコードをテストすることができます。 「実行」ボタンをクリックすると `main.py` が実行されます。
+
+ボイラープレートには `copy` モジュールと `random` モジュール用の `import` ステートメントが含まれています。 これらをプロジェクトで使用することを検討してください。
+
+## テスト
+
+このプロジェクトの単体テストは `test_module.py` にあります。 すでに `test_module.py` から `main.py` にテストをインポートしてあります。 「実行」ボタンを押すと自動的にテストが実行されます。
+
+## 提出
+
+プロジェクトの URL をコピーし、freeCodeCamp に提出してください。
+
+# --hints--
+
+確率を正しく計算し、すべてのテストに合格する必要があります。
+
+```js
+
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/07-scientific-computing-with-python/scientific-computing-with-python-projects/time-calculator.md b/curriculum/challenges/japanese/07-scientific-computing-with-python/scientific-computing-with-python-projects/time-calculator.md
new file mode 100644
index 0000000000..1b8344540a
--- /dev/null
+++ b/curriculum/challenges/japanese/07-scientific-computing-with-python/scientific-computing-with-python-projects/time-calculator.md
@@ -0,0 +1,85 @@
+---
+id: 5e444136903586ffb414c94d
+title: 時刻計算プログラム
+challengeType: 10
+forumTopicId: 462360
+dashedName: time-calculator
+---
+
+# --description--
+
+このプロジェクトは [Replit スターターコード](https://replit.com/github/freeCodeCamp/boilerplate-time-calculator)を使用して作業を行います。
+
+Python カリキュラムの対話式教育コンテンツを引き続き開発中です。 現在、下記の freeCodeCamp.org YouTube チャンネルで、このプロジェクトの完了に必要なすべての知識について説明する動画をいくつか公開しています。
+
+- [「みんなで Python」ビデオコース](https://www.freecodecamp.org/news/python-for-everybody/) (14 時間)
+
+- [「Python を学ぶ」ビデオコース](https://www.freecodecamp.org/news/learn-python-video-course/) (10 時間)
+
+# --instructions--
+
+下記に示す 2 つの必須パラメーターと 1 つのオプションパラメーターを受け取る関数 `add_time` を記述してください。
+
+- 12 時制形式の開始時刻 (末尾に AM または PM)
+- 時数と分数で示される経過時間
+- (オプション) 開始の曜日 (大文字小文字の記述は自由)
+
+関数は、経過時間を開始時刻に追加し、その結果を返す必要があります。
+
+結果が翌日になる場合は、時刻の後に `(next day)` (翌日) を表示する必要があります。 結果が翌日以降になる場合は、時刻の後に `(n days later)` (n 日後) を表示する必要があります。ここで "n" は何日後かを示します。
+
+関数にオプションの開始曜日パラメーターが与えられた場合は、結果の曜日を出力に表示する必要があります。 出力する曜日は、時刻の後、「n 日後」の前に表示する必要があります。
+
+関数が扱うさまざまなケースの例を次に示します。 結果のスペースと句読点の表示に特に注意を払ってください。
+
+```py
+add_time("3:00 PM", "3:10")
+# Returns: 6:10 PM
+
+add_time("11:30 AM", "2:32", "Monday")
+# Returns: 2:02 PM, Monday
+
+add_time("11:43 AM", "00:20")
+# Returns: 12:03 PM
+
+add_time("10:10 PM", "3:30")
+# Returns: 1:40 AM (next day)
+
+add_time("11:43 PM", "24:20", "tueSday")
+# Returns: 12:03 AM, Thursday (2 days later)
+
+add_time("6:30 PM", "205:12")
+# Returns: 7:42 AM (9 days later)
+```
+
+Python ライブラリをインポートしないでください。 開始時刻は有効な時刻であると仮定します。 経過時間の分数は 60 未満の整数になりますが、時数は任意の整数になります。
+
+## 開発
+
+`time_calculator.py` でコードを記述してください。 開発には `main.py` を使用して `time_calculator()` 関数をテストすることができます。 「実行」ボタンをクリックすると `main.py` が実行されます。
+
+## テスト
+
+このプロジェクトの単体テストは `test_module.py` にあります。 すでに `test_module.py` から `main.py` にテストをインポートしてあります。 「実行」ボタンを押すと自動的にテストが実行されます。
+
+## 提出
+
+プロジェクトの URL をコピーし、freeCodeCamp に提出してください。
+
+# --hints--
+
+正確に時間を追加し、すべてのテストに合格する必要があります。
+
+```js
+
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-analysis-example-a.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-analysis-example-a.md
new file mode 100644
index 0000000000..ac299c1cc7
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-analysis-example-a.md
@@ -0,0 +1,47 @@
+---
+id: 5e9a093a74c4063ca6f7c14d
+title: データ分析の例 A
+challengeType: 11
+videoId: nVAaxZ34khk
+bilibiliIds:
+ aid: 590571151
+ bvid: BV1sq4y1f7gr
+ cid: 409002372
+dashedName: data-analysis-example-a
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/FreeCodeCamp-Pandas-Real-Life-Example)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+データフレームの形状からわかることは何ですか?
+
+## --answers--
+
+メモリに読み込んだデータフレームのギガバイト単位のサイズ。
+
+---
+
+データフレームの行と列の数。
+
+---
+
+読み込み前のソースデータの行数。
+
+---
+
+読み込み前のソースデータの列数。
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-analysis-example-b.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-analysis-example-b.md
new file mode 100644
index 0000000000..53b1bad3be
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-analysis-example-b.md
@@ -0,0 +1,43 @@
+---
+id: 5e9a093a74c4063ca6f7c14e
+title: データ分析の例 B
+challengeType: 11
+videoId: 0kJz0q0pvgQ
+bilibiliIds:
+ aid: 505593432
+ bvid: BV1kg411c7M6
+ cid: 409003530
+dashedName: data-analysis-example-b
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/FreeCodeCamp-Pandas-Real-Life-Example)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+`loc` メソッドでできることは何ですか?
+
+## --answers--
+
+整数の位置を示す引数を指定して行と列のサブセットを取得する。
+
+---
+
+ラベルの引数を指定して行と列のグループにアクセスする。
+
+---
+
+与えられた整数引数に基づいて、最初の `n` 行を返す。
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-and-visualizations.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-and-visualizations.md
new file mode 100644
index 0000000000..6892f6afee
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-and-visualizations.md
@@ -0,0 +1,47 @@
+---
+id: 5e9a093a74c4063ca6f7c160
+title: データクリーニングと可視化
+challengeType: 11
+videoId: mHjxzFS5_Z0
+bilibiliIds:
+ aid: 933107558
+ bvid: BV1KM4y137Ny
+ cid: 409019632
+dashedName: data-cleaning-and-visualizations
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/data-cleaning-rmotr-freecodecamp)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+Matplotlib のグローバル API を使用している場合、次の数字の順序は何を意味しますか?
+
+```py
+plt.subplot(1, 2, 1)
+```
+
+## --answers--
+
+図には 1 列、2 行があり、最初の (左の) プロットで図を描き始める。
+
+---
+
+最初の (左の) プロットで図を描き始め、図は 2 行、1 列となる。
+
+---
+
+図には 1 行、2 列があり、最初の (左の) プロットで図を描き始める。
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-duplicates.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-duplicates.md
new file mode 100644
index 0000000000..b0cad8bb12
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-duplicates.md
@@ -0,0 +1,43 @@
+---
+id: 5e9a093a74c4063ca6f7c15f
+title: データクリーニングの重複
+challengeType: 11
+videoId: kj7QqjXhH6A
+bilibiliIds:
+ aid: 675611672
+ bvid: BV1VU4y1A7tu
+ cid: 409019368
+dashedName: data-cleaning-duplicates
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/data-cleaning-rmotr-freecodecamp)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+Python のメソッドである `.duplicated()` は、DataFrame の Series をブール値で返します。 戻り値が `True` となる行は次のうちどれですか?
+
+## --answers--
+
+重複が含まれていて、行の値にその値の最初の出現が含まれている行。
+
+---
+
+重複が含まれていて、行の値がその値の 2 回目以上の出現になっている行。
+
+---
+
+重複が含まれていて、行の値に最初または 2 回目の出現が含まれている行。
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-introduction.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-introduction.md
new file mode 100644
index 0000000000..4ede3a51e5
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-introduction.md
@@ -0,0 +1,62 @@
+---
+id: 5e9a093a74c4063ca6f7c15d
+title: データクリーニングの概要
+challengeType: 11
+videoId: ovYNhnltVxY
+bilibiliIds:
+ aid: 250574398
+ bvid: BV1Pv411A7GN
+ cid: 409018611
+dashedName: data-cleaning-introduction
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/data-cleaning-rmotr-freecodecamp)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+次のコードは何を表示しますか?
+
+```py
+import pandas as pd
+import numpy as np
+
+s = pd.Series(['a', 3, np.nan, 1, np.nan])
+
+print(s.notnull().sum())
+```
+
+## --answers--
+
+3
+
+---
+
+
0 True
+1 True
+2 False
+3 True
+4 False
+dtype: bool
+
+---
+
+
0 False
+1 False
+2 True
+3 False
+4 True
+dtype: bool
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-with-dataframes.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-with-dataframes.md
new file mode 100644
index 0000000000..d3027ce565
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-with-dataframes.md
@@ -0,0 +1,74 @@
+---
+id: 5e9a093a74c4063ca6f7c15e
+title: DataFrame によるデータクリーニング
+challengeType: 11
+videoId: sTMN_pdI6S0
+bilibiliIds:
+ aid: 505597026
+ bvid: BV1Yg411c7bx
+ cid: 409018948
+dashedName: data-cleaning-with-dataframes
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/data-cleaning-rmotr-freecodecamp)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+次のコードは何を表示しますか?
+
+```py
+import pandas as pd
+import numpy as np
+
+s = pd.Series([np.nan, 1, 2, np.nan, 3])
+s = s.fillna(method='ffill')
+
+print(s)
+```
+
+## --answers--
+
+
+0 1.0
+1 1.0
+2 2.0
+3 3.0
+4 3.0
+dtype: float64
+
+
+---
+
+
+0 NaN
+1 1.0
+2 2.0
+3 2.0
+4 3.0
+dtype: float64
+
+
+---
+
+
+0 NaN
+1 1.0
+2 2.0
+3 NaN
+4 3.0
+dtype: float64
+
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/how-to-use-jupyter-notebooks-intro.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/how-to-use-jupyter-notebooks-intro.md
new file mode 100644
index 0000000000..a681a7ffa8
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/how-to-use-jupyter-notebooks-intro.md
@@ -0,0 +1,43 @@
+---
+id: 5e9a093a74c4063ca6f7c14f
+title: Jupyter Notebook の使い方紹介
+challengeType: 11
+videoId: h8caJq2Bb9w
+bilibiliIds:
+ aid: 293035919
+ bvid: BV1Hf4y1n7qr
+ cid: 409002965
+dashedName: how-to-use-jupyter-notebooks-intro
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/ds-content-interactive-jupyterlab-tutorial)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+Jupyter Notebook のセルで**使用できない**ものは何ですか?
+
+## --answers--
+
+マークダウン
+
+---
+
+Python コード
+
+---
+
+Excel シート
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/introduction-to-data-analysis.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/introduction-to-data-analysis.md
new file mode 100644
index 0000000000..43656aad96
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/introduction-to-data-analysis.md
@@ -0,0 +1,43 @@
+---
+id: 5e9a093a74c4063ca6f7c14c
+title: データ分析入門
+challengeType: 11
+videoId: VJrP2FUzKP0
+bilibiliIds:
+ aid: 378034466
+ bvid: BV19f4y1c7nu
+ cid: 409001487
+dashedName: introduction-to-data-analysis
+---
+
+# --description--
+
+その他のリソース:
+
+\- [スライド](https://docs.google.com/presentation/d/1cUIt8b2ySz-85_ykfeuuWsurccwTAuFPn782pZBzFsU/edit?usp=sharing)
+
+# --question--
+
+## --text--
+
+次のうち、**データ分析の一部ではない**ことはどれですか?
+
+## --answers--
+
+統計モデルとデータ可視化を構築すること。
+
+---
+
+分析にとって望ましい結論を選ぶこと。
+
+---
+
+不正な値を修正し、無効なデータを削除すること。
+
+---
+
+データを適切なデータ構造に変換すること。
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/jupyter-notebooks-cells.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/jupyter-notebooks-cells.md
new file mode 100644
index 0000000000..8677152694
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/jupyter-notebooks-cells.md
@@ -0,0 +1,42 @@
+---
+id: 5e9a093a74c4063ca6f7c150
+title: Jupyter Notebook のセル
+challengeType: 11
+videoId: 5PPegAs9aLA
+bilibiliIds:
+ aid: 420510493
+ bvid: BV19341117Hq
+ cid: 409003280
+dashedName: jupyter-notebooks-cells
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/ds-content-interactive-jupyterlab-tutorial)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+Jupyter Notebook のセルの 3 つの主要なタイプは何ですか?
+
+## --answers--
+
+コード、マークダウン、Python
+
+---
+
+コード、マークダウン、生データ
+
+---
+
+マークダウン、Python、生データ
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/jupyter-notebooks-importing-and-exporting-data.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/jupyter-notebooks-importing-and-exporting-data.md
new file mode 100644
index 0000000000..5f0004112b
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/jupyter-notebooks-importing-and-exporting-data.md
@@ -0,0 +1,51 @@
+---
+id: 5e9a093a74c4063ca6f7c151
+title: Jupyter Notebook のデータのインポートとエクスポート
+challengeType: 11
+videoId: k1msxD3JIxE
+bilibiliIds:
+ aid: 975540688
+ bvid: BV1n44y1b7Gi
+ cid: 409006337
+dashedName: jupyter-notebooks-importing-and-exporting-data
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/ds-content-interactive-jupyterlab-tutorial)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+Jupyter Notebook ではどのようなデータをインポートして作業できますか?
+
+## --answers--
+
+Excel ファイル
+
+---
+
+CSV ファイル
+
+---
+
+XML ファイル
+
+---
+
+API からのデータ
+
+---
+
+上記のすべて
+
+## --video-solution--
+
+5
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-algebra-and-size.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-algebra-and-size.md
new file mode 100644
index 0000000000..f7a3a54194
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-algebra-and-size.md
@@ -0,0 +1,47 @@
+---
+id: 5e9a093a74c4063ca6f7c157
+title: Numpy の代数とサイズ
+challengeType: 11
+videoId: XAT97YLOKD8
+bilibiliIds:
+ aid: 250621433
+ bvid: BV1hv41137uM
+ cid: 409013128
+dashedName: numpy-algebra-and-size
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/freecodecamp-intro-to-numpy)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+Python の標準ライブラリと Numpy ライブラリとの間で、メモリ内のオブジェクト (リストやデータ型など) のサイズの関係はどうなっていますか? そのことを踏まえるとパフォーマンスにどのような影響が生じますか?
+
+## --answers--
+
+標準的な Python オブジェクトは、NumPy オブジェクトよりも多くのメモリを消費する。標準的な Python オブジェクトと NumPy オブジェクトの演算はほぼ同じ時間で実行される。
+
+---
+
+NumPy オブジェクトは、標準的な Python オブジェクトよりもはるかに多くのメモリを消費する。NumPy オブジェクトに対する演算は、同等の標準的な Python オブジェクトに対する演算と比べて非常に高速に実行される。
+
+---
+
+NumPy オブジェクトは、標準的な Python オブジェクトよりもはるかに少ないメモリしか使用しない。標準的な Python オブジェクトに対する演算は、同等の NumPy オブジェクトに対する演算と比べて非常に高速に実行される。
+
+---
+
+標準的な Python オブジェクトは、NumPy オブジェクトよりも多くのメモリを消費する。NumPy オブジェクトに対する演算は、同等の標準的な Python オブジェクトに対する演算と比べて非常に高速に実行される。
+
+## --video-solution--
+
+4
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-arrays.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-arrays.md
new file mode 100644
index 0000000000..508bd53efb
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-arrays.md
@@ -0,0 +1,63 @@
+---
+id: 5e9a093a74c4063ca6f7c154
+title: Numpy の配列
+challengeType: 11
+videoId: VDYVFHBL1AM
+bilibiliIds:
+ aid: 890607366
+ bvid: BV1zP4y1h7FR
+ cid: 409011400
+dashedName: numpy-arrays
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/freecodecamp-intro-to-numpy)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+次のコードは何を表示しますか?
+
+```py
+A = np.array([
+ ['a', 'b', 'c'],
+ ['d', 'e', 'f'],
+ ['g', 'h', 'i']
+])
+
+print(A[:, :2])
+```
+
+## --answers--
+
+```py
+[['a' 'b']]
+```
+
+---
+
+```py
+[['b' 'c']
+['e' 'f']
+['h' 'i']]
+```
+
+---
+
+```py
+[['a' 'b']
+['d' 'e']
+['g' 'h']]
+```
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-boolean-arrays.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-boolean-arrays.md
new file mode 100644
index 0000000000..df6e139181
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-boolean-arrays.md
@@ -0,0 +1,61 @@
+---
+id: 5e9a093a74c4063ca6f7c156
+title: Numpy のブール配列
+challengeType: 11
+videoId: N1ttsMmcVMM
+bilibiliIds:
+ aid: 208091324
+ bvid: BV1Qh411p7V8
+ cid: 409012711
+dashedName: numpy-boolean-arrays
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/freecodecamp-intro-to-numpy)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+次のコードは何を表示しますか?
+
+```py
+a = np.arange(5)
+
+print(a <= 3)
+```
+
+## --answers--
+
+```python
+[False, False, False, False, True]
+```
+
+---
+
+```python
+[5]
+```
+
+---
+
+```python
+[0, 1, 2, 3]
+```
+
+---
+
+```python
+[True, True, True, True, False]
+```
+
+## --video-solution--
+
+4
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-introduction-a.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-introduction-a.md
new file mode 100644
index 0000000000..af278c5673
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-introduction-a.md
@@ -0,0 +1,43 @@
+---
+id: 5e9a093a74c4063ca6f7c152
+title: Numpy 入門 A
+challengeType: 11
+videoId: P-JjV6GBCmk
+bilibiliIds:
+ aid: 718079611
+ bvid: BV18Q4y1k7om
+ cid: 409007080
+dashedName: numpy-introduction-a
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/freecodecamp-intro-to-numpy)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+なぜ Numpy は重要でありながら人気のない Python ライブラリなのでしょうか?
+
+## --answers--
+
+Numpy で直接作業する機会があまりないから。
+
+---
+
+非常に遅いから。
+
+---
+
+Numpy で作業することは難しいから。
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-introduction-b.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-introduction-b.md
new file mode 100644
index 0000000000..fe221da0ea
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-introduction-b.md
@@ -0,0 +1,47 @@
+---
+id: 5e9a093a74c4063ca6f7c153
+title: Numpy 入門 B
+challengeType: 11
+videoId: YIqgrNLAZkA
+bilibiliIds:
+ aid: 250503382
+ bvid: BV1kv411w7vB
+ cid: 409010193
+dashedName: numpy-introduction-b
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/freecodecamp-intro-to-numpy)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+通常の Python では、整数 `5` はどれくらいのメモリを消費しますか?
+
+## --answers--
+
+32 ビット
+
+---
+
+20 バイト
+
+---
+
+16 バイト
+
+---
+
+8 ビット
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-operations.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-operations.md
new file mode 100644
index 0000000000..1b2183f002
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/numpy-operations.md
@@ -0,0 +1,54 @@
+---
+id: 5e9a093a74c4063ca6f7c155
+title: Numpy の演算
+challengeType: 11
+videoId: eqSVcJbaPdk
+bilibiliIds:
+ aid: 378057123
+ bvid: BV13f4y1w7od
+ cid: 409012507
+dashedName: numpy-operations
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/freecodecamp-intro-to-numpy)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+次のコードを実行した後、`a` の値は何になりますか?
+
+```py
+a = np.arange(5)
+a + 20
+```
+
+## --answers--
+
+```python
+[20, 21, 22, 24, 24]
+```
+
+---
+
+```python
+[0, 1, 2, 3, 4]
+```
+
+---
+
+```python
+[25, 26, 27, 28, 29]
+```
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/pandas-conditional-selection-and-modifying-dataframes.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/pandas-conditional-selection-and-modifying-dataframes.md
new file mode 100644
index 0000000000..b0c6f26eac
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/pandas-conditional-selection-and-modifying-dataframes.md
@@ -0,0 +1,77 @@
+---
+id: 5e9a093a74c4063ca6f7c15b
+title: Pandas の条件付き選択とデータフレームの変更
+challengeType: 11
+videoId: BFlH0fN5xRQ
+bilibiliIds:
+ aid: 505598518
+ bvid: BV1vg411c72y
+ cid: 409113534
+dashedName: pandas-conditional-selection-and-modifying-dataframes
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/freecodecamp-intro-to-pandas)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+次のコードは何を表示しますか?
+
+```py
+import pandas as pd
+
+certificates_earned = pd.DataFrame({
+ 'Certificates': [8, 2, 5, 6],
+ 'Time (in months)': [16, 5, 9, 12]
+})
+names = ['Tom', 'Kris', 'Ahmad', 'Beau']
+
+certificates_earned.index = names
+longest_streak = pd.Series([13, 11, 9, 7], index=names)
+certificates_earned['Longest streak'] = longest_streak
+
+print(certificates_earned)
+```
+
+## --answers--
+
+
+Tom 13
+Kris 11
+Ahmad 9
+Beau 7
+Name: Longest streak, dtype: int64
+
+
+---
+
+
+ Certificates Time (in months) Longest streak
+Tom 8 16 13
+Kris 2 5 11
+Ahmad 5 9 9
+Beau 6 12 7
+
+
+---
+
+
+ Certificates Longest streak
+Tom 8 13
+Kris 2 11
+Ahmad 5 9
+Beau 6 7
+
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/pandas-creating-columns.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/pandas-creating-columns.md
new file mode 100644
index 0000000000..883b4d1d63
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/pandas-creating-columns.md
@@ -0,0 +1,62 @@
+---
+id: 5e9a093a74c4063ca6f7c15c
+title: Pandas での列の作成
+challengeType: 11
+videoId: _sSo2XZoB3E
+bilibiliIds:
+ aid: 975568901
+ bvid: BV1b44y1b7Cg
+ cid: 409018052
+dashedName: pandas-creating-columns
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/freecodecamp-intro-to-pandas)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+次のような `certificates_earned` DataFrame に "Certificates per month" (月ごとの証明書) 列を追加するコードはどのようになりますか?
+
+
Certificates Time (in months) Certificates per month
+Tom 8 16 0.50
+Kris 2 5 0.40
+Ahmad 5 9 0.56
+Beau 6 12 0.50
+
+## --answers--
+
+```py
+certificates_earned['Certificates'] /
+certificates_earned['Time (in months)']
+```
+
+---
+
+```py
+certificates_earned['Certificates per month'] = round(
+ certificates_earned['Certificates'] /
+ certificates_earned['Time (in months)']
+)
+```
+
+---
+
+```py
+certificates_earned['Certificates per month'] = round(
+ certificates_earned['Certificates'] /
+ certificates_earned['Time (in months)'], 2
+)
+```
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/pandas-dataframes.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/pandas-dataframes.md
new file mode 100644
index 0000000000..173a758000
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/pandas-dataframes.md
@@ -0,0 +1,70 @@
+---
+id: 5e9a093a74c4063ca6f7c15a
+title: Pandas のデータフレーム (DataFrame)
+challengeType: 11
+videoId: 7SgFBYXaiH0
+bilibiliIds:
+ aid: 890503235
+ bvid: BV1TP4y1h7qq
+ cid: 409014039
+dashedName: pandas-dataframes
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/freecodecamp-intro-to-pandas)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+次のコードは何を表示しますか?
+
+```py
+import pandas as pd
+
+certificates_earned = pd.DataFrame({
+ 'Certificates': [8, 2, 5, 6],
+ 'Time (in months)': [16, 5, 9, 12]
+})
+
+certificates_earned.index = ['Tom', 'Kris', 'Ahmad', 'Beau']
+
+print(certificates_earned.iloc[2])
+```
+
+## --answers--
+
+
+Tom 16
+Kris 5
+Ahmad 9
+Beau 12
+Name: Time (in months), dtype: int64
+
+
+---
+
+
+Certificates 6
+Time (in months) 12
+Name: Beau, dtype: int64
+
+
+---
+
+
+Certificates 5
+Time (in months) 9
+Name: Ahmad, dtype: int64
+
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/pandas-indexing-and-conditional-selection.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/pandas-indexing-and-conditional-selection.md
new file mode 100644
index 0000000000..cb1b169659
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/pandas-indexing-and-conditional-selection.md
@@ -0,0 +1,69 @@
+---
+id: 5e9a093a74c4063ca6f7c159
+title: Pandas でのインデックス作成と条件付き選択
+challengeType: 11
+videoId: '-ZOrgV_aA9A'
+bilibiliIds:
+ aid: 720604139
+ bvid: BV1FQ4y1k7tC
+ cid: 409013650
+dashedName: pandas-indexing-and-conditional-selection
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/freecodecamp-intro-to-pandas)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+次のコードは何を表示しますか?
+
+```py
+import pandas as pd
+
+certificates_earned = pd.Series(
+ [8, 2, 5, 6],
+ index=['Tom', 'Kris', 'Ahmad', 'Beau']
+)
+
+print(certificates_earned[certificates_earned > 5])
+```
+
+## --answers--
+
+
+Tom True
+Kris False
+Ahmad False
+Beau True
+dtype: int64
+
+
+---
+
+
+Tom 8
+Ahmad 5
+Beau 6
+dtype: int64
+
+
+---
+
+
+Tom 8
+Beau 6
+dtype: int64
+
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/pandas-introduction.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/pandas-introduction.md
new file mode 100644
index 0000000000..99d9b7ef4d
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/pandas-introduction.md
@@ -0,0 +1,72 @@
+---
+id: 5e9a093a74c4063ca6f7c158
+title: Pandas 入門
+challengeType: 11
+videoId: 0xACW-8cZU0
+bilibiliIds:
+ aid: 975510116
+ bvid: BV1u44y1b7fD
+ cid: 409013433
+dashedName: pandas-introduction
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/freecodecamp-intro-to-pandas)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+次のコードは何を表示しますか?
+
+```py
+import pandas as pd
+
+certificates_earned = pd.Series(
+ [8, 2, 5, 6],
+ index=['Tom', 'Kris', 'Ahmad', 'Beau']
+)
+
+print(certificates_earned)
+```
+
+## --answers--
+
+```
+Tom 8
+Kris 2
+Ahmad 5
+Beau 6
+dtype: int64
+```
+
+---
+
+```
+Kris 2
+Ahmad 5
+Beau 6
+Tom 8
+dtype: int64
+```
+
+---
+
+```
+Tom 8
+Kris 2
+Ahmad 5
+Beau 6
+Name: certificates_earned dtype: int64
+```
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/parsing-html-and-saving-data.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/parsing-html-and-saving-data.md
new file mode 100644
index 0000000000..24654c5bf9
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/parsing-html-and-saving-data.md
@@ -0,0 +1,47 @@
+---
+id: 5e9a093a74c4063ca6f7c164
+title: HTMLの解析とデータの保存
+challengeType: 11
+videoId: bJaqnTWQmb0
+bilibiliIds:
+ aid: 335522976
+ bvid: BV1RA411F7vi
+ cid: 409023170
+dashedName: parsing-html-and-saving-data
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/krishnatray/RDP-Reading-Data-with-Python-and-Pandas)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+HTML ドキュメントの解析やテーブルの抽出に使用できる `.read_html()` メソッドが含まれている Python ライブラリは何ですか?
+
+## --answers--
+
+BeautifierSoupy
+
+---
+
+WebReader
+
+---
+
+HTTP-master
+
+---
+
+Pandas
+
+## --video-solution--
+
+4
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/python-functions-and-collections.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/python-functions-and-collections.md
new file mode 100644
index 0000000000..3324a47390
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/python-functions-and-collections.md
@@ -0,0 +1,43 @@
+---
+id: 5e9a093a74c4063ca6f7c166
+title: Python の関数とコレクション
+challengeType: 11
+videoId: NzpU17ZVlUw
+bilibiliIds:
+ aid: 675544435
+ bvid: BV1pU4y1N7JC
+ cid: 409023833
+dashedName: python-functions-and-collections
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/ds-content-python-under-10-minutes)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+Python のリストとタプルの主な違いは何ですか?
+
+## --answers--
+
+タプルはイミュータブル (変更不可) である。
+
+---
+
+リストは順序付けられている。
+
+---
+
+タプルは順序付けられていない。
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/python-introduction.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/python-introduction.md
new file mode 100644
index 0000000000..b45fe70ea7
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/python-introduction.md
@@ -0,0 +1,47 @@
+---
+id: 5e9a093a74c4063ca6f7c165
+title: Python 入門
+challengeType: 11
+videoId: PrQV9JkLhb4
+bilibiliIds:
+ aid: 805597530
+ bvid: BV1634y1S7gD
+ cid: 409023550
+dashedName: python-introduction
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/ds-content-python-under-10-minutes)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+Python の関数の本体でコードブロックを定義するにはどうすればよいですか?
+
+## --answers--
+
+新しいコードブロックごとに、それぞれの両端で中括弧を使用する。
+
+---
+
+インデントを使用する (通常は右揃えの 4 つのスペース)。
+
+---
+
+コードブロックを明記しない。
+
+---
+
+中括弧やインデントを使用してコードブロックを明記することができる。
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/python-iteration-and-modules.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/python-iteration-and-modules.md
new file mode 100644
index 0000000000..a0a4d90f4a
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/python-iteration-and-modules.md
@@ -0,0 +1,60 @@
+---
+id: 5e9a093a74c4063ca6f7c167
+title: Python の繰り返し処理とモジュール
+challengeType: 11
+videoId: XzosGWLafrY
+bilibiliIds:
+ aid: 633068913
+ bvid: BV1db4y127M4
+ cid: 409024056
+dashedName: python-iteration-and-modules
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/ine-rmotr-curriculum/ds-content-python-under-10-minutes)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+`user` という名前の辞書のキーと値を繰り返し処理して表示するにはどうすればよいですか?
+
+## --answers--
+
+```python
+for key in user.items():
+ print(key)
+```
+
+---
+
+```python
+for key, value in user.all():
+ print(key, value)
+ print(value)
+```
+
+---
+
+```python
+for key, value in user.items():
+ print(key, value)
+```
+
+---
+
+```python
+for key, value in user
+ print(key, value)
+```
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-csv-and-txt.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-csv-and-txt.md
new file mode 100644
index 0000000000..cc272ab96e
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-csv-and-txt.md
@@ -0,0 +1,59 @@
+---
+id: 5e9a093a74c4063ca6f7c162
+title: CSV や TXT のデータの読み取り
+challengeType: 11
+videoId: ViGEv0zOzUk
+bilibiliIds:
+ aid: 505575354
+ bvid: BV1tg411c7GH
+ cid: 409020451
+dashedName: reading-data-csv-and-txt
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/krishnatray/RDP-Reading-Data-with-Python-and-Pandas)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+Pandas モジュールを使用して CSV ファイル `data.csv` をインポートし、DataFrame に格納するにはどうすればよいですか?
+
+## --answers--
+
+```python
+import pandas as pd
+df = pd.csv("data.csv")
+```
+
+---
+
+```python
+import pandas as pd
+df = pd.read_csv("data.csv")
+```
+
+---
+
+```python
+import pandas as pd
+pd.read_csv("data.csv")
+```
+
+---
+
+```python
+import pandas as pd
+df = pd.csv_reader("data.csv")
+```
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-from-databases.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-from-databases.md
new file mode 100644
index 0000000000..bc976e8f7c
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-from-databases.md
@@ -0,0 +1,43 @@
+---
+id: 5e9a093a74c4063ca6f7c163
+title: データベースからのデータの読み取り
+challengeType: 11
+videoId: MtgXS1MofRw
+bilibiliIds:
+ aid: 890546354
+ bvid: BV1JP4y1h7gk
+ cid: 409020851
+dashedName: reading-data-from-databases
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/krishnatray/RDP-Reading-Data-with-Python-and-Pandas)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+`Cursor` インスタンスにはどのようなメソッドがあり、何を実行できますか?
+
+## --answers--
+
+`Cursor` インスタンスには、SQL クエリを実行するための `.run()` メソッドがある。
+
+---
+
+`Cursor` インスタンスには、レコードを選択するための `.select()` メソッドがある。
+
+---
+
+`Cursor` インスタンスには、データベースに対して実行する SQL パラメーターを受け取る `.execute()` メソッドがある。
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-introduction.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-introduction.md
new file mode 100644
index 0000000000..8c67dba527
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-introduction.md
@@ -0,0 +1,76 @@
+---
+id: 5e9a093a74c4063ca6f7c161
+title: データの読み取り入門
+challengeType: 11
+videoId: cDnt02BcHng
+bilibiliIds:
+ aid: 548023524
+ bvid: BV1Nq4y1K7iV
+ cid: 409020187
+dashedName: reading-data-introduction
+---
+
+# --description--
+
+*動画で説明しているように、notebooks.ai を使用する代わりに Google Colab を使用することができます。*
+
+その他のリソース:
+
+- [GitHub のノート](https://github.com/krishnatray/RDP-Reading-Data-with-Python-and-Pandas)
+- [Google Colab を使用して GitHub からノートを開く方法](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb)
+
+# --question--
+
+## --text--
+
+次の内容を含む `certificates.csv` という名前のファイルが与えられます。
+
+
+Name$Certificates$Time (in months)
+Tom$8$16
+Kris$2$5
+Ahmad$5$9
+Beau$6$12
+
+
+次のコードで、不足している引数部分の空欄を埋めてください。
+
+```py
+import csv
+
+with open(__A__, 'r') as fp:
+ reader = csv.reader(fp, delimiter=__B__)
+ next(reader)
+ for index, values in enumerate(reader):
+ name, certs_num, months_num = values
+ print(f"{name} earned {__C__} certificates in {months_num} months")
+```
+
+## --answers--
+
+A: `'certificates.csv'`
+
+B: `'-'`
+
+C: `values`
+
+---
+
+A: `'certificates.csv'`
+
+B: `'$'`
+
+C: `certs_num`
+
+---
+
+A: `'certificates'`
+
+B: `'$'`
+
+C: `certs_num`
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-projects/demographic-data-analyzer.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-projects/demographic-data-analyzer.md
new file mode 100644
index 0000000000..f969e7bab2
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-projects/demographic-data-analyzer.md
@@ -0,0 +1,78 @@
+---
+id: 5e46f7e5ac417301a38fb929
+title: 人口統計データ分析プログラム
+challengeType: 10
+forumTopicId: 462367
+dashedName: demographic-data-analyzer
+---
+
+# --description--
+
+このプロジェクトは [Replit スターターコード](https://replit.com/github/freeCodeCamp/boilerplate-demographic-data-analyzer)を使用して作業を行います。
+
+Python カリキュラムの対話式教育コンテンツを引き続き開発中です。 現在、下記の freeCodeCamp.org YouTube チャンネルで、このプロジェクトの完了に必要なすべての知識について説明する動画をいくつか公開しています。
+
+- [「みんなで Python」ビデオコース](https://www.freecodecamp.org/news/python-for-everybody/) (14 時間)
+- [「Python を学ぶ」ビデオコース](https://www.freecodecamp.org/news/learn-python-video-course/) (10 時間)
+
+# --instructions--
+
+このチャレンジでは、Pandas を使用して人口統計データを分析します。 1994 年の国勢調査データベースから抽出された人口統計データのデータセットが与えられます。 データの例を次に示します。
+
+```markdown
+| | age | workclass | fnlwgt | education | education-num | marital-status | occupation | relationship | race | sex | capital-gain | capital-loss | hours-per-week | native-country | salary |
+|---:|------:|:-----------------|---------:|:------------|----------------:|:-------------------|:------------------|:---------------|:-------|:-------|---------------:|---------------:|-----------------:|:-----------------|:---------|
+| 0 | 39 | State-gov | 77516 | Bachelors | 13 | Never-married | Adm-clerical | Not-in-family | White | Male | 2174 | 0 | 40 | United-States | <=50K |
+| 1 | 50 | Self-emp-not-inc | 83311 | Bachelors | 13 | Married-civ-spouse | Exec-managerial | Husband | White | Male | 0 | 0 | 13 | United-States | <=50K |
+| 2 | 38 | Private | 215646 | HS-grad | 9 | Divorced | Handlers-cleaners | Not-in-family | White | Male | 0 | 0 | 40 | United-States | <=50K |
+| 3 | 53 | Private | 234721 | 11th | 7 | Married-civ-spouse | Handlers-cleaners | Husband | Black | Male | 0 | 0 | 40 | United-States | <=50K |
+| 4 | 28 | Private | 338409 | Bachelors | 13 | Married-civ-spouse | Prof-specialty | Wife | Black | Female | 0 | 0 | 40 | Cuba | <=50K |
+```
+
+Pandas を使用して次の問いに答える必要があります。
+
+- このデータセットで表現される各人種の人数は何人ですか? これは、人種名をインデックスラベル (`race` 列) に持つ Pandas のシリーズとして表現する必要があります。
+- 男性の平均年齢は何歳ですか?
+- 学士号を取得した人の割合は何パーセントですか?
+- 高等教育 (`Bachelors` (学士)、`Masters` (修士)、または `Doctorate` (博士)) を受けた人のうち給料が 50K を超えているのは何パーセントですか?
+- 高等教育を受けていない人のうち給料が 50K を超えているのは何パーセントですか?
+- 1 週間の最小労働時間は何時間ですか?
+- 1 週間の最小労働時間だけ働いている人のうち給料が 50K を超えているのは何パーセントですか?
+- 50K 超を稼いでいる人の割合が最も高い国はどこですか?その割合は何パーセントですか?
+- インドで 50K 超を稼いでいる人に最も人気のある職業を特定してください。
+
+ファイル `demographic_data_analyzer` のスターターコードを使用してください。 "None" に設定されているすべての変数が適切な計算またはコードに設定されるように、コードを更新してください。 小数はすべて最も近い小数点以下 1 桁に丸めてください。
+
+`test_module.py` の下に単体テストが記述してあります。
+
+## 開発
+
+開発には `main.py` を使用して関数をテストすることができます。 「実行」ボタンをクリックすると `main.py` が実行されます。
+
+## テスト
+
+すでに `test_module.py` から `main.py` にテストをインポートしてあります。 「実行」ボタンを押すと自動的にテストが実行されます。
+
+## 提出
+
+プロジェクトの URL をコピーし、freeCodeCamp に提出してください。
+
+## データセットのソース
+
+Dua, D. and Graff, C. (2019). [UCI Machine Learning Repository](http://archive.ics.uci.edu/ml). Irvine, CA: University of California, School of Information and Computer Science.
+
+# --hints--
+
+すべての Python テストに合格する必要があります。
+
+```js
+
+```
+
+# --solutions--
+
+```py
+ # Python challenges don't need solutions,
+ # because they would need to be tested against a full working project.
+ # Please check our contributing guidelines to learn more.
+```
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-projects/mean-variance-standard-deviation-calculator.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-projects/mean-variance-standard-deviation-calculator.md
new file mode 100644
index 0000000000..4f531aac1a
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-projects/mean-variance-standard-deviation-calculator.md
@@ -0,0 +1,80 @@
+---
+id: 5e46f7e5ac417301a38fb928
+title: 平均・分散・標準偏差計算プログラム
+challengeType: 10
+forumTopicId: 462366
+dashedName: mean-variance-standard-deviation-calculator
+---
+
+# --description--
+
+このプロジェクトは [Replit スターターコード](https://replit.com/github/freeCodeCamp/boilerplate-mean-variance-standard-deviation-calculator)を使用して作業を行います。
+
+Python カリキュラムの対話式教育コンテンツを引き続き開発中です。 現在、下記の freeCodeCamp.org YouTube チャンネルで、このプロジェクトの完了に必要なすべての知識について説明する動画をいくつか公開しています。
+
+- [「みんなで Python」ビデオコース](https://www.freecodecamp.org/news/python-for-everybody/) (14 時間)
+- [「Python を学ぶ」ビデオコース](https://www.freecodecamp.org/news/learn-python-video-course/) (10 時間)
+
+# --instructions--
+
+`mean_var_std.py` に `calculate()` という名前の関数を作成してください。この関数は Numpy を使用して、3 x 3 行列の行、列、要素について平均、分散、標準偏差、最大値、最小値、合計を出力します。
+
+関数には 9 つの数字からなるリストを入力する必要があります。 関数は、リストを 3 x 3 の Numpy 配列に変換した後、平均、分散、標準偏差、最大値、最小値、合計を含む辞書を返す必要があり、両方の軸と平坦化された行列も返す必要があります。
+
+返される辞書は次の形式に従う必要があります。
+
+```py
+{
+ 'mean': [axis1, axis2, flattened],
+ 'variance': [axis1, axis2, flattened],
+ 'standard deviation': [axis1, axis2, flattened],
+ 'max': [axis1, axis2, flattened],
+ 'min': [axis1, axis2, flattened],
+ 'sum': [axis1, axis2, flattened]
+}
+```
+
+渡されたリストの要素が 9 つに満たない場合、関数は `ValueError` 例外を生成して、"List must contain nine numbers." (リストには 9 つの数値を含めてください。) というメッセージを表示する必要があります。 返される辞書の値は、Numpy 配列ではなくリストである必要があります。
+
+たとえば、`calculate([0,1,2,3,4,5,6,7,8])` は次を返す必要があります。
+
+```py
+{
+ 'mean': [[3.0, 4.0, 5.0], [1.0, 4.0, 7.0], 4.0],
+ 'variance': [[6.0, 6.0, 6.0], [0.6666666666666666, 0.6666666666666666, 0.6666666666666666], 6.666666666666667],
+ 'standard deviation': [[2.449489742783178, 2.449489742783178, 2.449489742783178], [0.816496580927726, 0.816496580927726, 0.816496580927726], 2.581988897471611],
+ 'max': [[6, 7, 8], [2, 5, 8], 8],
+ 'min': [[0, 1, 2], [0, 3, 6], 0],
+ 'sum': [[9, 12, 15], [3, 12, 21], 36]
+}
+```
+
+このプロジェクトの単体テストは `test_module.py` にあります。
+
+## 開発
+
+開発には `main.py` を使用して `calculate()` 関数をテストすることができます。 「実行」ボタンをクリックすると `main.py` が実行されます。
+
+## テスト
+
+すでに `test_module.py` から `main.py` にテストをインポートしてあります。 「実行」ボタンを押すと自動的にテストが実行されます。
+
+## 提出
+
+プロジェクトの URL をコピーし、freeCodeCamp に提出してください。
+
+# --hints--
+
+すべての Python テストに合格する必要があります。
+
+```js
+
+```
+
+# --solutions--
+
+```py
+ # Python challenges don't need solutions,
+ # because they would need to be tested against a full working project.
+ # Please check our contributing guidelines to learn more.
+```
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-projects/medical-data-visualizer.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-projects/medical-data-visualizer.md
new file mode 100644
index 0000000000..badd75c960
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-projects/medical-data-visualizer.md
@@ -0,0 +1,90 @@
+---
+id: 5e46f7f8ac417301a38fb92a
+title: 医療データの可視化プログラム
+challengeType: 10
+forumTopicId: 462368
+dashedName: medical-data-visualizer
+---
+
+# --description--
+
+このプロジェクトは [Replit スターターコード](https://replit.com/github/freeCodeCamp/boilerplate-medical-data-visualizer)を使用して作業を行います。
+
+Python カリキュラムの対話式教育コンテンツを引き続き開発中です。 現在、下記の freeCodeCamp.org YouTube チャンネルで、このプロジェクトの完了に必要なすべての知識について説明する動画をいくつか公開しています。
+
+- [「みんなで Python」ビデオコース](https://www.freecodecamp.org/news/python-for-everybody/) (14 時間)
+- [「Python を学ぶ」ビデオコース](https://www.freecodecamp.org/news/learn-python-video-course/) (10 時間)
+
+# --instructions--
+
+このプロジェクトでは、Matplotlib、Seaborn、Pandas を使用して診察データを可視化し、計算を行います。 データセットの値は診察時に収集されたものです。
+
+## データの説明
+
+データセットの行は患者を表し、列は身体の測定値、さまざまな血液検査の結果、生活習慣の選択などの情報を表します。 このデータセットを使用して、心臓疾患、身体測定値、血液指標値、生活習慣の選択について、それらの間の関係を調べます。
+
+ファイル名: medical_examination.csv
+
+| 特徴 | 変数のタイプ | 変数 | 値のタイプ |
+|:--------------------------------------------------------:|:------:|:-----------:|:------------------------------:|
+| Age (年齢) | 客観的特徴 | age | int (日数) |
+| Height (身長) | 客観的特徴 | height | int (cm) |
+| Weight (体重) | 客観的特徴 | weight | float (kg) |
+| Gender (性別) | 客観的特徴 | gender | カテゴリコード |
+| Systolic blood pressure (最高血圧) | 検査の特徴 | ap_hi | int |
+| Diastolic blood pressure (最低血圧) | 検査の特徴 | ap_lo | int |
+| Cholesterol (コレステロール値) | 検査の特徴 | cholesterol | 1: 正常値、2: 正常値より高い、3: 正常値を優に超える |
+| Glucose (血糖値) | 検査の特徴 | gluc | 1: 正常値、2: 正常値より高い、3: 正常値を優に超える |
+| Smoking (喫煙) | 主観的特徴 | smoke | binary |
+| Alcohol intake (アルコール摂取) | 主観的特徴 | alco | binary |
+| Physical activity (身体活動状況) | 主観的特徴 | active | binary |
+| Presence or absence of cardiovascular disease (心血管疾患の有無) | 目的の変数 | cardio | binary |
+
+## タスク
+
+`examples/Figure_1.png` のようなグラフを作成してください。この例では、患者の `cholesterol`、`gluc`、`alco`、`active`、`smoke` について良い結果と悪い結果の数を示し、cardio=1 の場合と cardio=0 の場合を別々のパネルに表示しています。
+
+`medical_data_visualizer.py` で、データを使用して次のタスクを完了してください。
+
+- データに `overweight` 列を追加します。 太りすぎかどうかを判断するには、まず、体重 (キログラム単位) を身長 (メートル単位) の 2 乗で割って BMI (ボディマス指数) を計算します。 その値が 25 より大きい場合、その人は太りすぎです。 太りすぎではない場合は値 0 を使用し、太りすぎの場合は値 1 を使用します。
+- 0 を常に良とし、1 を常に悪としてデータを正規化します。 `cholesterol` または `gluc` の値が 1 の場合は、この値を 0 にします。 値が 1 より大きい場合は、値を 1 とします。
+- データを長い形式に変換し、seabornの `catplot()` を使用して、カテゴリ特徴の値の数を示すグラフを作成します。 データセットは 'Cardio' 別に分割し、`cardio` の値ごとに 1 つずつグラフを作成します。 `examples/Figure_1.png` のようなグラフを表示する必要があります。
+- データをクリーニングします。 正しくないデータを表す次の患者セグメントを除外します。
+ - 最低血圧が最高血圧よりも高い (`(df['ap_lo'] <= df['ap_hi'])`) で正しいデータを維持)
+ - 身長が 2.5 パーセンタイルを下回る (`(df['height'] >= df['height'].quantile(0.025))` で正しいデータを維持)
+ - 身長が 97.5 パーセンタイルを上回る
+ - 体重が 2.5 パーセンタイルを下回る
+ - 体重が 97.5 パーセンタイルを上回る
+- データセットを使用して相関行列を作成します。 seabornの `heatmap()` を使用して相関行列をプロットします。 上側の三角形をマスク処理します。 `examples/Figure_2.png` のようなグラフを表示する必要があります。
+
+変数が `None`に設定された場合は、必ず正しいコードに設定してください。
+
+`test_module.py` の下に単体テストが記述してあります。
+
+## 開発
+
+開発には `main.py` を使用して関数をテストすることができます。 「実行」ボタンをクリックすると `main.py` が実行されます。
+
+## テスト
+
+すでに `test_module.py` から `main.py` にテストをインポートしてあります。 「実行」ボタンを押すと自動的にテストが実行されます。
+
+## 提出
+
+プロジェクトの URL をコピーし、freeCodeCamp に提出してください。
+
+# --hints--
+
+すべての Python テストに合格する必要があります。
+
+```js
+
+```
+
+# --solutions--
+
+```py
+ # Python challenges don't need solutions,
+ # because they would need to be tested against a full working project.
+ # Please check our contributing guidelines to learn more.
+```
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-projects/page-view-time-series-visualizer.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-projects/page-view-time-series-visualizer.md
new file mode 100644
index 0000000000..0649cd9582
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-projects/page-view-time-series-visualizer.md
@@ -0,0 +1,60 @@
+---
+id: 5e46f802ac417301a38fb92b
+title: ページビュー時系列の可視化プログラム
+challengeType: 10
+forumTopicId: 462369
+dashedName: page-view-time-series-visualizer
+---
+
+# --description--
+
+このプロジェクトは [Replit スターターコード](https://replit.com/github/freeCodeCamp/boilerplate-page-view-time-series-visualizer)を使用して作業を行います。
+
+Python カリキュラムの対話式教育コンテンツを引き続き開発中です。 現在、下記の freeCodeCamp.org YouTube チャンネルで、このプロジェクトの完了に必要なすべての知識について説明する動画をいくつか公開しています。
+
+- [「みんなで Python」ビデオコース](https://www.freecodecamp.org/news/python-for-everybody/) (14 時間)
+- [「Python を学ぶ」ビデオコース](https://www.freecodecamp.org/news/learn-python-video-course/) (10 時間)
+
+# --instructions--
+
+このプロジェクトでは、折れ線グラフ、棒グラフ、ボックスプロットを使用して時系列データを可視化します。 Pandas、Matplotlib、Seabornを使用して、2016 年 5 月 9 日から 2019 年 12 月 3 日までの各日に freeCodeCamp.org フォーラムで発生したページビュー数を含むデータセットを視覚化します。 データを可視化することで、アクセスのパターンを把握し、年ごとおよび月ごとの増加を明らかにすることができます。
+
+データを使用して、次のタスクを完了してください。
+
+- Pandas を使用して "fcc-forum-pageviews.csv" からデータをインポートします。 インデックスとして "date" 列を設定します。
+- データをクリーニングするため、ページビュー数がデータセットの上位 2.5% または下位 2.5% となった日を除外します。
+- `draw_line_plot` 関数を作成します。この関数は、Matplotlib を使用して "examples/Figure_1.png" に示すような折れ線グラフを描きます。 タイトルは "Daily freeCodeCamp Forum Page Views 5/2016-12/2019" とします。 x 軸のラベルを "Date"、y 軸のラベルを "Page Views" とします。
+- `draw_bar_plot` 関数を作成します。この関数は "examples/Figure_2.png" に示すような棒グラフを描きます。 月ごとの 1 日の平均ページビュー数を表示し、年ごとにグループ化する必要があります。 凡例には月のラベルを表示し、タイトルを "Months" とします。 グラフの x 軸のラベルを "Years"、y 軸のラベルを "Average Page Views" とします。
+- `draw_box_plot` 関数を作成します。この関数は、Searborn を使用して "examples/Figure_3.png" に示すような 2 つの隣接するボックスプロットを描きます。 これらのボックスプロットでは、特定の年または月の中で値がどのように分布しているかを示し、経時的に比較できるようにする必要があります。 最初のグラフのタイトルを "Year-wise Box Plot (Trend)"、2 つ目のグラフのタイトルを "Month-wise Box Plot (Seasonality)" とします。 一番下の月ラベルの始まりを "Jan" とし、x および x 軸のラベルを正しく設定する必要があります。 ボイラープレートには、データを準備するコマンドが含まれています。
+
+グラフごとに、必ずデータフレームのコピーを使用してください。 `test_module.py` の下に単体テストが記述してあります。
+
+このボイラープレートには、画像を保存して返すコマンドも含まれています。
+
+## 開発
+
+開発には `main.py` を使用して関数をテストすることができます。 「実行」ボタンをクリックすると `main.py` が実行されます。
+
+## テスト
+
+すでに `test_module.py` から `main.py` にテストをインポートしてあります。 「実行」ボタンを押すと自動的にテストが実行されます。
+
+## 提出
+
+プロジェクトの URL をコピーし、freeCodeCamp に提出してください。
+
+# --hints--
+
+すべての Python テストに合格する必要があります。
+
+```js
+
+```
+
+# --solutions--
+
+```py
+ # Python challenges don't need solutions,
+ # because they would need to be tested against a full working project.
+ # Please check our contributing guidelines to learn more.
+```
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-projects/sea-level-predictor.md b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-projects/sea-level-predictor.md
new file mode 100644
index 0000000000..4757e3aa2b
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/data-analysis-with-python-projects/sea-level-predictor.md
@@ -0,0 +1,64 @@
+---
+id: 5e4f5c4b570f7e3a4949899f
+title: 海面水位の予測プログラム
+challengeType: 10
+forumTopicId: 462370
+dashedName: sea-level-predictor
+---
+
+# --description--
+
+このプロジェクトは [Replit スターターコード](https://replit.com/github/freeCodeCamp/boilerplate-sea-level-predictor)を使用して作業を行います。
+
+Python カリキュラムの対話式教育コンテンツを引き続き開発中です。 現在、下記の freeCodeCamp.org YouTube チャンネルで、このプロジェクトの完了に必要なすべての知識について説明する動画をいくつか公開しています。
+
+- [「みんなで Python」ビデオコース](https://www.freecodecamp.org/news/python-for-everybody/) (14 時間)
+- [「Python を学ぶ」ビデオコース](https://www.freecodecamp.org/news/learn-python-video-course/) (10 時間)
+
+# --instructions--
+
+1880 年以降の世界的な平均海面変化のデータセットを分析します。 データを使用して、2050 年までの海面の変化を予測します。
+
+データを使用して、次のタスクを完了してください。
+
+- Pandas を使用して `epa-sea-level.csv` からデータをインポートします。
+- matplotlib を使用し、x 軸として "Year" 列、y 軸として "CSIRO Adjusted Sea Level" 列を使用する散布図を作成します。
+- `scipy.stats` の `linregress` 関数を使用して、最も良く当てはまる線の傾きと y 切片を得ます。 散布図の上に最良の当てはめ線 (回帰直線) を描きます。 線を 2050 年まで伸ばし、2050 年の海面上昇を予測します。
+- データセットにある 2000 年から最新年までのデータを使用し、新しい最良の当てはめ線をプロットします。 線を 2050 年まで伸ばし、2000 年以降の上昇率が続くと仮定した場合の 2050 年の海面上昇を予測します。
+- x のラベルを "Year"、y のラベルを "Sea Level (inches)" とし、タイトルを "Rise in Sea Level" とします。
+
+`test_module.py` の下に単体テストが記述してあります。
+
+このボイラープレートには、画像を保存して返すコマンドも含まれています。
+
+## 開発
+
+開発には `main.py` を使用して関数をテストすることができます。 「実行」ボタンをクリックすると `main.py` が実行されます。
+
+## テスト
+
+すでに `test_module.py` から `main.py` にテストをインポートしてあります。 「実行」ボタンを押すと自動的にテストが実行されます。
+
+## 提出
+
+プロジェクトの URL をコピーし、freeCodeCamp に提出してください。
+
+## データのソース
+[世界的な海面絶対高の変化](https://datahub.io/core/sea-level-rise)、1880 ~ 2014年、米国環境保護庁提供。CSIRO (2015 年)、NOAA (2015 年) のデータを使用。
+
+
+# --hints--
+
+すべての Python テストに合格する必要があります。
+
+```js
+
+```
+
+# --solutions--
+
+```py
+ # Python challenges don't need solutions,
+ # because they would need to be tested against a full working project.
+ # Please check our contributing guidelines to learn more.
+```
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/accessing-and-changing-elements,-rows,-columns.md b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/accessing-and-changing-elements,-rows,-columns.md
new file mode 100644
index 0000000000..add45f1267
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/accessing-and-changing-elements,-rows,-columns.md
@@ -0,0 +1,54 @@
+---
+id: 5e9a0a8e09c5df3cc3600ed4
+title: '要素、行、列へのアクセスと変更'
+challengeType: 11
+videoId: v-7Y7koJ_N0
+bilibiliIds:
+ aid: 590517748
+ bvid: BV1Eq4y1f7Fa
+ cid: 409025392
+dashedName: accessing-and-changing-elements-rows-columns
+---
+
+# --question--
+
+## --text--
+
+次の両方の Numpy 配列について 3 列目の値を 20 に変更するコードはどれですか?
+
+```py
+a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
+
+# Output:
+# [[ 1 2 20 4 5]
+# [ 6 7 20 9 10]]
+```
+
+## --answers--
+
+```python
+a[:, 3] = 20
+```
+
+---
+
+```python
+a[2, :] = 20
+```
+
+---
+
+```python
+a[:, 2] = 20
+```
+
+---
+
+```python
+a[1, 2] = 20
+```
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/basics-of-numpy.md b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/basics-of-numpy.md
new file mode 100644
index 0000000000..8e44f3a169
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/basics-of-numpy.md
@@ -0,0 +1,49 @@
+---
+id: 5e9a0a8e09c5df3cc3600ed3
+title: Numpy の基本
+challengeType: 11
+videoId: f9QrZrKQMLI
+bilibiliIds:
+ aid: 763014202
+ bvid: BV1K64y1a7bu
+ cid: 409025169
+dashedName: basics-of-numpy
+---
+
+# --question--
+
+## --text--
+
+次のコードは何を表示しますか?
+
+```python
+b = np.array([[1.0,2.0,3.0],[3.0,4.0,5.0]])
+print(b)
+```
+
+## --answers--
+
+```python
+[[1.0 2.0 3.0]
+[3.0 4.0 5.0]]
+```
+
+---
+
+```python
+[[1. 2. 3.]
+[3. 4. 5.]]
+```
+
+---
+
+```python
+[[1. 3.]
+[2. 4.]
+[3. 5.]
+```
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/copying-arrays-warning.md b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/copying-arrays-warning.md
new file mode 100644
index 0000000000..3e715021a1
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/copying-arrays-warning.md
@@ -0,0 +1,48 @@
+---
+id: 5e9a0a8e09c5df3cc3600ed7
+title: 配列のコピーに関する注意
+challengeType: 11
+videoId: iIoQ0_L0GvA
+bilibiliIds:
+ aid: 633008569
+ bvid: BV1Bb4y127fb
+ cid: 409026161
+dashedName: copying-arrays-warning
+---
+
+# --question--
+
+## --text--
+
+次のコードを実行した後、`a` の値は何になりますか?
+
+```py
+import numpy as np
+
+a = np.array([1, 2, 3, 4, 5])
+b = a
+b[2] = 20
+```
+
+## --answers--
+
+```python
+[1 2 3 4 5]
+```
+
+---
+
+```python
+[1 2 20 4 5]
+```
+
+---
+
+```python
+[1 20 3 4 5]
+```
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/initialize-array-problem.md b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/initialize-array-problem.md
new file mode 100644
index 0000000000..1bde25a7bf
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/initialize-array-problem.md
@@ -0,0 +1,65 @@
+---
+id: 5e9a0a8e09c5df3cc3600ed6
+title: 配列の初期化の問題
+challengeType: 11
+videoId: 0jGfH8BPfOk
+bilibiliIds:
+ aid: 763027834
+ bvid: BV1w64y1a7eo
+ cid: 409025878
+dashedName: initialize-array-problem
+---
+
+# --question--
+
+## --text--
+
+次のような配列を生成する別の方法は何ですか?
+
+```py
+[[0. 0. 0. 0. 0. 0. 0.]
+[0. 1. 1. 1. 1. 1. 0.]
+[0. 1. 1. 1. 1. 1. 0.]
+[0. 1. 1. 5. 1. 1. 0.]
+[0. 1. 1. 1. 1. 1. 0.]
+[0. 1. 1. 1. 1. 1. 0.]
+[0. 0. 0. 0. 0. 0. 0.]]
+```
+
+## --answers--
+
+```py
+output = np.ones((7, 7))
+
+z = np.zeros((5, 5))
+z[2, 2] = 5
+
+output[1:1, -1:-1] = z
+```
+
+---
+
+```py
+output = np.zeros((7,7))
+
+z = np.ones((5, 5))
+z[2, 2] = 5
+
+output[1:-1, 1:-1] = z
+```
+
+---
+
+```py
+output = np.ones((7, 7))
+
+z = np.zeros((5, 5))
+z[3, 3] = 5
+
+output[1:-1, 1:-1] = z
+```
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/initializing-different-arrays.md b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/initializing-different-arrays.md
new file mode 100644
index 0000000000..bdc75e818f
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/initializing-different-arrays.md
@@ -0,0 +1,48 @@
+---
+id: 5e9a0a8e09c5df3cc3600ed5
+title: 異なる配列の初期化
+challengeType: 11
+videoId: CEykdsKT4U4
+bilibiliIds:
+ aid: 718044756
+ bvid: BV1MQ4y1k7BB
+ cid: 409025638
+dashedName: initializing-different-arrays
+---
+
+# --question--
+
+## --text--
+
+次のコードは何を表示しますか?
+
+```py
+a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
+
+print(np.full_like(a, 100))
+```
+
+## --answers--
+
+```py
+[[100 100 100 100 100]]
+```
+
+---
+
+```py
+[[100 100 100 100 100]
+[100 100 100 100 100]]
+```
+
+---
+
+```py
+[[ 1 2 3 4 5]
+[ 6 7 20 9 10]]
+```
+
+## --video-solution--
+
+2
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/loading-data-and-advanced-indexing.md b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/loading-data-and-advanced-indexing.md
new file mode 100644
index 0000000000..41c626bd03
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/loading-data-and-advanced-indexing.md
@@ -0,0 +1,60 @@
+---
+id: 5e9a0a8e09c5df3cc3600eda
+title: データの読み込みと高度なインデックス作成
+challengeType: 11
+videoId: tUdBZ7pF8Jg
+bilibiliIds:
+ aid: 720524642
+ bvid: BV1xQ4y1r7mu
+ cid: 409027117
+dashedName: loading-data-and-advanced-indexing
+---
+
+# --question--
+
+## --text--
+
+次の内容を含む `data.txt` という名前のファイルが与えられます。
+
+
+29,97,32,100,45
+15,88,5,75,22
+
+
+次の配列を生成するコードはどれですか?
+
+```py
+[29. 32. 45. 15. 5. 22.]
+```
+
+## --answers--
+
+```py
+filedata = np.genfromtxt('data.txt', delimiter=',')
+output = np.any(filedata < 50)
+
+print(output)
+```
+
+---
+
+```py
+filedata = np.genfromtxt('data.txt', delimiter=',')
+output = np.all(filedata < 50, axis=1)
+
+print(output)
+```
+
+---
+
+```py
+filedata = np.genfromtxt('data.txt', delimiter=',')
+output = filedata[filedata < 50]
+
+print(output)
+```
+
+## --video-solution--
+
+3
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/mathematics.md b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/mathematics.md
new file mode 100644
index 0000000000..af7bf506c0
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/mathematics.md
@@ -0,0 +1,53 @@
+---
+id: 5e9a0a8e09c5df3cc3600ed8
+title: 算術演算
+challengeType: 11
+videoId: 7txegvyhtVk
+bilibiliIds:
+ aid: 890533226
+ bvid: BV1KP4y1h733
+ cid: 409026503
+dashedName: mathematics
+---
+
+# --question--
+
+## --text--
+
+次のコードを実行した後、`b` の値は何になりますか?
+
+```py
+import numpy as np
+
+a = np.array(([1, 2, 3, 4, 5], [6, 7, 8, 9, 10]))
+b = np.max(a, axis=1).sum()
+```
+
+## --answers--
+
+```py
+10
+```
+
+---
+
+```py
+7
+```
+
+---
+
+```py
+5
+```
+
+---
+
+```py
+15
+```
+
+## --video-solution--
+
+4
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/reorganizing-arrays.md b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/reorganizing-arrays.md
new file mode 100644
index 0000000000..928792c6a7
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/reorganizing-arrays.md
@@ -0,0 +1,53 @@
+---
+id: 5e9a0a8e09c5df3cc3600ed9
+title: 配列の再編成
+challengeType: 11
+videoId: VNWAQbEM-C8
+bilibiliIds:
+ aid: 548035655
+ bvid: BV1fq4y1N7aC
+ cid: 409026755
+dashedName: reorganizing-arrays
+---
+
+# --question--
+
+## --text--
+
+次の配列を生成するコードはどれですか?
+
+```py
+[[1. 1.]
+[1. 1.]
+[1. 1.]
+[1. 1.]]
+```
+
+## --answers--
+
+```py
+a = np.ones((2, 4))
+b = a.reshape((4, 2))
+print(b)
+```
+
+---
+
+```py
+a = np.ones((2, 4))
+b = a.reshape((2, 4))
+print(b)
+```
+
+---
+
+```py
+a = np.ones((2, 4))
+b = a.reshape((8, 1))
+print(b)
+```
+
+## --video-solution--
+
+1
+
diff --git a/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/what-is-numpy.md b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/what-is-numpy.md
new file mode 100644
index 0000000000..2db25d2440
--- /dev/null
+++ b/curriculum/challenges/japanese/08-data-analysis-with-python/numpy/what-is-numpy.md
@@ -0,0 +1,38 @@
+---
+id: 5e9a0a8e09c5df3cc3600ed2
+title: Numpy とは
+challengeType: 11
+videoId: 5Nwfs5Ej85Q
+bilibiliIds:
+ aid: 293086867
+ bvid: BV1Tf4y1E7QZ
+ cid: 409024791
+dashedName: what-is-numpy
+---
+
+# --question--
+
+## --text--
+
+Numpy の配列が通常の Python のリストよりも高速なのはなぜですか?
+
+## --answers--
+
+Numpy はオブジェクトを繰り返し処理する際に型チェックを行わないから。
+
+---
+
+Numpy は固定の型を使用するから。
+
+---
+
+Numpy は連続したメモリを使用するから。
+
+---
+
+上記のすべて。
+
+## --video-solution--
+
+4
+
diff --git a/curriculum/challenges/japanese/09-information-security/information-security-projects/anonymous-message-board.md b/curriculum/challenges/japanese/09-information-security/information-security-projects/anonymous-message-board.md
new file mode 100644
index 0000000000..ff91a9e7bf
--- /dev/null
+++ b/curriculum/challenges/japanese/09-information-security/information-security-projects/anonymous-message-board.md
@@ -0,0 +1,393 @@
+---
+id: 587d824a367417b2b2512c45
+title: 匿名メッセージボード
+challengeType: 4
+forumTopicId: 301568
+dashedName: anonymous-message-board
+---
+
+# --description--
+
+
と同様の機能を持つフルスタック JavaScript アプリを構築してください。
+
+プロジェクトに取り組むにあたり、以下の方法のうち 1 つを用いてコードを記述します。
+
+- [GitHub リポジトリ](https://github.com/freeCodeCamp/boilerplate-project-messageboard/)をクローンし、ローカル環境でプロジェクトを完了させる。
+- [Replit 始動プロジェクト](https://replit.com/github/freeCodeCamp/boilerplate-project-messageboard)を使用して、プロジェクトを完了させる。
+- 使い慣れたサイトビルダーを使用してプロジェクトを完了させる。 必ず GitHub リポジトリのすべてのファイルを取り込む。
+
+完了したら、プロジェクトの動作デモをどこか公開の場にホストしてください。 そして、`Solution Link` フィールドでデモへの URL を送信してください。 必要に応じて、`GitHub Link` フィールドでプロジェクトのソースコードへのリンクを送信してください。
+
+# --instructions--
+
+1. テストおよび DB をデータベース接続文字列 (`.env` 内) に書き込む準備ができたときに、引用符なしでテストするように `NODE_ENV` を設定します。
+2. `routes/api.js` でコントローラー/ハンドラーを作成し、ルーティングを処理することを推奨します。
+3. `server.js` にセキュリティ機能を追加します。
+
+`tests/2_functional-tests.js` に次のテストを記述してください。
+
+- 新しいスレッドを作成する: `/api/threads/{board}` への POST リクエスト
+- 3 つの返信を持つ最新のスレッドを 10 個表示する: `/api/threads/{board}` への GET リクエスト
+- 間違ったパスワードでスレッドを削除する: 無効な `delete_password` による `/api/threads/{board}` への DELETE リクエスト
+- 正しいパスワードでスレッドを削除する: 有効な `delete_password` による `/api/threads/{board}` への DELETE リクエスト
+- スレッドを報告する: `/api/threads/{board}` への PUT リクエスト
+- 新しい返信を作成する: `/api/replies/{board}` への POST リクエスト
+- すべての返信を持つ単一のスレッドを表示する: `/api/replies/{board}` への GET リクエスト
+- 間違ったパスワードで返信を削除する: 無効な `delete_password` による `/api/replies/{board}` への DELETE リクエスト
+- 正しいパスワードで返信を削除する: 有効な `delete_password` による `/api/replies/{board}` への DELETE リクエスト
+- 返信を報告する: `/api/replies/{board}` への PUT リクエスト
+
+# --hints--
+
+サンプルの URL ではなく、自分で作成したプロジェクトを提供することができます。
+
+```js
+(getUserInput) => {
+ assert(
+ !/.*\/anonymous-message-board\.freecodecamp\.rocks/.test(
+ getUserInput('url')
+ )
+ );
+};
+```
+
+自分のサイトだけを自分のページの iFrame に読み込めるようにします。
+
+```js
+async (getUserInput) => {
+ const data = await fetch(getUserInput('url') + '/_api/app-info');
+ const parsed = await data.json();
+ assert.isTrue(parsed.headers['x-frame-options']?.includes('SAMEORIGIN'));
+};
+```
+
+DNS プリフェッチを許可しないでください。
+
+```js
+async (getUserInput) => {
+ const data = await fetch(getUserInput('url') + '/_api/app-info');
+ const parsed = await data.json();
+ assert.isTrue(parsed.headers['x-dns-prefetch-control']?.includes('off'));
+};
+```
+
+自分のサイトだけが、自分のページに対するリファラーを送信できるようにします。
+
+```js
+async (getUserInput) => {
+ const data = await fetch(getUserInput('url') + '/_api/app-info');
+ const parsed = await data.json();
+ assert.isTrue(parsed.headers['referrer-policy']?.includes('same-origin'));
+};
+```
+
+`text` と `delete_password` を含むフォームデータを使用して、`/api/threads/{board}` への POST リクエストを送信できます。 保存されるデータベースレコードは、少なくとも `_id`、`text`、`created_on` (日付と時刻)、`bumped_on`(日付と時刻、`created_on` と同じ時刻に開始)、`reported` (ブール値)、`delete_password`、および `replies` (配列) のフィールドを持ちます。
+
+```js
+async (getUserInput) => {
+ const date = new Date();
+ const text = `fcc_test_${date}`;
+ const deletePassword = 'delete_me';
+ const data = { text, delete_password: deletePassword };
+ const url = getUserInput('url');
+ const res = await fetch(url + '/api/threads/fcc_test', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(data)
+ });
+ if (res.ok) {
+ const checkData = await fetch(url + '/api/threads/fcc_test');
+ const parsed = await checkData.json();
+ try {
+ assert.equal(parsed[0].text, text);
+ assert.isNotNull(parsed[0]._id);
+ assert.equal(new Date(parsed[0].created_on).toDateString(), date.toDateString());
+ assert.equal(parsed[0].bumped_on, parsed[0].created_on);
+ assert.isArray(parsed[0].replies);
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+ } else {
+ throw new Error(`${res.status} ${res.statusText}`);
+ }
+};
+```
+
+`text`、`delete_password`、および `thread_id` を含むフォームデータを使用して、`/api/replies/{board}` への POST リクエストを送信できます。 これにより、`bumped_on` の日付がコメントの日付に更新されます。 スレッドの `replies` 配列には、少なくとも `_id`、`text`、`created_on`、`delete_password`、および `reported` のプロパティを持つオブジェクトが保存されます。
+
+```js
+async (getUserInput) => {
+ const url = getUserInput('url');
+ const body = await fetch(url + '/api/threads/fcc_test');
+ const thread = await body.json();
+
+ const date = new Date();
+ const text = `fcc_test_reply_${date}`;
+ const delete_password = 'delete_me';
+ const thread_id = thread[0]._id;
+ const replyCount = thread[0].replies.length;
+
+ const data = { text, delete_password, thread_id };
+ const res = await fetch(url + '/api/replies/fcc_test', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(data)
+ });
+ if (res.ok) {
+ const checkData = await fetch(`${url}/api/replies/fcc_test?thread_id=${thread_id}`);
+ const parsed = await checkData.json();
+ try {
+ assert.equal(parsed.replies.length, replyCount + 1);
+ assert.equal(parsed.replies[0].text, text);
+ assert.equal(parsed._id, thread_id);
+ assert.equal(parsed.bumped_on, parsed.replies[0].created_on);
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+ } else {
+ throw new Error(`${res.status} ${res.statusText}`);
+ }
+};
+```
+
+`/api/threads/{board}` への GET リクエストを送信できます。 掲示板で上に上げられた最新の 10 個のスレッドと、それぞれに対する最新の 3 個の返信のみの配列が返されます。 `reported` フィールドと `delete_password` フィールドはクライアントに送信されません。
+
+```js
+async (getUserInput) => {
+ const url = getUserInput('url');
+ const res = await fetch(url + '/api/threads/fcc_test');
+
+ if (res.ok) {
+ const threads = await res.json();
+ try {
+ assert.equal(res.status, 200);
+ assert.isAtMost(threads.length, 10);
+ for (let i = 0; i < threads.length; i++) {
+ assert.containsAllKeys(threads[i], ["_id", "text", "created_on", "bumped_on", "replies"]);
+ assert.isAtMost(threads[i].replies.length, 3);
+ assert.notExists(threads[i].delete_password);
+ assert.notExists(threads[i].reported);
+ for (let j = 0; j < threads[i].replies.length; j++) {
+ assert.notExists(threads[i].replies[j].delete_password);
+ assert.notExists(threads[i].replies[j].reported);
+ }
+ }
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+ } else {
+ throw new Error(`${res.status} ${res.statusText}`);
+ }
+};
+```
+
+`/api/replies/{board}?thread_id={thread_id}` への GET リクエストを送信できます。 すべての返信を含むスレッド全体のうち、前のテストと同じフィールドをクライアントから除外したものが返されます。
+
+```js
+async (getUserInput) => {
+ const url = getUserInput('url');
+ let res = await fetch(url + '/api/threads/fcc_test');
+ const threads = await res.json();
+ const thread_id = threads[0]._id;
+ res = await fetch(`${url}/api/replies/fcc_test?thread_id=${thread_id}`);
+
+ if (res.ok) {
+ const thread = await res.json();
+ try {
+ assert.equal(res.status, 200);
+ assert.isObject(thread);
+ assert.containsAllKeys(thread, ["_id", "text", "created_on", "bumped_on", "replies"]);
+ assert.isArray(thread.replies);
+ assert.notExists(thread.delete_password);
+ assert.notExists(thread.reported);
+ for (let i = 0; i < thread.replies.length; i++) {
+ assert.notExists(thread.replies[i].delete_password);
+ assert.notExists(thread.replies[i].reported);
+ }
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+ } else {
+ throw new Error(`${res.status} ${res.statusText}`);
+ }
+};
+```
+
+`/api/threads/{board}` への DELETE リクエストを送信し、スレッドを削除するために `thread_id` と `delete_password` を渡すことができます。 文字列 `incorrect password` または `success` が返されます。
+
+```js
+async (getUserInput) => {
+ const url = getUserInput('url');
+ let res = await fetch(url + '/api/threads/fcc_test');
+ const threads = await res.json();
+ const thread_id = threads[0]._id;
+ let data = { thread_id, delete_password: "wrong_password" };
+ const res_invalid = await fetch(url + '/api/threads/fcc_test', {
+ method: 'DELETE',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(data)
+ });
+ data = { thread_id, delete_password: "delete_me" };
+ res = await fetch(url + '/api/threads/fcc_test', {
+ method: 'DELETE',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(data)
+ });
+
+ if (res.ok) {
+ const deleted = await res.text();
+ const not_deleted = await res_invalid.text();
+ try {
+ assert.equal(res.status, 200);
+ assert.equal(deleted, "success");
+ assert.equal(not_deleted, "incorrect password");
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+ } else {
+ throw new Error(`${res.status} ${res.statusText}`);
+ }
+};
+```
+
+`/api/replies/{board}` への DELETE リクエストを送信し、`thread_id`、`reply_id`、および `delete_password` を渡すことができます。 文字列 `incorrect password` または `success` が返されます。 実行に成功すると、`reply_id` のテキストが `[deleted]` に変更されます。
+
+```js
+async (getUserInput) => {
+ const url = getUserInput('url');
+
+ const thread_data = {
+ text: "fcc_test_thread",
+ delete_password: "delete_me",
+ };
+ await fetch(`${url}/api/threads/fcc_test`, {
+ method: "POST",
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(thread_data)
+ });
+ let res = await fetch(`${url}/api/threads/fcc_test`);
+ let threads = await res.json();
+ const thread_id = threads[0]._id;
+
+ const reply_data = { thread_id, text: "fcc_test_reply", delete_password: "delete_me" };
+ await fetch(`${url}/api/replies/fcc_test`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(reply_data)
+ });
+ res = await fetch(`${url}/api/threads/fcc_test`);
+ threads = await res.json();
+ const reply_id = threads[0].replies[0]._id;
+
+ const data = { thread_id, reply_id, delete_password: "delete_me" };
+ res = await fetch(url + '/api/replies/fcc_test', {
+ method: 'DELETE',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(data)
+ });
+
+ if (res.ok) {
+ const deleted = await res.text();
+ try {
+ assert.equal(res.status, 200);
+ assert.equal(deleted, "success");
+ res = await fetch(`${url}/api/replies/fcc_test?thread_id=${thread_id}`);
+ const thread = await res.json();
+ assert.equal(thread._id, thread_id);
+ assert.equal(thread.replies[0]._id, reply_id);
+ assert.equal(thread.replies[0].text, "[deleted]");
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+ } else {
+ throw new Error(`${res.status} ${res.statusText}`);
+ }
+};
+```
+
+`/api/threads/{board}` への PUT リクエストを送信し、`thread_id` を渡すことができます。 文字列 `reported` が返されます。 `thread_id` の `reported` の値が `true` に変更されます。
+
+```js
+async (getUserInput) => {
+ const url = getUserInput('url');
+
+ let res = await fetch(`${url}/api/threads/fcc_test`);
+ const threads = await res.json();
+ const report_id = threads[0]._id;
+ const data = { report_id };
+
+ res = await fetch(`${url}/api/threads/fcc_test`, {
+ method: 'PUT',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(data)
+ });
+
+ if (res.ok) {
+ const reported = await res.text();
+ try {
+ assert.equal(res.status, 200);
+ assert.equal(reported, "reported");
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+ } else {
+ throw new Error(`${res.status} ${res.statusText}`);
+ }
+};
+```
+
+`/api/replies/{board}` への PUT リクエストを送信し、`thread_id` と `reply_id` を渡すことができます。 文字列 `reported` が返されます。 `reply_id` の `reported` の値が `true` に変更されます。
+
+```js
+async (getUserInput) => {
+ const url = getUserInput('url');
+
+ let res = await fetch(`${url}/api/threads/fcc_test`);
+ const threads = await res.json();
+ const thread_id = threads[0]._id;
+ const reply_id = threads[0].replies[0]._id;
+ const data = { thread_id, reply_id };
+
+ res = await fetch(`${url}/api/replies/fcc_test`, {
+ method: 'PUT',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(data)
+ });
+
+ if (res.ok) {
+ const reported = await res.text();
+ try {
+ assert.equal(res.status, 200);
+ assert.equal(reported, "reported");
+ } catch (err) {
+ throw new Error(err.responseText || err.message);
+ }
+ } else {
+ throw new Error(`${res.status} ${res.statusText}`);
+ }
+};
+```
+
+10 種類の機能テストがすべて完了して、合格です。
+
+```js
+async (getUserInput) => {
+ const tests = await fetch(getUserInput('url') + '/_api/get-tests');
+ const parsed = await tests.json();
+ assert.isTrue(parsed.length >= 10);
+ parsed.forEach((test) => {
+ assert.equal(test.state, 'passed');
+ assert.isAtLeast(test.assertions.length, 1);
+ });
+};
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/09-information-security/information-security-projects/port-scanner.md b/curriculum/challenges/japanese/09-information-security/information-security-projects/port-scanner.md
new file mode 100644
index 0000000000..b06c9697e9
--- /dev/null
+++ b/curriculum/challenges/japanese/09-information-security/information-security-projects/port-scanner.md
@@ -0,0 +1,95 @@
+---
+id: 5e46f979ac417301a38fb932
+title: ポートスキャナー
+challengeType: 10
+forumTopicId: 462372
+helpCategory: Python
+dashedName: port-scanner
+---
+
+# --description--
+
+このプロジェクトは [Replit スターターコード](https://replit.com/github/freeCodeCamp/boilerplate-port-scanner)を使用して作業を行います。
+
+Python カリキュラムの対話式教育コンテンツを引き続き開発中です。 現在、下記の freeCodeCamp.org YouTube チャンネルで、このプロジェクトの完了に必要なすべての知識について説明する動画をいくつか公開しています。
+
+- [「みんなで Python」ビデオコース](https://www.freecodecamp.org/news/python-for-everybody/) (14 時間)
+
+- [「Python を学ぶ」ビデオコース](https://www.freecodecamp.org/news/learn-python-video-course/) (10 時間)
+
+# --instructions--
+
+Python を使用してポートスキャンプログラムを作成してください。
+
+`port_scanner.py` ファイルで、`target` と `port_range` を引数に取る `get_open_ports` という関数を作成してください。 `target` には URL または IP アドレスを指定できます。 `port_range` は、チェック対象のポート範囲の最初と最後を示す 2 つの数値のリストです。
+
+関数呼び出しの例を次に示します。
+
+```py
+get_open_ports("209.216.230.240", [440, 445])
+get_open_ports("www.stackoverflow.com", [79, 82])
+```
+
+この関数は、指定した範囲の中で開いているポートのリストを返す必要があります。
+
+`get_open_ports` 関数はまた、オプションの 3 つ目の引数として、「詳細」モードであることを示す `True` を受け取る必要があります。 これが true に設定されている場合、関数はポートのリストの代わりに説明的な文字列を返す必要があります。
+
+詳細モードで返される文字列の形式は次のとおりです (`{}` で囲まれたテキストは表示すべき情報を示しています)。
+
+```bash
+Open ports for {URL} ({IP address})
+PORT SERVICE
+{port} {service name}
+{port} {service name}
+```
+
+`common_ports.py` の辞書を使用して、各ポートの正しいサービス名を取得できます。
+
+たとえば、関数を
+
+```py
+port_scanner.get_open_ports("scanme.nmap.org", [20, 80], True)
+```
+
+ように呼び出した場合は、次を返す必要があります。
+
+```bash
+Open ports for scanme.nmap.org (45.33.32.156)
+PORT SERVICE
+22 ssh
+80 http
+```
+
+必ず適切なスペースと改行文字を含めてください。
+
+`get_open_ports` 関数に渡された URL が無効な場合、関数は文字列 "Error: Invalid hostname" を返す必要があります。
+
+`get_open_ports` 関数に渡された IP アドレスが無効な場合、関数は文字列 "Error: Invalid IP address" を返す必要があります。
+
+## 開発
+
+`port_scanner.py` にコードを記述してください。 開発には `main.py` を使用してコードをテストすることができます。 「実行」ボタンをクリックすると `main.py` が実行されます。
+
+## テスト
+
+このプロジェクトの単体テストは `test_module.py` にあります。 すでに `test_module.py` から `main.py` にテストをインポートしてあります。 「実行」ボタンを押すと自動的にテストが実行されます。
+
+## 提出
+
+プロジェクトの URL をコピーし、freeCodeCamp に提出してください。
+
+# --hints--
+
+すべての Python テストに合格する必要があります。
+
+```js
+
+```
+
+# --solutions--
+
+```py
+ # Python challenges don't need solutions,
+ # because they would need to be tested against a full working project.
+ # Please check our contributing guidelines to learn more.
+```
diff --git a/curriculum/challenges/japanese/09-information-security/information-security-projects/secure-real-time-multiplayer-game.md b/curriculum/challenges/japanese/09-information-security/information-security-projects/secure-real-time-multiplayer-game.md
new file mode 100644
index 0000000000..c87e8e3e06
--- /dev/null
+++ b/curriculum/challenges/japanese/09-information-security/information-security-projects/secure-real-time-multiplayer-game.md
@@ -0,0 +1,175 @@
+---
+id: 5e601c775ac9d0ecd8b94aff
+title: セキュアなリアルタイムマルチプレイヤーゲーム
+challengeType: 4
+forumTopicId: 462375
+dashedName: secure-real-time-multiplayer-game
+---
+
+# --description--
+
+HTML Canvas API と [Socket.io](https://socket.io/) を使用して、
と同様の機能を持つ 2D リアルタイムマルチプレイヤーゲームを開発します。 プロジェクトに取り組むにあたり、以下の方法のうち1つを用いてコードを記述します。
+
+- [GitHub リポジトリ](https://github.com/freeCodeCamp/boilerplate-project-secure-real-time-multiplayer-game/)をクローンし、ローカル環境でプロジェクトを完了させる。
+- [Replit 始動プロジェクト](https://replit.com/github/freeCodeCamp/boilerplate-project-secure-real-time-multiplayer-game)を使用して、プロジェクトを完了させる。
+- 使い慣れたサイトビルダーを使用してプロジェクトを完了させる。 必ず GitHub リポジトリのすべてのファイルを取り込む。
+
+完了したら、プロジェクトの動作デモをどこか公開の場にホストしてください。 そして、`Solution Link` フィールドでデモへの URL を送信してください。 必要に応じて、`GitHub Link` フィールドでプロジェクトのソースコードへのリンクを送信してください。
+
+# --instructions--
+
+**メモ**: ユーザーストーリーの実行には `helmet@^3.21.3` が必要です。 このため、ユーザーストーリーを実現するための情報として、Helmet の旧バージョンのドキュメントを参照する必要があります。
+
+# --hints--
+
+サンプルの URL ではなく、自分で作成したプロジェクトを提供することができます。
+
+```js
+(getUserInput) => {
+ assert(
+ !/.*\/secure-real-time-multiplayer-game\.freecodecamp\.rocks/.test(
+ getUserInput('url')
+ )
+ );
+};
+```
+
+複数のプレイヤーがサーバーに接続してプレイすることができます。
+
+```js
+
+```
+
+プレイヤーはそれぞれアバターを持ちます。
+
+```js
+
+```
+
+各プレイヤーは、`Player.mjs` の `Player` クラスによって作成されるオブジェクトにより表現されます。
+
+```js
+
+```
+
+各プレーヤーオブジェクトには、最低限として、固有の `id`、`score`、プレーヤーの現在の位置を示す `x` および `y` 座標を含める必要があります。
+
+```js
+
+```
+
+ゲームには少なくとも 1 種類のコレクションアイテムがあります。 それを実装するために、`Collectible.mjs` で `Collectible` クラスを作成してください。
+
+```js
+
+```
+
+`Collectible` クラスにより作成された各コレクションアイテムオブジェクトには、最低限として、固有の `id`、`value`、アイテムの現在の位置を示す `x` および `y` 座標を含める必要があります。
+
+```js
+
+```
+
+プレイヤーは、WASD キーや矢印キーを使用してアバターを動かすことができます。 それを実装するために、`Player.mjs` で `movePlayer` メソッドを作成してください。
+
+```js
+
+```
+
+`movePlayer` メソッドは、"up"、"down"、"left"、"right " のいずれかの文字列と、プレーヤーの位置を変更するピクセル量を表す数値の、2 つの引数を受け取る必要があります。 `movePlayer` は、呼び出し元のプレイヤーオブジェクトの `x` 座標と `y` 座標を調整する必要があります。
+
+```js
+
+```
+
+プレーヤーのスコアを使用して、他のプレーヤーとの相対順位を計算する必要があります。 それを実装するために、`Player` で `calculateRank` メソッドを作成してください。
+
+```js
+
+```
+
+`calculateRank` メソッドは、すべての接続中のプレイヤーを表すオブジェクトの配列を受け取り、文字列 `Rank: currentRanking/totalPlayers` を返す必要があります。 たとえば、プレイヤーが 2 人のゲームで、プレイヤー A のスコアが 3、プレイヤー B のスコアが 5 の場合、プレイヤー A の `calculateRank` は `Rank: 2/2` を返す必要があります。
+
+```js
+
+```
+
+プレイヤーはコレクションアイテムにぶつかって接触することができます。 それを実装するために、`Player.mjs` で `collision` メソッドを作成してください。
+
+```js
+
+```
+
+`collision` メソッドは、コレクションアイテムのオブジェクトを引数として受け取る必要があります。 プレイヤーのアバターがアイテムに接触した場合、`collision` メソッドは `true` を返す必要があります。
+
+```js
+
+```
+
+すべてのプレイヤーは同期が保たれます。
+
+```js
+
+```
+
+プレイヤーはいつでもゲームから離れることができます。
+
+```js
+
+```
+
+クライアントによる MIME タイプの推測や参照の試行を防いでください。
+
+```js
+async (getUserInput) => {
+ const data = await fetch(getUserInput('url') + '/_api/app-info');
+ const parsed = await data.json();
+ assert.equal(parsed.headers['x-content-type-options'], 'nosniff');
+};
+```
+
+クロスサイトスクリプティング (XSS) 攻撃を防いでください。
+
+```js
+async (getUserInput) => {
+ const data = await fetch(getUserInput('url') + '/_api/app-info');
+ const parsed = await data.json();
+ assert.equal(parsed.headers['x-xss-protection'], '1; mode=block');
+};
+```
+
+ウェブサイトからクライアントにキャッシュされるものは何もありません。
+
+```js
+async (getUserInput) => {
+ const data = await fetch(getUserInput('url') + '/_api/app-info');
+ const parsed = await data.json();
+ assert.equal(parsed.headers['surrogate-control'], 'no-store');
+ assert.equal(
+ parsed.headers['cache-control'],
+ 'no-store, no-cache, must-revalidate, proxy-revalidate'
+ );
+ assert.equal(parsed.headers['pragma'], 'no-cache');
+ assert.equal(parsed.headers['expires'], '0');
+};
+```
+
+ヘッダーには、サイトで "PHP 7.4.3" が使用されていることを記述します。ただし実際には使用されていません (セキュリティ対策が目的です)。
+
+```js
+async (getUserInput) => {
+ const data = await fetch(getUserInput('url') + '/_api/app-info');
+ const parsed = await data.json();
+ assert.equal(parsed.headers['x-powered-by'], 'PHP 7.4.3');
+};
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/09-information-security/information-security-projects/sha-1-password-cracker.md b/curriculum/challenges/japanese/09-information-security/information-security-projects/sha-1-password-cracker.md
new file mode 100644
index 0000000000..4aa68189a2
--- /dev/null
+++ b/curriculum/challenges/japanese/09-information-security/information-security-projects/sha-1-password-cracker.md
@@ -0,0 +1,72 @@
+---
+id: 5e46f983ac417301a38fb933
+title: SHA-1 パスワードクラッカー
+challengeType: 10
+forumTopicId: 462374
+helpCategory: Python
+dashedName: sha-1-password-cracker
+---
+
+# --description--
+
+このプロジェクトは [Replit スターターコード](https://replit.com/github/freeCodeCamp/boilerplate-SHA-1-password-cracker)を使用して作業を行います。
+
+Python カリキュラムの対話式教育コンテンツを引き続き開発中です。 現在、下記の freeCodeCamp.org YouTube チャンネルで、このプロジェクトの完了に必要なすべての知識について説明する動画をいくつか公開しています。
+
+- [「みんなで Python」ビデオコース](https://www.freecodecamp.org/news/python-for-everybody/) (14 時間)
+
+- [「Python を学ぶ」ビデオコース](https://www.freecodecamp.org/news/learn-python-video-course/) (10 時間)
+
+# --instructions--
+
+パスワードはプレーンテキストで保存すべきではありません。 パスワードリストが暴露された場合に備えて、ハッシュとして保存する必要があります。 ただし、すべてのハッシュが同じように作成されるとは限りません。
+
+このプロジェクトでは、SHA-1 を使用してハッシュ化されたパスワードの解読を試みるパスワードクラックプログラムを作成し、その作業を通じて適切なセキュリティを実現することの重要性を学びます。
+
+パスワードの SHA-1 ハッシュを受け取り、パスワードがすでに使用されている上位 10,000 個のうちの 1 つである場合に、そのパスワードを返す関数を作成してください。 SHA-1 ハッシュがデータベースにあるパスワード「ではない」場合は、"PASSWORD NOT IN DATABASE" を返してください。
+
+関数では、`top-10000-passwords.txt` から得られるそれぞれのパスワードをハッシュし、それらを関数に渡されたハッシュと比較する必要があります。
+
+関数は、`use_salts` というオプションの 2 つ目の引数を受け取る必要があります。 この引数が true に設定されている場合は、`top-10000-passwords.txt` から得られる各パスワードの「前と後ろの両方」に、ファイル `known-salts.txt` から得られる各ソルト文字列を追加したうえで、ハッシュ化を行い、関数に渡されたハッシュと比較する必要があります。
+
+関数のテストに使用できるハッシュ化されたパスワードの例を次に示します。
+
+- `b305921a3723cd5d70a375cd21a61e60aabb84ec` は "sammy123" を返す
+- `c7ab388a5ebefbf4d550652f1eb4d833e5316e3e` は "abacab" を返す
+- `5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8` は "password" を返す
+
+`use_salts` を `True` に設定した場合に関数のテストに使用できるハッシュ化されたパスワードの例を次に示します。
+
+- `53d8b3dc9d39f0184144674e310185e41a87ffd5` は "superman" を返す
+- `da5a4e8cf89539e66097acd2f8af128acae2f8ae` は "q1w2e3r4t5" を返す
+- `ea3f62d498e3b98557f9f9cd0d905028b3b019e1` は "bubbles1" を返す
+
+`hashlib` ライブラリをあらかじめインポートしてあります。 コードでこのライブラリを使用してみてください。 hashlib の詳細については[こちら](https://docs.python.org/3/library/hashlib.html)を参照してください。
+
+## 開発
+
+`password_cracker.py` にコードを記述してください。 開発には `main.py` を使用してコードをテストすることができます。 「実行」ボタンをクリックすると `main.py` が実行されます。
+
+## テスト
+
+このプロジェクトの単体テストは `test_module.py` にあります。 すでに `test_module.py` から `main.py` にテストをインポートしてあります。 「実行」ボタンを押すと自動的にテストが実行されます。
+
+## 提出
+
+プロジェクトの URL をコピーし、freeCodeCamp に提出してください。
+
+# --hints--
+
+すべての Python テストに合格する必要があります。
+
+```js
+
+```
+
+# --solutions--
+
+```py
+ # Python challenges don't need solutions,
+ # because they would need to be tested against a full working project.
+ # Please check our contributing guidelines to learn more.
+```
diff --git a/curriculum/challenges/japanese/09-information-security/information-security-projects/stock-price-checker.md b/curriculum/challenges/japanese/09-information-security/information-security-projects/stock-price-checker.md
new file mode 100644
index 0000000000..b52b75d8ba
--- /dev/null
+++ b/curriculum/challenges/japanese/09-information-security/information-security-projects/stock-price-checker.md
@@ -0,0 +1,136 @@
+---
+id: 587d824a367417b2b2512c44
+title: 株価チェッカー
+challengeType: 4
+forumTopicId: 301572
+dashedName: stock-price-checker
+---
+
+# --description--
+
+
と同様の機能を持つフルスタック JavaScript アプリを構築してください。
+
+信頼できる株価 API の利用にはすべて API キーが必要になるため、ここでは回避策を用意しました。
を使用すれば、登録して自分のキーを取得しなくても最新の株価情報を得ることができます。
+
+プロジェクトに取り組むにあたり、以下の方法のうち 1 つを用いてコードを記述します。
+
+- [ GitHub リポジトリ](https://github.com/freeCodeCamp/boilerplate-project-stockchecker/)をクローンし、ローカル環境でプロジェクトを完了させる。
+- [Replit 始動プロジェクト](https://replit.com/github/freeCodeCamp/boilerplate-project-stockchecker)を使用して、プロジェクトを完了させる。
+- 使い慣れたサイトビルダーを使用してプロジェクトを完了させる。 必ず GitHub リポジトリのすべてのファイルを取り込む。
+
+完了したら、プロジェクトの動作デモをどこか公開の場にホストしてください。 そして、`Solution Link` フィールドでデモへの URL を送信してください。 必要に応じて、`GitHub Link` フィールドでプロジェクトのソースコードへのリンクを送信してください。
+
+# --instructions--
+
+1. `NODE_ENV` を引用符なしの `test` に設定し、`DB` を MongoDB 接続文字列に設定します。
+2. `routes/api.js` でプロジェクトを完成させるか、ハンドラー/コントローラーを作成します。
+3. `server.js` にセキュリティ機能を追加します。
+4. `tests/2_functional-tests.js` にすべての機能テストを作成します。
+
+**注**: プライバシーに対する注意事項: 1 つの IP に対して 1 つの「いいね!」しか受け付けないという条件があるため、IP アドレスを保存する必要があります。 一般データ保護規則などのデータプライバシー関連の法令を遵守することが重要です。 ユーザーのデータを保存するための権限を取得するという方法もありますが、データを匿名化した方がはるかに簡単です。 このチャレンジでは、データベースに保存する前に必ず IP アドレスを匿名化してください。 その方法として、データをハッシュ化する、切り詰める、IP アドレスの一部を 0 にする、などが考えられます。
+
+次のテストを `tests/2_functional-tests.js` に記述してください。
+
+- 1 つの株式を表示: `/api/stock-prices/` への GET リクエスト
+- 1 つの株式を表示して「いいね!」をクリック: `/api/stock-prices/` への GET リクエスト
+- もう一度同じ株式を表示して「いいね!」をクリック: `/api/stock-prices/` への GET リクエスト
+- 2 つの株式を表示: `/api/stock-prices/` への GET リクエスト
+- 2 つの株式を表示して「いいね!」をクリック: `/api/stock-prices/` への GET リクエスト
+
+# --hints--
+
+サンプルの URL ではなく、自分で作成したプロジェクトを提供することができます。
+
+```js
+(getUserInput) => {
+ assert(
+ !/.*\/stock-price-checker\.freecodecamp\.rocks/.test(getUserInput('url'))
+ );
+};
+```
+
+コンテンツセキュリティポリシーを設定して、自分のサーバーからのスクリプトや CSS の読み込みのみを許可するようにしてください。
+
+```js
+async (getUserInput) => {
+ const data = await fetch(getUserInput('url') + '/_api/app-info');
+ const parsed = await data.json();
+ assert.isTrue(
+ parsed.headers['content-security-policy'].includes("script-src 'self'")
+ );
+ assert.isTrue(
+ parsed.headers['content-security-policy'].includes("style-src 'self'")
+ );
+};
+```
+
+`GET` リクエストを `/api/stock-prices` に送信し、NASDAQ 株式表示記号を `stock` クエリパラメーターに渡すことができます。 返されるオブジェクトには、`stockData` というプロパティが含まれます。
+
+```js
+async (getUserInput) => {
+ const data = await fetch(
+ getUserInput('url') + '/api/stock-prices?stock=GOOG'
+ );
+ const parsed = await data.json();
+ assert.property(parsed, 'stockData');
+};
+```
+
+`stockData` プロパティには、文字列としての `stock` 記号、数値としての `price`、数値としての `likes` が含まれています。
+
+```js
+async (getUserInput) => {
+ const data = await fetch(
+ getUserInput('url') + '/api/stock-prices?stock=GOOG'
+ );
+ const parsed = await data.json();
+ const ticker = parsed.stockData;
+ assert.typeOf(ticker.price, 'number');
+ assert.typeOf(ticker.likes, 'number');
+ assert.typeOf(ticker.stock, 'string');
+};
+```
+
+また、`like` フィールドに `true` (ブール値) を渡すと、その株式の「いいね!」が増えます。 「いいね!」は、1 つの IP につき 1 回のみ受け付ける必要があります。
+
+```js
+
+```
+
+2 つの株式を渡した場合、返される値は 2 つの株式に関する情報を持つ配列となります。 `likes` の代わりに、両方の `stockData` オブジェクトの `rel_likes` (両株式の「いいね!」の差) を表示します。
+
+```js
+async (getUserInput) => {
+ const data = await fetch(
+ getUserInput('url') + '/api/stock-prices?stock=GOOG&stock=MSFT'
+ );
+ const parsed = await data.json();
+ const ticker = parsed.stockData;
+ assert.typeOf(ticker, 'array');
+ assert.property(ticker[0], 'rel_likes');
+ assert.property(ticker[1], 'rel_likes');
+};
+```
+
+5 種類の機能テストがすべて完了して、合格です。
+
+```js
+async (getUserInput) => {
+ const tests = await fetch(getUserInput('url') + '/_api/get-tests');
+ const parsed = await tests.json();
+ assert.isTrue(parsed.length >= 5);
+ parsed.forEach((test) => {
+ assert.equal(test.state, 'passed');
+ });
+};
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/ask-browsers-to-access-your-site-via-https-only-with-helmet.hsts.md b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/ask-browsers-to-access-your-site-via-https-only-with-helmet.hsts.md
new file mode 100644
index 0000000000..0b8e61b444
--- /dev/null
+++ b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/ask-browsers-to-access-your-site-via-https-only-with-helmet.hsts.md
@@ -0,0 +1,63 @@
+---
+id: 587d8248367417b2b2512c3c
+title: helmet.hsts() を使用して、HTTPS 経由でサイトにアクセスするようブラウザーに指示する
+challengeType: 2
+forumTopicId: 301573
+dashedName: ask-browsers-to-access-your-site-via-https-only-with-helmet-hsts
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) にある次のスタータープロジェクトをベースに構築されているか、または [GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/) からクローンされています。
+
+HTTP Strict Transport Security (HSTS) は、プロトコルのダウングレード攻撃や Cookie のハイジャックからウェブサイトを保護するのに役立つウェブセキュリティポリシーです。 自分のウェブサイトが HTTPS 経由でのアクセスに対応している場合、ユーザーのブラウザーに対して、安全でない HTTP の使用を避けるよう求めることができます。 Strict-Transport-Security ヘッダーを設定することで、ブラウザーに対して、指定された期間、以降のリクエストで HTTPS を使用するよう指示します。 このポリシーは、最初のリクエスト後に発生するリクエストに対して有効になります。
+
+# --instructions--
+
+今後 90 日間 HTTPS を使用するように `helmet.hsts()` を設定してください。 config オブジェクト `{maxAge: timeInSeconds, force: true}` を渡してください。 変数 `ninetyDaysInSeconds = 90*24*60*60;` を作成し、 `timeInSeconds` に使用することができます。 Replit ではすでに hsts が有効になっています。 この設定を上書きするには、config オブジェクトの "force" フィールドを true に設定する必要があります。 Replit のヘッダーをインターセプトし、テストのために検査した後、復元します。
+
+注:カスタムのウェブサイトで HTTPS を設定するには、ドメインと SSL/TLS 証明書を取得する必要があります。
+
+# --hints--
+
+helmet.hsts() ミドルウェアを正しくマウントする必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/app-info').then(
+ (data) => {
+ assert.include(data.appStack, 'hsts');
+ assert.property(data.headers, 'strict-transport-security');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+maxAge を 7776000 秒 (90 日) にする必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/app-info').then(
+ (data) => {
+ assert.match(
+ data.headers['strict-transport-security'],
+ /^max-age=7776000;?/
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/avoid-inferring-the-response-mime-type-with-helmet.nosniff.md b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/avoid-inferring-the-response-mime-type-with-helmet.nosniff.md
new file mode 100644
index 0000000000..dadb75fb90
--- /dev/null
+++ b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/avoid-inferring-the-response-mime-type-with-helmet.nosniff.md
@@ -0,0 +1,42 @@
+---
+id: 587d8248367417b2b2512c3a
+title: helmet.noSnifff() を使用して、レスポンスの MIME タイプの推測を回避する
+challengeType: 2
+forumTopicId: 301574
+dashedName: avoid-inferring-the-response-mime-type-with-helmet-nosniff
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) にある次のスタータープロジェクトをベースに構築されているか、または [GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/) からクローンされています。 ブラウザーでコンテンツまたは MIME スニッフィングを使用すると、レスポンスの `Content-Type` ヘッダーを上書きし、暗黙のコンテンツタイプを使用してデータを推測し、処理することが可能になります。 これは便利な場合もありますが、危険な攻撃につながる可能性もあります。 このミドルウェアは、X-Content-Type-Options ヘッダーを `nosniff` に設定することで、提供された `Content-Type` を回避しないようにブラウザーに指示します。
+
+# --instructions--
+
+サーバーで `helmet.noSniff()` メソッドを使用してください。
+
+# --hints--
+
+helmet.noSniff() ミドルウェアを正しくマウントする必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/app-info').then(
+ (data) => {
+ assert.include(data.appStack, 'nosniff');
+ assert.equal(data.headers['x-content-type-options'], 'nosniff');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/configure-helmet-using-the-parent-helmet-middleware.md b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/configure-helmet-using-the-parent-helmet-middleware.md
new file mode 100644
index 0000000000..870d8e5887
--- /dev/null
+++ b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/configure-helmet-using-the-parent-helmet-middleware.md
@@ -0,0 +1,50 @@
+---
+id: 587d8249367417b2b2512c40
+title: '「親」の helmet() ミドルウェアを使用して Helmet を構成する'
+challengeType: 2
+forumTopicId: 301575
+dashedName: configure-helmet-using-the-parent-helmet-middleware
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) にある次のスタータープロジェクトをベースに構築されているか、または [GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/) からクローンされています。
+
+`app.use(helmet())` では、前に紹介したすべてのミドルウェアが自動的にインクルードされますが、`noCache()` と `contentSecurityPolicy()` は除外されます。しかし、必要に応じてこれらを有効にすることができます。 config オブジェクトを使用して、他のミドルウェアを個別に無効化または構成することもできます。
+
+**例:**
+
+```js
+app.use(helmet({
+ frameguard: { // configure
+ action: 'deny'
+ },
+ contentSecurityPolicy: { // enable and configure
+ directives: {
+ defaultSrc: ["'self'"],
+ styleSrc: ['style.com'],
+ }
+ },
+ dnsPrefetchControl: false // disable
+}))
+```
+
+説明の都合上、またテストのしやすさを考慮して、各ミドルウェアを別々に紹介しました。 実際のプロジェクトでは「親」の `helmet()` ミドルウェアを簡単に実装して使用できます。
+
+# --hints--
+
+テストはありません。説明のみのチャレンジです。
+
+```js
+assert(true);
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/disable-client-side-caching-with-helmet.nocache.md b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/disable-client-side-caching-with-helmet.nocache.md
new file mode 100644
index 0000000000..1bd412eaf0
--- /dev/null
+++ b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/disable-client-side-caching-with-helmet.nocache.md
@@ -0,0 +1,47 @@
+---
+id: 587d8249367417b2b2512c3e
+title: helmet.noCache() を使用してクライアントサイドのキャッシュを無効にする
+challengeType: 2
+forumTopicId: 301576
+dashedName: disable-client-side-caching-with-helmet-nocache
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) にある次のスタータープロジェクトをベースに構築されているか、または [GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/) からクローンされています。
+
+ウェブサイトのアップデートを行う際に、ユーザーに常に新しいバージョンをダウンロードしてもらいたい場合、クライアントのブラウザーでキャッシュの無効化を行う (または試みる) ことができます。 これは開発の場合にも役立ちます。 キャッシュにはパフォーマンス上の利点がありますが、それを失うことになるため、このオプションは本当に必要な場合にのみ使用してください。
+
+# --instructions--
+
+サーバーで `helmet.noCache()` メソッドを使用してください。
+
+# --hints--
+
+helmet.noCache() ミドルウェアを正しくマウントする必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/app-info').then(
+ (data) => {
+ assert.include(data.appStack, 'nocache');
+ assert.equal(
+ data.headers['cache-control'],
+ 'no-store, no-cache, must-revalidate, proxy-revalidate'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/disable-dns-prefetching-with-helmet.dnsprefetchcontrol.md b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/disable-dns-prefetching-with-helmet.dnsprefetchcontrol.md
new file mode 100644
index 0000000000..e8c2bdce32
--- /dev/null
+++ b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/disable-dns-prefetching-with-helmet.dnsprefetchcontrol.md
@@ -0,0 +1,44 @@
+---
+id: 587d8248367417b2b2512c3d
+title: helmet.dnsPrefetchControl() を使用して DNS プリフェッチを無効にする
+challengeType: 2
+forumTopicId: 301577
+dashedName: disable-dns-prefetching-with-helmet-dnsprefetchcontrol
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) にある次のスタータープロジェクトをベースに構築されているか、または [GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/) からクローンされています。
+
+ほとんどのブラウザーでは、パフォーマンスを向上させるために、ページ内のリンクの DNS レコードを先読み (プリフェッチ) します。 これにより、ユーザーがリンクをクリックしたときには、すでに目的の IP がわかっている状態になります。 その結果、DNS サービスの過度の使用 (何百万人もの人が訪れる大規模なウェブサイトの運営を想像してみてください…)、プライバシーの問題 (特定のページを閲覧しているユーザーを盗聴者が推測できる可能性がある)、ページ統計の改ざん (リンク先が訪問されていなくても訪問されているように表示される) などが発生する可能性があります。 高度なセキュリティを必要とする場合は、パフォーマンスの低下を犠牲にして、DNS プリフェッチを無効にすることができます。
+
+# --instructions--
+
+サーバーで `helmet.dnsPrefetchControl()` メソッドを使用してください。
+
+# --hints--
+
+helmet.dnsPrefetchControl() ミドルウェアを正しくマウントする必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/app-info').then(
+ (data) => {
+ assert.include(data.appStack, 'dnsPrefetchControl');
+ assert.equal(data.headers['x-dns-prefetch-control'], 'off');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md
new file mode 100644
index 0000000000..71242b65dd
--- /dev/null
+++ b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md
@@ -0,0 +1,81 @@
+---
+id: 58a25bcff9fc0f352b528e7d
+title: パスワードを非同期的にハッシュ化して比較する
+challengeType: 2
+forumTopicId: 301578
+dashedName: hash-and-compare-passwords-asynchronously
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-bcrypt) にある次のスタータープロジェクトをベースに構築されているか、または [GitHub](https://github.com/freeCodeCamp/boilerplate-bcrypt/) からクローンされています。
+
+ハッシュは計算量が多くなるように設計されているので、ハッシュ処理中に接続がブロックされないように、サーバー上で非同期的に処理することをお勧めします。 次の呼び出しを実行するだけで、パスワードを非同期にハッシュ化できます。
+
+```js
+bcrypt.hash(myPlaintextPassword, saltRounds, (err, hash) => {
+ /*Store hash in your db*/
+});
+```
+
+# --instructions--
+
+このハッシュ関数をサーバーに追加し (関数内で使用されている変数はすでに定義してあります)、コンソールに出力して確認してください。 通常はこの時点でハッシュをデータベースに保存します。
+
+新しい入力がハッシュと同じデータかどうかを調べる必要がある場合は、compare 関数を使用します。
+
+```js
+bcrypt.compare(myPlaintextPassword, hash, (err, res) => {
+ /*res == true or false*/
+});
+```
+
+完了したハッシュを出力し、compare の中でコンソールに "res" と出力した後、これを既存のハッシュ関数に追加してください (compare 関数を呼び出す前にハッシュの完了を待つ必要があるため)。 コンソールにハッシュが出力され、次に 'true' と出力されるはずです。 compare 関数の 'myPlaintextPassword' を 'someOtherPlaintextPassword' に変更すると、false と表示されます。
+
+```js
+bcrypt.hash('passw0rd!', 13, (err, hash) => {
+ console.log(hash);
+ //$2a$12$Y.PHPE15wR25qrrtgGkiYe2sXo98cjuMCG1YwSI5rJW1DSJp0gEYS
+ bcrypt.compare('passw0rd!', hash, (err, res) => {
+ console.log(res); //true
+ });
+});
+
+```
+
+正しいと思ったら、ページを送信してください。
+
+# --hints--
+
+非同期ハッシュを生成し、正しく比較する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/server.js').then(
+ (data) => {
+ assert.match(
+ data,
+ /START_ASYNC[^]*bcrypt.hash.*myPlaintextPassword( |),( |)saltRounds( |),( |).*err( |),( |)hash[^]*END_ASYNC/gi,
+ 'You should call bcrypt.hash on myPlaintextPassword and saltRounds and handle err and hash as a result in the callback'
+ );
+ assert.match(
+ data,
+ /START_ASYNC[^]*bcrypt.hash[^]*bcrypt.compare.*myPlaintextPassword( |),( |)hash( |),( |).*err( |),( |)res[^]*}[^]*}[^]*END_ASYNC/gi,
+ 'Nested within the hash function should be the compare function comparing myPlaintextPassword to hash'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.statusText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-synchronously.md b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-synchronously.md
new file mode 100644
index 0000000000..7a595b6559
--- /dev/null
+++ b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-synchronously.md
@@ -0,0 +1,66 @@
+---
+id: 58a25bcff9fc0f352b528e7e
+title: パスワードを同期的にハッシュ化して比較する
+challengeType: 2
+forumTopicId: 301579
+dashedName: hash-and-compare-passwords-synchronously
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-bcrypt) にある次のスタータープロジェクトをベースに構築されているか、または [GitHub](https://github.com/freeCodeCamp/boilerplate-bcrypt/) からクローンされています。
+
+同期的にハッシュ化することも同様に簡単ですが、サーバーサイドで高いコストをかけて使用する場合や、頻繁にハッシュ化を行う場合には遅延が発生する可能性があります。 次の呼び出しだけで、このメソッドによるハッシュ化を実行できます。
+
+```js
+var hash = bcrypt.hashSync(myPlaintextPassword, saltRounds);
+```
+
+このハッシュメソッドをコードに追加し、結果をコンソールに表示してください。 ここでも、使用されている変数はすでにサーバーで定義されているため、変数を調整する必要はありません。 非同期関数と同じパスワードをハッシュ化しているにもかかわらず、コンソールに表示される結果が異なることに気づくかもしれません。これは、ハッシュの 3 番目の文字列の最初の 22 文字を見るとわかるように、ソルトが毎回ランダムに生成されるためです。 ここで、入力されたパスワードと新しい同期ハッシュを比較するために、compareSync メソッドを使用します。
+
+```js
+var result = bcrypt.compareSync(myPlaintextPassword, hash);
+```
+
+結果は true または false のブール値になります。
+
+# --instructions--
+
+関数を追加し、コンソールに結果を表示して動作を確認してください。
+
+正しいと思ったら、ページを送信してください。
+
+# --hints--
+
+同期ハッシュを生成し、正しく比較する必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/server.js').then(
+ (data) => {
+ assert.match(
+ data,
+ /START_SYNC[^]*hash.*=.*bcrypt.hashSync.*myPlaintextPassword( |),( |)saltRounds[^]*END_SYNC/gi,
+ 'You should call bcrypt.hashSync on myPlaintextPassword with saltRounds'
+ );
+ assert.match(
+ data,
+ /START_SYNC[^]*result.*=.*bcrypt.compareSync.*myPlaintextPassword( |),( |)hash[^]*END_SYNC/gi,
+ 'You should call bcrypt.compareSync on myPlaintextPassword with the hash generated in the last line'
+ );
+ },
+ (xhr) => {
+ throw new Error(xhr.statusText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/hide-potentially-dangerous-information-using-helmet.hidepoweredby.md b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/hide-potentially-dangerous-information-using-helmet.hidepoweredby.md
new file mode 100644
index 0000000000..655d83db80
--- /dev/null
+++ b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/hide-potentially-dangerous-information-using-helmet.hidepoweredby.md
@@ -0,0 +1,40 @@
+---
+id: 587d8247367417b2b2512c37
+title: helmet.hidePoweredBy() を使用して危険性のある情報を隠す
+challengeType: 2
+forumTopicId: 301580
+dashedName: hide-potentially-dangerous-information-using-helmet-hidepoweredby
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) にある次のスタータープロジェクトをベースに構築されているか、または [GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/) からクローンされています。
+
+サイトで Express を使用していることがハッカーに知られた場合、ハッカーは Express や Node の既知の脆弱性を悪用する可能性があります。 デフォルトでは、Express からリクエストが発生するたびに `X-Powered-By: Express` が送信されます。 `helmet.hidePoweredBy()` ミドルウェアを使用して X-Powered-By ヘッダーを削除してください。
+
+# --hints--
+
+helmet.hidePoweredBy() ミドルウェアを正しくマウントする必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/app-info').then(
+ (data) => {
+ assert.include(data.appStack, 'hidePoweredBy');
+ assert.notEqual(data.headers['x-powered-by'], 'Express');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/install-and-require-helmet.md b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/install-and-require-helmet.md
new file mode 100644
index 0000000000..d42c1ac254
--- /dev/null
+++ b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/install-and-require-helmet.md
@@ -0,0 +1,53 @@
+---
+id: 587d8247367417b2b2512c36
+title: Helmet を install して require する
+challengeType: 2
+forumTopicId: 301581
+dashedName: install-and-require-helmet
+---
+
+# --description--
+
+これらのチャレンジに取り組むにあたり、以下の方法のうち 1 つを用いてコードを記述します。
+
+- [GitHub リポジトリ](https://github.com/freeCodeCamp/boilerplate-infosec/)をクローンし、ローカル環境でプロジェクトを完了させる。
+- [Replit 始動プロジェクト](https://replit.com/github/freeCodeCamp/boilerplate-infosec)を使用して、チャレンジを完了させる。
+- 使い慣れたサイトビルダーを使用してプロジェクトを完了させる。 必ず GitHub リポジトリのすべてのファイルを取り込む。
+
+完了したら、プロジェクトの動作デモをどこか公開の場にホストしてください。 そして、`Solution Link` フィールドでデモへの URL を送信してください。
+
+Helmet を使用すると、さまざまな HTTP ヘッダーを設定することができ、Express アプリケーションのセキュリティを確保するのに役立ちます。
+
+# --instructions--
+
+これらのレッスンで使用するコードはすべて、`myApp.js`ファイルの中で、最初に示したコードの行の間に記載されています。 追加したコードを変更したり削除したりしないでください。
+
+Helmet のバージョン `3.21.3` をインストールし、require してください。 `npm install --save-exact package@version` を使用するか、`package.json` に直接追加することで、特定のバージョンのパッケージをインストールできます。
+
+# --hints--
+
+`helmet` のバージョン `3.21.3` を `package.json` に含める必要があります。
+
+```js
+(getUserInput) =>
+ $.get(getUserInput('url') + '/_api/package.json').then(
+ (data) => {
+ const packJson = JSON.parse(data);
+ const helmet = packJson.dependencies.helmet;
+ assert(helmet === '3.21.3' || helmet === '^3.21.3');
+ },
+ (xhr) => {
+ throw new Error(xhr.responseText);
+ }
+ );
+```
+
+# --solutions--
+
+```js
+/**
+ Backend challenges don't need solutions,
+ because they would need to be tested against a full working project.
+ Please check our contributing guidelines to learn more.
+*/
+```
diff --git a/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/mitigate-the-risk-of-clickjacking-with-helmet.frameguard.md b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/mitigate-the-risk-of-clickjacking-with-helmet.frameguard.md
new file mode 100644
index 0000000000..c7fbdb8907
--- /dev/null
+++ b/curriculum/challenges/japanese/09-information-security/information-security-with-helmetjs/mitigate-the-risk-of-clickjacking-with-helmet.frameguard.md
@@ -0,0 +1,64 @@
+---
+id: 587d8247367417b2b2512c38
+title: helmet.frameguard() を使用してクリックジャック攻撃のリスクを軽減する
+challengeType: 2
+forumTopicId: 301582
+dashedName: mitigate-the-risk-of-clickjacking-with-helmet-frameguard
+---
+
+# --description--
+
+注意点として、このプロジェクトは [Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) にある次のスタータープロジェクトをベースに構築されているか、または [GitHub](https://github.com/freeCodeCamp/boilerplate-infosec/) からクローンされています。
+
+あなたのページは、あなたの同意なしに `
` や `
+
+# --hints--
+
+`gamma` は関数とします。
+
+```js
+assert(typeof gamma == 'function');
+```
+
+`gamma(.1)` は数値を返す必要があります。
+
+```js
+assert(typeof gamma(0.1) == 'number');
+```
+
+`gamma(.1)` は、`9.513507698668736`を返す必要があります。
+
+```js
+assert.equal(round(gamma(0.1)), round(9.513507698668736));
+```
+
+`gamma(.2)` は、`4.590843711998803`を返す必要があります。
+
+```js
+assert.equal(round(gamma(0.2)), round(4.590843711998803));
+```
+
+`gamma(.3)` は、`2.9915689876875904`を返す必要があります。
+
+```js
+assert.equal(round(gamma(0.3)), round(2.9915689876875904));
+```
+
+`gamma(.4)` は、`2.218159543757687`を返す必要があります。
+
+```js
+assert.equal(round(gamma(0.4)), round(2.218159543757687));
+```
+
+`gamma(.5)` は、 `1.7724538509055159`を返す必要があります。
+
+```js
+assert.equal(round(gamma(0.5)), round(1.7724538509055159));
+```
+
+# --seed--
+
+## --after-user-code--
+
+```js
+function round(x) {
+ return Number(x).toPrecision(13);
+}
+```
+
+## --seed-contents--
+
+```js
+function gamma(x) {
+
+}
+```
+
+# --solutions--
+
+```js
+function gamma(x) {
+ var p = [0.99999999999980993, 676.5203681218851, -1259.1392167224028,
+ 771.32342877765313, -176.61502916214059, 12.507343278686905,
+ -0.13857109526572012, 9.9843695780195716e-6, 1.5056327351493116e-7
+ ];
+
+ var g = 7;
+ if (x < 0.5) {
+ return Math.PI / (Math.sin(Math.PI * x) * gamma(1 - x));
+ }
+
+ x -= 1;
+ var a = p[0];
+ var t = x + g + 0.5;
+ for (var i = 1; i < p.length; i++) {
+ a += p[i] / (x + i);
+ }
+
+ var result=Math.sqrt(2 * Math.PI) * Math.pow(t, x + 0.5) * Math.exp(-t) * a;
+
+ return result;
+}
+```
diff --git a/curriculum/challenges/japanese/10-coding-interview-prep/rosetta-code/gaussian-elimination.md b/curriculum/challenges/japanese/10-coding-interview-prep/rosetta-code/gaussian-elimination.md
new file mode 100644
index 0000000000..ad982506f5
--- /dev/null
+++ b/curriculum/challenges/japanese/10-coding-interview-prep/rosetta-code/gaussian-elimination.md
@@ -0,0 +1,230 @@
+---
+id: 5a23c84252665b21eecc7e77
+title: ガウスの消去法
+challengeType: 5
+forumTopicId: 302272
+dashedName: gaussian-elimination
+---
+
+# --description--
+
+ガウスの消去法を用い、後退代入で\\(Ax = b\\) を解く関数を記述します。
+
+\\(A\\) は \\(n \\times n\\) 行列とします。 また、\\(x\\) と \\(b\\) は \\(n\\) に 1ベクトルを掛けます。
+
+精度を向上させるために、部分ピボット選択とスケーリングを使用してください。
+
+# --hints--
+
+`gaussianElimination` は関数とします。
+
+```js
+assert(typeof gaussianElimination == 'function');
+```
+
+`gaussianElimination([[1,1],[1,-1]], [5,1])`は、配列を返す必要があります。
+
+```js
+assert(
+ Array.isArray(
+ gaussianElimination(
+ [
+ [1, 1],
+ [1, -1]
+ ],
+ [5, 1]
+ )
+ )
+);
+```
+
+`gaussianElimination([[1,1],[1,-1]], [5,1])` は、`[ 3, 2 ]`を返す必要があります。
+
+```js
+assert.deepEqual(
+ gaussianElimination(
+ [
+ [1, 1],
+ [1, -1]
+ ],
+ [5, 1]
+ ),
+ [3, 2]
+);
+```
+
+`gaussianElimination([[2,3],[2,1]] , [8,4])` は、`[ 1, 2 ]`を返す必要があります。
+
+```js
+assert.deepEqual(
+ gaussianElimination(
+ [
+ [2, 3],
+ [2, 1]
+ ],
+ [8, 4]
+ ),
+ [1, 2]
+);
+```
+
+`gaussianElimination([[1,3],[5,-2]], [14,19])` は `[ 5, 3 ]`を返す必要があります。
+
+```js
+assert.deepEqual(
+ gaussianElimination(
+ [
+ [1, 3],
+ [5, -2]
+ ],
+ [14, 19]
+ ),
+ [5, 3]
+);
+```
+
+`gaussianElimination([[1,1],[5,-1]] , [10,14])` は`[ 4, 6 ]`を返す必要があります。
+
+```js
+assert.deepEqual(
+ gaussianElimination(
+ [
+ [1, 1],
+ [5, -1]
+ ],
+ [10, 14]
+ ),
+ [4, 6]
+);
+```
+
+`gaussianElimination([[1,2,3],[4,5,6],[7,8,8]] , [6,15,23])` は、`[ 1, 1, 1 ]`を返す必要があります。
+
+```js
+assert.deepEqual(
+ gaussianElimination(
+ [
+ [1, 2, 3],
+ [4, 5, 6],
+ [7, 8, 8]
+ ],
+ [6, 15, 23]
+ ),
+ [1, 1, 1]
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function gaussianElimination(A,b) {
+
+}
+```
+
+# --solutions--
+
+```js
+function gaussianElimination(A, b) {
+ // Lower Upper Decomposition
+ function ludcmp(A) {
+ // A is a matrix that we want to decompose into Lower and Upper matrices.
+ var d = true
+ var n = A.length
+ var idx = new Array(n) // Output vector with row permutations from partial pivoting
+ var vv = new Array(n) // Scaling information
+
+ for (var i=0; i