第19章 移行ガイド


19.1. Business Resource Planner の移行の概要

Business Resource Planner は、Red Hat JBoss BRMS および Red Hat JBoss BPM Suite の 6.1 以降で完全に対応しています。Business Resource Planner は、計画問題を解決できる、軽量で、埋め込み可能な制約充足エンジンです。Business Resource Planner にはパブリック API が含まれ、6.2 や 6 などの後続バージョンに後方互換が組み込まれます。詳細は、Business Resource Planner ドキュメンテーションを参照してください。

JBoss BPM Suite および JBoss BRMS の 6.1 以降に、以下の変更が実装されました。

  • 焼きなまし法では、最後のステップではなく、現在のステップの時間勾配が使用されます。この変更の影響はごくわずかです。
  • AbstractScore では、parseLevelStrings(…​) メソッドおよび buildScorePattern(…​) メソッドが、public から protected に変更になりました。コードがこの変更の影響を受ける可能性は極めて低いです。
  • Descriptor クラスのパッケージが、記述子パッケージへ変更になりました。SolutionDescriptor.isInitialized(Solution) には ScoreDirector パラメーターが必要になります。
  • 力まかせ (Brute Force) よりも優れた選択肢として分岐限定 (Branch And Bound) があります。詳細はドキュメンテーションを参照してください。
  • InverseRelationShadowVariableListener の名前が SingletonInverseVariableListener に変更になり、InverseRelationShadowVariableDescriptor とともに、パッケージが ...impl.domain.variable.inverserelation に変更になりました。
  • (非推奨になっていた) ConstraintOccurrence クラスが削除されたため、ConstraintMatch システムに切り替える必要があります。
  • Solution インターフェースがパブリック API になり、パッケージが impl.solution から api.domain.solution へ変更になりました。

    以前の *.java :

    import org.optaplanner.core.impl.solution.Solution;

    現在の *.java :

    import org.optaplanner.core.api.domain.solution.Solution;
  • impl.move パッケージのクラスはすべて impl.heuristic.move に変更になりました。現時点では、パブリック API に追加されるかどうかは予測できないため、できる限り一般的な Move を使用することが推奨されます。

    以前の *.java :

    import org.optaplanner.core.impl.move.Move;
    import org.optaplanner.core.impl.move.CompositeMove;
    import org.optaplanner.core.impl.move.NoChangeMove;

    現在の *.java :

    import org.optaplanner.core.impl.heuristic.move.Move;
    import org.optaplanner.core.impl.heuristic.move.CompositeMove;
    import org.optaplanner.core.impl.heuristic.move.NoChangeMove;
  • すべてのクラスパスリソースにある先頭のスラッシュは削除する必要があります。Business Resource Planner では、このリソースは、Class.getResource(String) ではなく ClassLoader.getResource(String) を遵守する必要があります。

    • SolverFactory.createFromXmlResource(String) パラメーターの、先頭のスラッシュは削除する必要があります。

      以前の *.java :

      ... = SolverFactory.createFromXmlResource(
      "/org/optaplanner/examples/cloudbalancing/solver/cloudBalancingSolverConfig.xml");

      現在の *.java :

      ... = SolverFactory.createFromXmlResource(
      "org/optaplanner/examples/cloudbalancing/solver/cloudBalancingSolverConfig.xml");
    • <scoreDrl> のすべての要素で、先頭のスラッシュは削除する必要があります。

      以前の *SolverConfig.xml および *BenchmarkConfig.xml :

      <scoreDrl>/org/optaplanner/examples/cloudbalancing/solver/cloudBalancingScoreRules.drl</scoreDrl>

      現在の *SolverConfig.xml および *BenchmarkConfig.xml :

      <scoreDrl>org/optaplanner/examples/cloudbalancing/solver/cloudBalancingScoreRules.drl</scoreDrl>
    • PlannerBenchmarkFactory.createFromXmlResource(String) パラメーターの、先頭のスラッシュは削除する必要があります。

      以前の *.java :

      ... = PlannerBenchmarkFactory.createFromXmlResource(
          "/org/optaplanner/examples/cloudbalancing/benchmark/cloudBalancingBenchmarkConfig.xml");

      現在の *.java :

      ... = PlannerBenchmarkFactory.createFromXmlResource(
          "org/optaplanner/examples/cloudbalancing/benchmark/cloudBalancingBenchmarkConfig.xml");
    • PlannerBenchmarkFactory.createFromFreemarkerXmlResource(String) パラメーターの、先頭のスラッシュは削除する必要があります。

      以前の *.java :

      ... = PlannerBenchmarkFactory.createFromFreemarkerXmlResource(
      "/org/optaplanner/examples/cloudbalancing/benchmark/cloudBalancingBenchmarkConfigTemplate.xml.ftl");

      現在の *.java :

      ... = PlannerBenchmarkFactory.createFromFreemarkerXmlResource(
      "org/optaplanner/examples/cloudbalancing/benchmark/cloudBalancingBenchmarkConfigTemplate.xml.ftl");
  • 連鎖された @PlanningVariable プロパティは、graphType にリファクタリングされました。これは、将来的に別のグラフタイプ (TREE など) に対応できるようにするためです。

    以前の *.java :

    @PlanningVariable(chained = true, ...)
    public Standstill getPreviousStandstill() {
        return previousStandstill;
    }

    現在の *.java :

    @PlanningVariable(graphType = PlanningVariableGraphType.CHAINED, ...)
    public Standstill getPreviousStandstill() {
        return previousStandstill;
    }
  • constructionHeuristicTypeBEST_FIT の名前が WEAKEST_FIT に変更になりました。「Best Fit (最良適合)」という用語は適切ではなく、STRONGEST_FIT は許可されませんでした。

    以前の *SolverConfig.xml および *BenchmarkConfig.xml :

    <constructionHeuristic>
      <constructionHeuristicType>BEST_FIT</constructionHeuristicType>
    </constructionHeuristic>

    現在の *SolverConfig.xml および *BenchmarkConfig.xml :

    <constructionHeuristic>
      <constructionHeuristicType>WEAKEST_FIT</constructionHeuristicType>
    </constructionHeuristic>
  • constructionHeuristicTypeBEST_FIT_DECREASING の名前が WEAKEST_FIT_DECREASING になりました。「Best Fit (最良適合)」という用語は適切ではなく、STRONGEST_FIT_DECREASING は許可されませんでした。

    以前の *SolverConfig.xml および *BenchmarkConfig.xml :

    <constructionHeuristic>
      <constructionHeuristicType>BEST_FIT_DECREASING</constructionHeuristicType>
    </constructionHeuristic>

    現在の *SolverConfig.xml および *BenchmarkConfig.xml :

    <constructionHeuristic>
      <constructionHeuristicType>WEAKEST_FIT_DECREASING</constructionHeuristicType>
    </constructionHeuristic>
  • 双方向関係のシャドウ変数では、宣言が @PlanningVariable(mappedBy) から @InverseRelationShadowVariable(sourceVariableName) に変更になりました。

    以前の *.java :

    @PlanningVariable(mappedBy = "previousStandstill")
    Customer getNextCustomer();
    void setNextCustomer(Customer nextCustomer);

    現在の *.java :

    @InverseRelationShadowVariable(sourceVariableName = "previousStandstill")
    Customer getNextCustomer();
    void setNextCustomer(Customer nextCustomer);
  • 複数の <planningEntityClass> 要素では、スーパークラス (およびスーパーインターフェース) が命令される順番が、最後から最初に変更になりました。

    以前の *SolverConfig.xml および *BenchmarkConfig.xml :

    <planningEntityClass>...TimeWindowedCustomer</planningEntityClass>
    <planningEntityClass>...Customer</planningEntityClass>
    <planningEntityClass>...Standstill</planningEntityClass>

    現在の *SolverConfig.xml および *BenchmarkConfig.xml :

    <planningEntityClass>...Standstill</planningEntityClass>
    <planningEntityClass>...Customer</planningEntityClass>
    <planningEntityClass>...TimeWindowedCustomer</planningEntityClass>
  • <planningEntityClass> 要素の <entityClass> の名前が変更になりました。

    以前の *SolverConfig.xml および *BenchmarkConfig.xml :

    <planningEntityClass>org.optaplanner.examples.cloudbalancing.domain.CloudProcess</planningEntityClass>

    現在の *SolverConfig.xml および *BenchmarkConfig.xml :

    <entityClass>org.optaplanner.examples.cloudbalancing.domain.CloudProcess</entityClass>
  • XStreamScoreConverter および XStreamBendableScoreConverter のパッケージが変更になりました。

    以前の *.java :

    import org.optaplanner.persistence.xstream.XStreamScoreConverter;

    現在の *.java :

    import org.optaplanner.persistence.xstream.impl.score.XStreamScoreConverter;

    以前の *.java :

    import org.optaplanner.persistence.xstream.XStreamBendableScoreConverter;

    現在の *.java :

    import org.optaplanner.persistence.xstream.impl.score.XStreamBendableScoreConverter;
  • カスタムの Move を実装している場合は、AbstractMove を展開します。

    以前の *.java :

    public class CloudComputerChangeMove implements Move {...}

    現在の *.java :

    public class CloudComputerChangeMove extends AbstractMove {...}

19.2. 値および値の範囲の計画

19.2.1. ValueRangeProvider

収集された数 (たとえば List<Integer> または List<BigDecimal>) を返す @ValueRangeProvider がある場合は、メモリー使用が少なく、さらなる機会を提供できる ValueRange に切り替える必要があります。

例:

@ValueRangeProvider(id = "delayRange")
public List<Integer> getDelayRange() {
    List<Integer> = new ArrayList<Integer>(5000);
    for (int i = 0; i < 5000; i++) {
        delayRange.add(i);
    }
    return delayRange;
}

これは、以下に変更になりました。

@ValueRangeProvider(id = "delayRange")
public CountableValueRange<Integer> getDelayRange() {
    return ValueRangeFactory.createIntValueRange(0, 5000);
}
注記

アノテーション @ValueRangeProvider は、以下のパッケージから移動しました。

import org.optaplanner.core.api.domain.value.ValueRangeProvider;

以下に変更になりました。

import org.optaplanner.core.api.domain.valuerange.ValueRangeProvider;

19.2.2. プランニング変数

PlanningVariableListener インターフェースの名前が VariableListener に変更になりました。

以前の *.java :

public class VehicleUpdatingVariableListener implements PlanningVariableListener<Customer> {

現在の *.java :

public class VehicleUpdatingVariableListener implements VariableListener<Customer> {

AbstractPlanningVariableListener クラスは削除されました。

以前の *.java :

public class VehicleUpdatingVariableListener extends AbstractPlanningVariableListener<Customer> {

現在の *.java :

public class VehicleUpdatingVariableListener implements VariableListener<Customer> {

VariableListener は、@PlanningVariable ではなく、シャドウ変数で宣言されるようになりました。このように、Business Rules Planner はシャドウ変数を認識し、すべてのシャドウ変数は、一貫した内容で宣言されます。さらに、これにより、シャドウ変数が、別のシャドウ変数に基づくことができます。

以前の *.java :

@PlanningVariable(valueRangeProviderRefs = {"vehicleRange", "customerRange"},
        graphType = PlanningVariableGraphType.CHAINED,
        variableListenerClasses = {VehicleUpdatingVariableListener.class, ArrivalTimeUpdatingVariableListener.class})
public Standstill getPreviousStandstill() {
    return previousStandstill;
}

public Vehicle getVehicle() {
    return vehicle;
}

public Integer getArrivalTime() {
    return arrivalTime;
}

現在の *.java :

@PlanningVariable(...)
public Standstill getPreviousStandstill() {
    return previousStandstill;
}

@CustomShadowVariable(variableListenerClass = VehicleUpdatingVariableListener.class,
        sources = {@CustomShadowVariable.Source(variableName = "previousStandstill")})
public Vehicle getVehicle() {
    return vehicle;
}

@CustomShadowVariable(variableListenerClass = ArrivalTimeUpdatingVariableListener.class,
        sources = {@CustomShadowVariable.Source(variableName = "previousStandstill")})
public Integer getArrivalTime() {
    return arrivalTime;
}

追加設定をしなくても、連鎖変数のアンカーを表わすシャドウ変数に対応するようになりました。たとえば、VRP では、各顧客 (エンティティ) がそれぞれ所有する車 (アンカー) を知る必要があります。この宣言サポートにより、計算を繰り返さなくても、組み込みセレクターがその情報を再利用できます。

以前の *.java :

@PlanningEntity
public class Customer implements Standstill {

    @PlanningVariable(...)
    public Standstill getPreviousStandstill() {...}

    @CustomShadowVariable(variableListenerClass = VehicleUpdatingVariableListener.class,
            sources = {@CustomShadowVariable.Source(variableName = "previousStandstill")})
    public Vehicle getVehicle() {...}

}
public class VehicleUpdatingVariableListener implements VariableListener<Customer> {
    ...
}

現在の *.java :

@PlanningEntity
public class Customer implements Standstill {

    @PlanningVariable(...)
    public Standstill getPreviousStandstill() {...}

    @AnchorShadowVariable(sourceVariableName = "previousStandstill")
    public Vehicle getVehicle() {...}
}

VRP ケースをスケールしなくても、近傍選択は重要です。ようやく完全対応となり、ドキュメントが作成されました。

19.3. ベンチマーク

新しいアグリゲーター機能に対応するために、ベンチマークの内部が完全にリファクタリングされました。

  • 「費やす時間 (time spend)」フェーズの名前が「費やした時間 (time spent)」に変更になりました。これには、ログ出力と、ベンチマークレポートが含まれます。

<warmUp*> 要素の名前が変更になりました。

  • <warmUpTimeMillisSpend> 要素の名前が <warmUpMillisecondsSpentLimit> に変更になりました。
  • <warmUpSecondsSpend> 要素の名前が <warmUpSecondsSpentLimit> に変更になりました。
  • <warmUpMinutesSpend> 要素の名前が <warmUpMinutesSpentLimit> に変更になりました。
  • <warmUpHoursSpend> 要素の名前が <warmUpHoursSpentLimit> に変更になりました。

以前の *BenchmarkConfig.xml

<plannerBenchmark>
  <warmUpTimeMillisSpend>...</warmUpTimeMillisSpend>
  <warmUpSecondsSpend>...</warmUpSecondsSpend>
  <warmUpMinutesSpend>...</warmUpMinutesSpend>
  <warmUpHoursSpend>...</warmUpHoursSpend>
  ...
</plannerBenchmark>

現在の *BenchmarkConfig.xml :

<plannerBenchmark>
  <warmUpMillisecondsSpentLimit>...</warmUpMillisecondsSpentLimit>
  <warmUpSecondsSpentLimit>...</warmUpSecondsSpentLimit>
  <warmUpMinutesSpentLimit>...</warmUpMinutesSpentLimit>
  <warmUpHoursSpentLimit>...</warmUpHoursSpentLimit>
  ...
</plannerBenchmark>

XmlPlannerBenchmarkFactory クラスは削除され、PlannerBenchmarkFactory の静的メソッドに置き換わりました。

以前の *.java :

PlannerBenchmarkFactory plannerBenchmarkFactory = new XmlPlannerBenchmarkFactory(...);

現在の *.java :

PlannerBenchmarkFactory plannerBenchmarkFactory = PlannerBenchmarkFactory.createFromXmlResource(...);
注記

addXstreamAnnotations() メソッドを使用する場合は、非パブリックの API クラス XStreamXmlPlannerBenchmarkFactory に目を通してください。

<xstreamAnnotatedClass> 要素の名前が <xStreamAnnotatedClass> に変更になりました。

以前の *BenchmarkConfig.xml

<problemBenchmarks>
  <xstreamAnnotatedClass>org.optaplanner.examples.nqueens.domain.NQueens</xstreamAnnotatedClass>
  ...
</problemBenchmarks>

現在の *BenchmarkConfig.xml :

<problemBenchmarks>
  <xStreamAnnotatedClass>org.optaplanner.examples.nqueens.domain.NQueens</xStreamAnnotatedClass>
  ...
</problemBenchmarks>

19.3.1. SolutionFileIO

ProblemIO の名前が SolutionFileIO に変更になり、パッケージが変更になりました (パブリック API に追加されました)。

以前の *.java :

import org.optaplanner.core.impl.solution.ProblemIO;
public class MachineReassignmentFileIO implements ProblemIO {
    ...
}

現在の *.java :

import org.optaplanner.persistence.common.api.domain.solution.SolutionFileIO;
public class MachineReassignmentFileIO implements SolutionFileIO {
    ...
}

現在の *.java :

以前の *SolverConfig.xml および *BenchmarckConfig.xml :

<problemBenchmarks>
<problemIOClass>...MachineReassignmentProblemIO</problemIOClass>
...
</problemBenchmarks>

現在の *SolverConfig.xml および *BenchmarckConfig.xml :

<problemBenchmarks>
<solutionFileIOClass>...MachineReassignmentFileIO</solutionFileIOClass>
...
</problemBenchmarks>

メソッド SolutionFileIO.getFileExtension()getInputFileExtension()getOutputFileExtension(); に分かれましたが、ファイル拡張には、入力と出力で同じものを使用することが強く推奨されます。

以前の *.java :

public String getFileExtension() {
    return FILE_EXTENSION;
}

現在の *.java :

public String getInputFileExtension() {
    return FILE_EXTENSION;
}
public String getOutputFileExtension() {
    return FILE_EXTENSION;
}

19.4. Solver の設定

Solver および BestSolutionChangedEvent では、getTimeMillisSpend() メソッドの名前が getTimeMillisSpent() に変更になりました。

以前の *.java :

... = solver.getTimeMillisSpend();

現在の *.java :

... = solver.getTimeMillisSpent();

以前の *.java :

public void bestSolutionChanged(BestSolutionChangedEvent event) {
    ... = event.getTimeMillisSpend();
}

現在の *.java :

public void bestSolutionChanged(BestSolutionChangedEvent event) {
    ... = event.getTimeMillisSpent();
}

Solver フェーズ <bruteForce> が、<exhaustiveSearch>BRUTE_FORCE タイプに置き換わりました。

以前の *SolverConfig.xml および *BenchmarkConfig.xml :

<bruteForce/>

現在の *SolverConfig.xml および *BenchmarkConfig.xml :

<exhaustiveSearch>
  <exhaustiveSearchType>BRUTE_FORCE</exhaustiveSearchType>
</exhaustiveSearch>

setPlanningProblem(Solution) メソッドと solve() メソッドが 1 つになり、solve(Solution) メソッドとなりました。

以前の *.java :

solver.setPlanningProblem(planningProblem);
solver.solve();

現在の *.java :

solver.solve(planningProblem);
注記

最適解を得るためには、引き続き solver.getBestSolution() を使用する必要があります。このメソッドは、今後最適化が必要なくなった場合の対応や、リアルタイムの計画を目的に、意図的に使用されています。

XmlSolverFactory (パブリック API ではない) クラスが削除され、(パブリック API である) SolverFactory の静的メソッドに置き換わりました。

以前の *.java :

SolverFactory solverFactory = new XmlSolverFactory("...solverConfig.xml");

現在の *.java :

SolverFactory solverFactory = SolverFactory.createFromXmlResource("...solverConfig.xml");

以前の *.java :

SolverFactory solverFactory = new XmlSolverFactory().configure(inputStream);

現在の *.java :

SolverFactory solverFactory = SolverFactory.createFromXmlInputStream(inputStream);

以前の *.java :

SolverFactory solverFactory = new XmlSolverFactory().configure(reader);

現在の *.java :

SolverFactory solverFactory = SolverFactory.createFromXmlReader(reader);
注記

addXstreamAnnotations() メソッドを使用する場合は、非パブリックの API クラス XStreamXmlSolverFactory に目を通してください。

カスタムの SolverPhase に、以下の変更が加えられました。

  • CustomSolverPhaseCommand インターフェースの名前が CustomPhaseCommand に変更になりました。
  • <customSolverPhase> 要素の名前が <customPhase> に変更になりました。
  • <customSolverPhaseCommandClass> 要素の名前が >customPhaseCommandClass> に変更になりました。

以前の *.java :

public class ToOriginalMachineSolutionInitializer implements CustomSolverPhaseCommand {
    ...
}

現在の *.java :

public class ToOriginalMachineSolutionInitializer implements CustomPhaseCommand {
    ...
}

以前の *SolverConfig.xml および *BenchmarkConfig.xml :

<customSolverPhase>
  <customSolverPhaseCommandClass>...ToOriginalMachineSolutionInitializer</customSolverPhaseCommandClass>
</customSolverPhase>

現在の *SolverConfig.xml および *BenchmarkConfig.xml :

<customPhase>
  <customPhaseCommandClass>....ToOriginalMachineSolutionInitializer</customPhaseCommandClass>
</customPhase>

ScoreDefinition.getLevelCount() メソッドの名前が ScoreDefinition.getLevelsSize() に変更になりました。

19.5. 最適化

19.5.1. 終了

<termination> の子要素はすべて、名前が変更になりました。

  • <maximumTimeMillisSpend> 要素の名前が <millisecondsSpentLimit> に変更になりました。
  • <maximumSecondsSpend> 要素の名前が <secondsSpentLimit> に変更になりました。
  • <maximumMinutesSpend> 要素の名前が <minutesSpentLimit> に変更になりました。
  • <maximumHoursSpend> 要素の名前が <hoursSpentLimit> に変更になりました。
  • <scoreAttained> 要素の名前が <bestScoreLimit> に変更になりました。
  • <maximumStepCount> 要素の名前が <stepCountLimit> に変更になりました。
  • <maximumUnimprovedStepCount> 要素の名前が <unimprovedStepCountLimit> に変更になりました。

以前の *SolverConfig.xml および *BenchmarkConfig.xml :

<termination>
  <maximumTimeMillisSpend>...</maximumTimeMillisSpend>
  <maximumSecondsSpend>...</maximumSecondsSpend>
  <maximumMinutesSpend>...</maximumMinutesSpend>
  <maximumHoursSpend>...</maximumHoursSpend>
  <scoreAttained>...</scoreAttained>
  <maximumStepCount>...</maximumStepCount>
  <maximumUnimprovedStepCount>...</maximumUnimprovedStepCount>
</termination>

以下のようになります。

<termination>
  <millisecondsSpentLimit>...</millisecondsSpentLimit>
  <secondsSpentLimit>...</secondsSpentLimit>
  <minutesSpentLimit>...</minutesSpentLimit>
  <hoursSpentLimit>...</hoursSpentLimit>
  <bestScoreLimit>...</bestScoreLimit>
  <stepCountLimit>...</stepCountLimit>
  <unimprovedStepCountLimit>...</unimprovedStepCountLimit>
</termination>

19.5.2. イベント

BestSolutionChangedEvent クラスおよび SolverEventListener クラスが、impl.event to api.solver.event パッケージから削除され、パブリック api に追加されました。

以前の *.java :

import org.optaplanner.core.impl.event.BestSolutionChangedEvent;
import org.optaplanner.core.impl.event.SolverEventListener;

現在の *.java :

import org.optaplanner.core.api.solver.event.BestSolutionChangedEvent;
import org.optaplanner.core.api.solver.event.SolverEventListener;

19.5.4. スコア計算プログラム

SimpleScoreCalculator インターフェースの名前が EasyScoreCalculator になりました。これにより、別のスコアタイプを返す SimpleScore と区別がつきやすくなりました。同様に、パッケージ名も変更になりました。

以前の *.java :

import org.optaplanner.core.impl.score.director.simple.SimpleScoreCalculator;

public class CloudBalancingEasyScoreCalculator implements SimpleScoreCalculator<CloudBalance> {
    ...
}

現在の *.java :

import org.optaplanner.core.impl.score.director.easy.EasyScoreCalculator;

public class CloudBalancingEasyScoreCalculator implements EasyScoreCalculator<CloudBalance> {
    ...
}

以前の *SolverConfig.xml および *BenchmarkConfig.xml :

<simpleScoreCalculatorClass>org.optaplanner.examples.cloudbalancing.solver.score.CloudBalancingEasyScoreCalculator<simpleScoreCalculatorClass>

現在の *SolverConfig.xml および *BenchmarkConfig.xml :

<easyScoreCalculatorClass>org.optaplanner.examples.cloudbalancing.solver.score.CloudBalancingEasyScoreCalculator

BendableScore 設定が変更し、…​LevelCount の名前が …​LevelsSize に変更になりました。

以前の *SolverConfig.xml および *BenchmarkConfig.xml :

<scoreDirectorFactory>
  <scoreDefinitionType>BENDABLE</scoreDefinitionType>
  <bendableHardLevelCount>2</bendableHardLevelCount>
  <bendableSoftLevelCount>3</bendableSoftLevelCount>
  ...
</scoreDirectorFactory>

現在の *SolverConfig.xml および *BenchmarkConfig.xml :

<scoreDirectorFactory>
  <scoreDefinitionType>BENDABLE</scoreDefinitionType>
  <bendableHardLevelsSize>2</bendableHardLevelsSize>
  <bendableSoftLevelsSize>3</bendableSoftLevelsSize>
  ...
</scoreDirectorFactory>
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.