config.json


config.jsonファイルは、トラックの設定を記述します。トラックの演習や概念といった重要な情報が含まれます。

メタデータ

以下のトップレベルのプロパティには、トラックの一般的なメタデータが含まれます。

  • language: トラックの言語(例:"C#")。長さは255以下でなければなりません。(必須)
  • slug: トラックの言語を小文字のkebab-case文字列で表したもの(例:"csharp")。長さは255以下でなければなりません。(必須)
  • active: トラックがアクティブかどうか(つまり、学習者がウェブサイトでそのトラックに参加できるかどうか)を示すboolean値(必須)
  • blurb: 言語の短い説明。長さは400以下でなければなりません。(必須)
  • version: config.jsonファイルのバージョン(現在は3に固定)。(必須)
  • online_editor: オンラインエディターで使われる設定を記述するオブジェクト:(必須)
    • indent_style: "space"または"tab"のいずれか(必須)
    • indent_size: インデントのサイズを表す整数(例:4)(必須)
    • highlightjs_language: Highlight.jsの言語識別子(識別子の完全なリストを参照)(任意)
  • status: どのv3機能を有効にするかを記述するオブジェクト:(必須)
    • concept_exercises: 概念演習が作成されているかどうかを示すboolean値(必須)。trueの場合、Exercismのウェブサイトのインターフェースが変わり、そのトラックで概念演習が利用できることを示します。
    • test_runner: テストランナーが実装されているかどうかを示すboolean値(必須)。trueの場合、提出された解答をテスト基盤に通して結果をウェブサイトに表示します。また、学習者がオンラインエディターからテスト実行を開始できるようになります。
    • representer: リプレゼンターが実装されているかどうかを示すboolean値(必須)
    • analyzer: アナライザーが実装されているかどうかを示すboolean値(必須)
  • files: 演習で使われるファイルの場所のパターン。演習のディレクトリからの相対パスで指定します。(任意)
    • solution: スタブ実装ファイルのパターン(任意)
    • test: テストファイルのパターン(任意)
    • example: 実装例ファイルのパターン(任意)
    • exemplar: 模範実装ファイルのパターン(任意)
    • editor: 追加の読み取り専用エディターファイルのパターン(任意)
  • test_runner: トラックのテストランナーを記述するオブジェクト(ある場合):(status.test_runnerがtrueの場合は必須)
    • average_run_time: テストランナーの実行にかかる平均秒数を表す整数のnumber値(例:4)(status.test_runnerがtrueの場合は必須)
  • approaches: トラックのアプローチに関するメタデータを持つオブジェクト:(トラックにアプローチがある場合は必須)
    • snippet_extension: スニペットファイルの拡張子に使われる文字列値(例:rb)(トラックにアプローチがある場合は必須)

ファイル

このキーは、トラック全体のファイルの場所を指定するために使います。メンテナーが_各演習_のconfig.jsonファイルでfilesキーを手動で設定しなくても、configletがこれらのトラック全体のパターンを使って自動的に設定できます。

filesオブジェクトで定義するファイルパターンでは、以下のプレースホルダーが使えます。

  • %{kebab_slug}: kebab-case形式の演習スラッグ(例:bit-manipulation)
  • %{snake_slug}: snake_case形式の演習スラッグ(例:bit_manipulation)
  • %{camel_slug}: camelCase形式の演習スラッグ(例:bitManipulation)
  • %{pascal_slug}: PascalCase形式の演習スラッグ(例:BitManipulation)

これらのパターンを使って演習の.meta/config.jsonファイルのfilesキーを設定する機能が、configletに追加される予定です。

例

{
  "language": "C#",
  "slug": "csharp",
  "active": true,
  "status": {
    "concept_exercises": true,
    "test_runner": true,
    "representer": false,
    "analyzer": false
  },
  "blurb": "C# is a modern, object-oriented language with lots of great features, such as type-inference and async/await. The tooling is excellent, and there is extensive, well-written documentation.",
  "version": 3,
  "online_editor": {
    "indent_style": "space",
    "indent_size": 4,
    "highlightjs_language": "csharp"
  },
  "test_runner": {
    "average_run_time": 2
  },
  "files": {
    "solution": [
      "%{pascal_slug}.cs"
    ],
    "test": [
      "%{pascal_slug}Tests.cs"
    ],
    "example": [
      ".meta/Example.cs"
    ],
    "exemplar": [
      ".meta/Exemplar.cs"
    ]
  }
}

演習

トップレベルのexercisesキーは、3つのキーを持ちうるオブジェクトです。

  • concept: トラックの概念演習を並べた配列です
  • practice: トラックの実践演習を並べた配列です
  • foregone: トラックが実装しない演習のスラッグを並べた配列です

概念演習

各概念演習は、exercises.concept配列の1つの要素です。 演習は、このファイルに並べた順と同じ順序でウェブサイトに表示され、通常解くべき順序と一致している必要があります。 概念演習は以下のフィールドで構成されます。

  • uuid: 演習を一意に識別するV4 UUID。UUIDはトラック内でも全トラックを通じても一意でなければならず、決して変更してはいけません
  • slug: 演習のスラッグ。小文字のkebab-case文字列です。スラッグは、トラック内のすべての概念演習_および_実践演習のスラッグの中で一意でなければなりません。長さは255以下でなければなりません。
  • name: 演習の名前。長さは255以下でなければなりません。
  • concepts: この概念演習で教える概念のスラッグの配列
  • prerequisites: 学習者がこの演習を始める前にロックを解除しておく必要がある概念のスラッグの配列
  • status(任意): 演習のステータス。"wip"、"beta"、"active"、"deprecated"のいずれかで、指定しない場合は"active"が既定値です
    • wip: 一般公開できる状態になっていない作業中の演習。このタグが付いた演習は、UI上で学習者に表示されず、ロック解除のロジックにも使われません。メンテナーには表示されることがあります。
    • beta: 新しく、フィードバックを求めているアクティブな演習であることを示します。これらの演習にはサイト上でベータラベルが表示され、そこには「Please give us feedback.」という行動を促すメッセージが添えられます。
    • active: アクティブな演習の通常の状態
    • deprecated: まだ始めていない学習者には表示されなくなった演習(この段階では利用できません)。詳しくは非推奨の演習を参照してください。

例

{
  "exercises": {
    "concept": [
      {
        "slug": "cars-assemble",
        "name": "Cars, Assemble!",
        "uuid": "93fbc7cf-3a7e-4450-ad22-e30129c36bb9",
        "concepts": [
          "if-statements",
          "numbers"
        ],
        "prerequisites": [
          "basics"
        ]
      },
      ...
    ]
  }
}

作業中の例

{
  "exercises": {
    "concept": [
      {
        "slug": "cars-assemble",
        "name": "Cars, Assemble!",
        "uuid": "93fbc7cf-3a7e-4450-ad22-e30129c36bb9",
        "concepts": [
          "if-statements",
          "numbers"
        ],
        "prerequisites": [
          "basics"
        ],
        "status": "wip"
      },
      ...
    ]
  }
}

実践演習

各実践演習は、exercises.practice配列の1つの要素です。実践演習は以下のフィールドで構成されます。

  • uuid: 演習を一意に識別するV4 UUID。UUIDはトラック内でも全トラックを通じても一意でなければならず、決して変更してはいけません
  • slug: 演習のスラッグ。小文字のkebab-case文字列です。スラッグは、トラック内のすべての概念演習_および_実践演習のスラッグの中で一意でなければなりません。長さは255以下でなければなりません。
  • name: 演習の名前。長さは255以下でなければなりません。
  • practices: この演習で学習者が練習する概念のスラッグの配列
  • prerequisites: 学習者がこの演習を始める前にロックを解除しておく必要がある概念のスラッグの配列
  • difficulty: 演習の難易度を示す数値。数値は1(最もやさしい)から10(最も難しい)の範囲でなければなりません。ウェブサイトは難易度を次のように解釈します。
    • 1、2、3: やさしい
    • 4、5、6、7: ふつう
    • 8、9、10: 難しい
  • status(任意): 演習のステータス。"wip"、"beta"、"active"、"deprecated"のいずれかで、指定しない場合は"active"が既定値です
    • wip: 一般公開できる状態になっていない作業中の演習。このタグが付いた演習は、UI上で学習者に表示されず、ロック解除のロジックにも使われません。メンテナーには表示されることがあります。
    • beta: 新しく、フィードバックを求めているアクティブな演習であることを示します。これらの演習にはサイト上でベータラベルが表示され、そこには「Please give us feedback」という行動を促すメッセージが添えられます。
    • active: アクティブな演習の通常の状態
    • deprecated: まだ始めていない学習者には表示されなくなった演習(この段階では利用できません)。

ウェブサイト上での実践演習の「おすすめの順序」は、practice配列内の演習の順序に対応します。

例

{
  "exercises": {
    "practice": [
      {
        "slug": "leap",
        "name": "Leap",
        "uuid": "8ba15933-29a2-49b1-a9ce-70474bad3007",
        "practices": [
          "if-statements",
          "numbers",
          "operator-precedence"
        ],
        "prerequisites": [
          "if-statements",
          "numbers"
        ],
        "difficulty": 1
      },
      ...
    ]
  }
}

ベータの例

{
  "exercises": {
    "practice": [
      {
        "slug": "leap",
        "name": "Leap",
        "uuid": "8ba15933-29a2-49b1-a9ce-70474bad3007",
        "practices": [
          "if-statements",
          "numbers",
          "operator-precedence"
        ],
        "prerequisites": [
          "if-statements",
          "numbers"
        ],
        "difficulty": 1,
        "status": "beta"
      },
      ...
    ]
  }
}

見送る演習

トラックが、Problem Specificationsリポジトリで定義されている演習を実装しないと決めている場合、その演習のスラッグをexercises.foregoneキーに追加できます。configletは、トラックの未実装の演習を出力するときに、見送る演習を無視します。

トラックが演習を実装したく_ない_理由としては、次のようなものが考えられます。

  • その言語では無理なく実装できない演習である。例として、lens-person演習は、言語が_レンズ_をサポートしていることを前提としています。
  • 演習のトピックがその言語に合わない。たとえば、一部の高水準言語では、低水準のビット操作の演習は意味をなさないことがあります。

例

{
  "exercises": {
    "foregone": [
      "lens-person"
    ]
  }
}

概念

各概念は、トップレベルのconcepts配列の1つの要素です。概念は以下のフィールドで構成されます。

  • uuid: 概念を一意に識別するV4 UUID。UUIDはトラック内でも全トラックを通じても一意でなければならず、決して変更してはいけません
  • slug: 概念のスラッグ。小文字のkebab-case文字列です。スラッグは、トラック内のすべての概念の中で一意でなければなりません。長さは255以下でなければなりません。
  • name: 概念の名前。長さは255以下でなければなりません。
  • tags: 提出物がアプローチに紐づけられる条件を指定します。(任意)
    • all: 提出物にすべて含まれていなければならないタグの配列(anyに要素がない場合を除き、任意)
    • any: 提出物に少なくとも1つ含まれていなければならないタグの配列(allに要素がない場合を除き、任意)
    • not: 提出物にどのタグも含まれていてはなりません(任意)

例

{
  "concepts": [
    {
      "uuid": "b9a421b2-c5ff-4213-bd6d-b886da31ea0d",
      "slug": "numbers",
      "name": "Numbers",
      "tags": {
        "all": [
          "concept:number"
        ]
      }
    }
  ]
}

主な特徴

言語の主な特徴は、その言語の最も重要な機能を簡潔に説明したものです。 これから学ぶ人に、その言語のより興味深い機能を伝えることを目的としています。 タイトルは、専門用語をできるだけ使わないように心がけてください。学習者は、その言語を学ぶ前には言語固有の専門用語の意味に馴染みがないかもしれないことを念頭に置きましょう。

主な特徴は、トップレベルのkey_featuresフィールドで指定します。これは、以下のフィールドを持つオブジェクトの配列として定義されます。

  • title: 主な特徴の簡潔な見出し。長さは25以下でなければなりません。Markdownは_サポートされていません_。
  • content: 主な特徴の説明。長さは100以下でなければなりません。Markdownは_サポートされていません_。
  • icon: その特徴に対して表示するアイコン。名前に関係なく、合うと思うアイコンを選べます。以下のアイコンが使えます。
    • community
    • concurrency
    • cross-platform
    • documentation
    • dynamically-typed
    • easy
    • embeddable
    • evolving
    • expressive
    • extensible
    • fast
    • fun
    • functional
    • garbage-collected
    • general-purpose
    • homoiconic
    • immutable
    • interactive
    • interop
    • multi-paradigm
    • portable
    • powerful
    • productive
    • safe
    • scientific
    • small
    • stable
    • statically-typed
    • tooling
    • web
    • widely-used

これらのアイコンの見た目は、主な特徴のアイコンのセクションで確認できます。

主な特徴はちょうど6つ指定しなければなりません。

例

{
  "key_features": [
    {
      "title": "Fault-tolerant",
      "content": "Elixir runs on the Erlang VM, known for running low-latency, distributed and fault-tolerant systems.",
      "icon": "safe"
    },
    ...
  ],
}

タグ

トラックにはタグを付けられます。これにより、特定のタグの組み合わせでトラックを検索できます。

トラックは、その言語が一般的にどのように使われているかに基づいてタグを選ぶとよいでしょう。たとえば、学習者が「機械学習をやりたいけど、どの言語を選べばいいんだろう?」とか「関数型プログラミングを学びたいけど、どの言語を選べばいいんだろう?」と考えていると想像してみてください。その言語がよい候補なら、そのタグを付けてください。関数型の考え方をいくつかサポートしていてもほとんど使われていなかったり、機械学習に使う人が少数いても珍しかったりする場合は、そのタグは付けないでください。

タグは、トップレベルのtagsフィールドで指定します。これは文字列の配列として定義されます。以下のタグが使えます(カテゴリ別に分類しています)。

パラダイム

  • paradigm/array: その言語は配列プログラミング言語です
  • paradigm/declarative: その言語は宣言的なプログラミングスタイルをサポートしています
  • paradigm/functional: その言語は関数型のプログラミングスタイルをサポートしています
  • paradigm/imperative: その言語は命令型のプログラミングスタイルをサポートしています
  • paradigm/logic: その言語は論理ベースのプログラミングスタイルをサポートしています
  • paradigm/object_oriented: その言語はオブジェクト指向のプログラミングスタイルをサポートしています
  • paradigm/procedural: その言語は手続き型のプログラミングスタイルをサポートしています
  • paradigm/stack-oriented: その言語はスタック指向のプログラミングスタイルをサポートしています

型付け

  • typing/static: その言語は静的型付けを使います
  • typing/gradual: その言語は漸進的型付けを使います
  • typing/dynamic: その言語は動的型付けを使います
  • typing/strong: その言語は強い型付けを使います
  • typing/weak: その言語は弱い型付けを使います

実行方式

  • execution_mode/compiled: コードは実行前にまずコンパイルされます
  • execution_mode/interpreted: コードは直接解釈されて実行されます

プラットフォーム

  • platform/windows: Windowsで動作します
  • platform/mac: Macで動作します
  • platform/linux: Linuxで動作します
  • platform/ios: iOSで動作します
  • platform/android: Androidで動作します
  • platform/web: ブラウザーで動作します

実行環境

  • runtime/standalone_executable: 単体の実行ファイルとして動作します
  • runtime/language_specific: 言語固有の実行環境で動作します
  • runtime/clr: Common Language Runtime(.NET)で動作します
  • runtime/jvm: JVM(Java)で動作します
  • runtime/beam: BEAM(Erlang)で動作します
  • runtime/wasmtime: Wasmtime(WebAssembly)で動作します

用途

  • used_for/artificial_intelligence: 人工知能
  • used_for/backends: バックエンド
  • used_for/cross_platform_development: クロスプラットフォーム開発
  • used_for/embedded_systems: 組み込みシステム
  • used_for/financial_systems: 金融システム
  • used_for/frontends: フロントエンド
  • used_for/games: ゲーム
  • used_for/guis: GUI
  • used_for/mobile: モバイル
  • used_for/robotics: ロボティクス
  • used_for/scientific_calculations: 科学技術計算
  • used_for/scripts: スクリプト
  • used_for/web_development: Web開発

1つのカテゴリから複数のタグを含めてもまったく問題ないことに注意してください。

例

{
  "tags": [
    "paradigm/declarative",
    "paradigm/functional",
    "paradigm/object_oriented",
    "platform/linux",
    "platform/windows",
    "runtime/jvm"
  ]
}

例

有効なconfig.jsonファイルがどのようになるかの例を次に示します。

{
  "language": "C#",
  "slug": "csharp",
  "active": true,
  "status": {
    "concept_exercises": true,
    "test_runner": true,
    "representer": false,
    "analyzer": false
  },
  "blurb": "C# is a modern, object-oriented language with lots of great features, such as type-inference and async/await. The tooling is excellent, and there is extensive, well-written documentation.",
  "version": 3,
  "online_editor": {
    "indent_style": "space",
    "indent_size": 4,
    "highlightjs_language": "csharp"
  },
  "test_runner": {
    "average_run_time": 2
  },
  "files": {
    "solution": [
      "%{pascal_slug}.cs"
    ],
    "test": [
      "%{pascal_slug}Tests.cs"
    ],
    "example": [
      ".meta/Example.cs"
    ],
    "exemplar": [
      ".meta/Exemplar.cs"
    ]
  },
  "exercises": {
    "concept": [
      {
        "slug": "lucians-luscious-lasagna",
        "name": "Lucian's Luscious Lasagna",
        "uuid": "7d358894-4fbd-4c91-b49f-d68f1c5aa6bc",
        "concepts": [
          "basics"
        ],
        "prerequisites": []
      },
      {
        "slug": "cars-assemble",
        "name": "Cars, Assemble!",
        "uuid": "93fbc7cf-3a7e-4450-ad22-e30129c36bb9",
        "concepts": [
          "if-statements",
          "numbers"
        ],
        "prerequisites": [
          "basics"
        ],
        "status": "wip"
      }
    ],
    "practice": [
      {
        "slug": "hello-world",
        "name": "Hello, World!",
        "uuid": "6c88f46b-5acb-4fae-a6ec-b48ae3f8168f",
        "practices": [
          "strings"
        ],
        "prerequisites": [
          "basics"
        ],
        "difficulty": 1
      },
      {
        "slug": "leap",
        "name": "Leap",
        "uuid": "8ba15933-29a2-49b1-a9ce-70474bad3007",
        "practices": [
          "if-statements",
          "numbers",
          "operator-precedence"
        ],
        "prerequisites": [
          "if-statements",
          "numbers"
        ],
        "difficulty": 2,
        "status": "beta"
      }
    ]
  },
  "concepts": [
    {
      "uuid": "2eb4a463-355f-46ef-ac55-a75ec5afdf86",
      "slug": "basics",
      "name": "Basics"
    },
    {
      "uuid": "4466e33e-dcd2-4b1f-9d9d-2c4315bf5188",
      "slug": "if-statements",
      "name": "If Statements"
    },
    {
      "uuid": "b9a421b2-c5ff-4213-bd6d-b886da31ea0d",
      "slug": "numbers",
      "name": "Numbers"
    },
    {
      "uuid": "7a86561d-173b-45c0-a53c-1ffd7b9ff259",
      "slug": "strings",
      "name": "Strings"
    }
  ],
  "key_features": [
    {
      "title": "Modern",
      "content": "C# is a modern, fast-evolving language.",
      "icon": "expressive"
    },
    {
      "title": "Cross-platform",
      "content": "C# runs on almost any platform and chipset.",
      "icon": "cross-platform"
    },
    {
      "title": "Multi-paradigm",
      "content": "C# is primarily an object-oriented language, but also has lots of functional features.",
      "icon": "multi-paradigm"
    },
    {
      "title": "General purpose",
      "content": "C# can be used for a wide variety of workloads, like websites, console applications, and even games.",
      "icon": "general-purpose"
    },
    {
      "title": "Tooling",
      "content": "C# has excellent tooling, with linting and advanced refactoring options built-in.",
      "icon": "tooling"
    },
    {
      "title": "Documentation",
      "content": "Documentation is excellent and exhaustive, making it easy to get started with C#.",
      "icon": "documentation"
    }
  ],
  "tags": [
    "paradigm/declarative",
    "paradigm/functional",
    "paradigm/object_oriented",
    "platform/linux",
    "platform/windows",
    "runtime/jvm"
  ]
}