[{"data":1,"prerenderedAt":755},["ShallowReactive",2],{"/ja-jp/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo":3,"navigation-ja-jp":40,"banner-ja-jp":440,"footer-ja-jp":450,"blog-post-authors-ja-jp-Michael Friedrich":656,"blog-related-posts-ja-jp-refactor-code-into-modern-languages-with-ai-powered-gitlab-duo":670,"assessment-promotions-ja-jp":708,"next-steps-ja-jp":746},{"id":4,"title":5,"authorSlugs":6,"body":8,"categorySlug":9,"config":10,"content":14,"description":8,"extension":27,"isFeatured":12,"meta":28,"navigation":29,"path":30,"publishedDate":20,"seo":31,"stem":35,"tagSlugs":36,"__hash__":39},"blogPosts/ja-jp/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo.yml","Refactor Code Into Modern Languages With Ai Powered Gitlab Duo",[7],"michael-friedrich",null,"ai-ml",{"slug":11,"featured":12,"template":13},"refactor-code-into-modern-languages-with-ai-powered-gitlab-duo",false,"BlogPost",{"title":15,"description":16,"authors":17,"heroImage":19,"date":20,"body":21,"category":9,"tags":22,"updatedDate":26},"AI搭載のGitLab Duoでコードをモダンな言語にリファクタリング","この詳細なチュートリアルでは、デベロッパーがAIを活用し、コードを新しいプログラミング言語に移行してモダナイゼーションを進めるプロセスや、同じ言語における新機能についても学べる内容を紹介しています。",[18],"Michael Friedrich","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662465/Blog/Hero%20Images/GitLab_Duo_Workflow_Unified_Data_Store__1_.png","2024-08-26","コードベースやフレームワークのモダナイゼーションを行うために新しいプログラミング言語へ移行する必要があったり、同じ言語内の新しい機能の知識を深めたい場合は、AI搭載の[GitLab Duo](https://about.gitlab.com/gitlab-duo/)が有効です。ここでは、筆者が過去20年にわたるコーディングキャリアで培ったベストプラクティスをもとに、コードリファクタリングの際に直面する課題への効果的なアプローチ方法をご紹介します。\n\nこの記事では、VS CodeとJetBrains IDE（IntelliJ IDEA、PyCharm、CLion）を使用したプロンプトと例を紹介します。いずれのIDEにも[GitLab Duo拡張機能やプラグイン](https://docs.gitlab.com/ee/user/project/repository/code_suggestions/supported_extensions.html)がインストールされています。開発環境としてはGitLab.comが使用されています。ここでは大規模言語モデル（LLM）がAnthropic Claude 3.5にアップデートされており、GitLab Duoの[コード提案](https://docs.gitlab.com/ee/user/gitlab_duo/#code-suggestions)と[Duo Chat](https://docs.gitlab.com/ee/user/gitlab_duo/#gitlab-duo-chat)に適用されています。これらの機能は卓越したパフォーマンスと効率性を発揮します。\n\nこの記事では必要なセクションだけを確認しても良いですし、上から順を追って読んでも構いません。また、自己学習に役立つソースコードや演習問題も用意しています。\n\n- モダンなプログラミング言語標準に合わせたコードのリファクタリング\n    - Java 7のコードを生成し、Java 8にリファクタリング\n    - C++標準に基づいたリファクタリング\n        - 移行：C++03をC++14にリファクタリング\n        - ダウングレード：C++23をC++11にリファクタリング\n    - COBOLの説明とリファクタリング\n- 異なる言語間でのリファクタリング\n    - CをRustにリファクタリング\n    - PerlをPythonにリファクタリング\n- その他のリファクタリング実践例\n    - JavaScriptのリファクタリング\n    - BashをZSHやSHにリファクタリング\n    - その他のユースケースやチュートリアル\n- 重要なポイント\n\n## モダンなプログラミング言語標準に合わせたコードのリファクタリング\n\n次のセクションでは、特定のプログラミング言語におけるリファクタリングの方法、言語固有の違いの説明、および理解の仕方について解説します。\n\n### Java 7のコードを生成し、Java 8にリファクタリング\n\nあるお客様から、GitLab DuoがJava 7をサポートしているかどうかのご質問が寄せられました。Java 7固有のコードを生成するためのコード提案とGitLab Chatのプロンプトをテストしている際、移行支援についても考えました。Anthropic Claude 3.5と同様に、GitLab Duoも言語固有の違いを理解できます。\n\n次の例では、コード提案を使用してJava 7のコードを生成するプロンプトを示しています。\n\n```java\n// Generate a new class for a File Manager. Use Java 7 features only.\nimport java.io.*;\nimport java.nio.file.*;\nimport java.util.*;\n\npublic class FileManager {\n    private Path rootDirectory;\n\n    public FileManager(String rootPath) throws IOException {\n        this.rootDirectory = Paths.get(rootPath);\n        if (!Files.exists(rootDirectory)) {\n            Files.createDirectories(rootDirectory);\n        }\n    }\n\n    public void createFile(String fileName, String content) throws IOException {\n        Path filePath = rootDirectory.resolve(fileName);\n        Files.write(filePath, content.getBytes(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);\n    }\n\n    public String readFile(String fileName) throws IOException {\n        Path filePath = rootDirectory.resolve(fileName);\n        return new String(Files.readAllBytes(filePath));\n    }\n\n    public void deleteFile(String fileName) throws IOException {\n        Path filePath = rootDirectory.resolve(fileName);\n        Files.delete(filePath);\n    }\n\n    public List\u003CString> listFiles() throws IOException {\n        List\u003CString> fileList = new ArrayList\u003C>();\n        try (DirectoryStream\u003CPath> stream = Files.newDirectoryStream(rootDirectory)) {\n            for (Path file : stream) {\n                fileList.add(file.getFileName().toString());\n            }\n        }\n        return fileList;\n    }\n\n    public void copyFile(String sourceFileName, String destinationFileName) throws IOException {\n        Path sourcePath = rootDirectory.resolve(sourceFileName);\n        Path destinationPath = rootDirectory.resolve(destinationFileName);\n        Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);\n    }\n\n    public void moveFile(String sourceFileName, String destinationFileName) throws IOException {\n        Path sourcePath = rootDirectory.resolve(sourceFileName);\n        Path destinationPath = rootDirectory.resolve(destinationFileName);\n        Files.move(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);\n    }\n\n    public long getFileSize(String fileName) throws IOException {\n        Path filePath = rootDirectory.resolve(fileName);\n        return Files.size(filePath);\n    }\n\n    public boolean fileExists(String fileName) {\n        Path filePath = rootDirectory.resolve(fileName);\n        return Files.exists(filePath);\n    }\n}\n```\n\nご自身のIDEで次の手順を進めてください。\n\n1. 生成されたコードを理解する：エディタでコード部分を選択（スクリーンショットの青色部分）し、GitLab Duo Chatに切り替えて、`/explain` スラッシュ(/) コマンドをプロンプトとして送信します。\n\n![GitLab Duo Chatで `/explain` スラッシュ(/) コマンドを使用して生成したコードを検証する](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/intellij_java7_generate_refactor.png)\n\n2. Java 7のコードをJava 8にリファクタリングする：エディタでコードを選択し、Chatに切り替えて、プロンプトを `/refactor using Java 8 features` に変更して送信します。\n3. リファクタリングの代替方法を練習する：新しいファイル `java8.java` を作成し、コード提案を使って `// Generate a new class for a File Manager. Use Java 8 features only.` というプロンプトでJava 8固有のコードを生成します。\n4. AI搭載のコード補完機能を使って、同じコンテキストでJava 8のコードの続きを記述します。\n\n次の録画ですべての手順をご覧になれます。\n\n\u003C!-- 空白行 -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/XKRv6uBkD2I\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- 空白行 -->\n\nソースコードは[GitLab Duo Challenge - Generate and refactor Java 7 to 8 project ]( https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-generate-refactor-java-7-to-8)で取得できます。\n\n### C++標準に基づいたリファクタリング\n\nC++の標準には長い歴史があり、安定性と成熟度には信頼があります。ターゲットとなるアーキテクチャやプラットフォームに応じて、サポートされる標準はホストのオペレーティングシステム上のコンパイラに依存します。\n\n筆者は自身のキャリアを通して、25種類の異なるLinuxおよびWindowsディストリビューションをサポートするオープンソースプロジェクトに関わり、新しい言語機能やC++標準に対するコンパイラのサポートが多様であることを実感してきました。2015年にはC++11の機能を採用し、それ以降C++14やC++17に触れることはありませんでした。\n\n関数やアルゴリズムを新しいC++標準にリファクタリングするのには多大な労力がかかり、その違いを説明する支援が必要でした。当時は、リファクタリングの調べものを、書籍やオンライン検索、Stack Overflow、そして時にはツールの助けを借りて行っていました。\n\nしかし、AI搭載のアシストやGitLab Duoの登場で状況は変わりました。コード提案やDuo Chatに、特定のC++標準に準拠したソースコードを提示するよう指示したり、異なる出力を比較したりできるようになったのです。\nしかし、AI搭載のアシストやGitLab Duoの登場で状況は変わりました。コード提案やDuo Chatに、特定のC++標準に準拠したソースコードを提示するよう指示したり、異なる出力を比較したりできるようになったのです。\n\n次の例では、C++03標準に特化したプロンプトを使用してソースコードを生成しています。これは、`.ini` 構成フォーマット用のシンプルなコンフィグパーサー（configparser）を実装しています。\n\n```c++\n/* iniフォーマットを解析できるconfigparserを作成\nC++03標準のみを使用\n */\n\n#include \u003Ciostream>\n#include \u003Cfstream>\n#include \u003Cstring>\n#include \u003Cmap>\n#include \u003Csstream>\n\nclass ConfigParser {\nprivate:\n    std::map\u003Cstd::string, std::map\u003Cstd::string, std::string> > config;\n\npublic:\n    ConfigParser() {}\n\n    bool parse(const std::string& filename) {\n        std::ifstream file(filename.c_str());\n        if (!file.is_open()) {\n            return false;\n        }\n\n        std::string line;\n        std::string currentSection;\n\n        while (std::getline(file, line)) {\n            // Trim whitespace\n            size_t first = line.find_first_not_of(\" \\t\");\n            size_t last = line.find_last_not_of(\" \\t\");\n            if (first == std::string::npos) continue; // Skip empty lines\n            line = line.substr(first, (last - first + 1));\n\n            if (line[0] == '[' && line[line.length() - 1] == ']') {\n                // This is a section\n                currentSection = line.substr(1, line.length() - 2);\n            } else {\n                // This is a key-value pair\n                size_t delimiterPos = line.find('=');\n                if (delimiterPos != std::string::npos) {\n                    std::string key = line.substr(0, delimiterPos);\n                    std::string value = line.substr(delimiterPos + 1);\n                    config[currentSection][key] = value;\n                }\n            }\n        }\n\n        file.close();\n        return true;\n    }\n\n    std::string getValue(const std::string& section, const std::string& key) const {\n        std::map\u003Cstd::string, std::map\u003Cstd::string, std::string> >::const_iterator sectionIt = config.find(section);\n        if (sectionIt != config.end()) {\n            std::map\u003Cstd::string, std::string>::const_iterator keyIt = sectionIt->second.find(key);\n            if (keyIt != sectionIt->second.end()) {\n                return keyIt->second;\n            }\n        }\n        return \"\";\n    }\n\n    void printConfig() const {\n        std::map\u003Cstd::string, std::map\u003Cstd::string, std::string> >::const_iterator sectionIt;\n        for (sectionIt = config.begin(); sectionIt != config.end(); ++sectionIt) {\n            std::cout \u003C\u003C \"[\" \u003C\u003C sectionIt->first \u003C\u003C \"]\" \u003C\u003C std::endl;\n            std::map\u003Cstd::string, std::string>::const_iterator keyIt;\n            for (keyIt = sectionIt->second.begin(); keyIt != sectionIt->second.end(); ++keyIt) {\n                std::cout \u003C\u003C keyIt->first \u003C\u003C \" = \" \u003C\u003C keyIt->second \u003C\u003C std::endl;\n            }\n            std::cout \u003C\u003C std::endl;\n        }\n    }\n};\n\nint main() {\n    ConfigParser parser;\n    if (parser.parse(\"config.ini\")) {\n        std::cout \u003C\u003C \"Config file parsed successfully.\" \u003C\u003C std::endl;\n        parser.printConfig();\n\n        std::cout \u003C\u003C \"Value of 'key1' in 'section1': \" \u003C\u003C parser.getValue(\"section1\", \"key1\") \u003C\u003C std::endl;\n    } else {\n        std::cout \u003C\u003C \"Failed to parse config file.\" \u003C\u003C std::endl;\n    }\n    return 0;\n}\n```\n\n同じプロンプトを、[コードの説明](https://docs.gitlab.com/ee/user/gitlab_duo_chat/examples.html#explain-code-in-the-ide)、[テスト生成](https://docs.gitlab.com/ee/user/gitlab_duo_chat/examples.html#write-tests-in-the-ide)、さらには[コードのリファクタリング](https://docs.gitlab.com/ee/user/gitlab_duo_chat/examples.html#refactor-code-in-the-ide)にも適用できます。たとえば、`/explain focus on C++03 features`、`/tests for C++03 features`、`/refactor into C++03` などです。\n次のC++標準は、GitLab Duoのコード提案を使用して動作を確認済みです。\n\n- C++03\n- C++11\n- C++14\n- C++17\n- C++20\n- C++23\n\nソースコードは、[Challenge - Refactor Cpp Standards Config Parser project](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-cpp-standards-config-parser)で取得できます。\n\nC++標準間でソースコードをリファクタリングする組み合わせは数多く存在します。次の例では、C++コードを最新バージョンにアップグレードするケースに焦点を当てています。一方、熱心なデベロッパーがC++20を使用したいものの、エンタープライズな顧客環境をサポートするためにC++11にダウングレードしなければならなかったというシナリオもテストしています。\n\n#### 移行：C++03をC++14にリファクタリング\n\nここでは、コードのモダナイゼーションを行い、C++03からC++14への変更点を理解することを目標とします。IDEで[03.cpp](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-cpp-standards-config-parser/-/blob/main/03.cpp?ref_type=heads)のソースコードを開き、選択した後、次のChatプロンプトを使用します。\n\n```markdown\n/refactor into C++14 and explain the changes\n（日本語訳：/C++14にリファクタリングし、変更を説明してください）\n```\n\nChatの回答例：\n\n```markdown\n…\n\n変更点の説明：\n\n1. デフォルトコンストラクタ: `ConfigParser() {}` を `ConfigParser() = default;` に変更し、デフォルトコンストラクタを使用しました。\n2. ファイルオープン: ファイルを開く際、`.c_str()` を削除しました。C++11以降では、`std::string` が直接サポートされています。\n3. ラムダ関数: 文字列のトリミング処理を行うラムダ関数trimを導入し、コードの可読性と再利用性を向上させました。\n4. 自動キーワード: 型推論のために様々な箇所で `auto` を使用し、コードの可読性を改善しました。\n5. 範囲ベースのforループ:  `printConfig` メソッド内で従来のforループを範囲ベースのforループに置き換え、より簡潔でエラーが少ない構造にしました。\n6. 構造化束縛: 範囲ベースのforループで構造化束縛を使用し、キーと値のペアに直接アクセスできるようにしました。\n7. 初期化付きif文: `getValue` メソッド内で、検索操作と条件チェックを1行で行える初期化付きif文を使用しました。\n8. 文字列メンバー関数: 文字列の最初と最後の文字を取得する際に、配列風のアクセスではなく `front()` と `back()` を使用しました。\n9. 初期化の統一: オブジェクトの生成時に `()` ではなく `{}` を使用する統一された初期化を採用しました。\n10. `std::endl` の削除： `std::endl` を `'\\n'` に置き換え、パフォーマンスを向上させました。`std::endl` は出力バッファーを強制的にフラッシュするためです。\n\nこれらの変更により、コードはよりモダンで簡潔になり、同じ機能を維持しつつ効率性が向上しています。\n\n```\n\n![コードに反映された変更](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp03_to_14_01.png)\n\n![コードに反映された変更2](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675060/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp03_to_14_02.png)\n\n#### ダウングレード：C++23をC++11にリファクタリング\n\n時に、デベロッパーはC++20のようなモダンなC++標準で新しい機能の概念実証を開始しますが、エンタープライズな顧客環境で実際にサポートされているバージョンでは、C++11をサポートする古いコンパイラが必要になる場合があります。バージョンをダウングレードするにはコストがかかるほか、どの言語機能がまだサポートされているかを確認し、潜在的なデメリットを検討する必要があります。\n\nIDEで[23.cpp](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-cpp-standards-config-parser/-/blob/main/23.cpp?ref_type=heads)のソースコードを開き、選択した後、次のChatプロンプトを使用します。\n\n```markdown\n/refactor into C++11, explain the necessary changes and potential problems\n（日本語訳：/C++14にリファクタリングし、必要な変更点と潜在的な問題点を説明してください）\n```\n\nDuo Chatの回答例：\n\n```markdown\nこのコードをC++11に対応させるために必要な主な変更点は次の通りです：\n\n1. C++23標準のコメントを削除しました。これはもう適用されないためです。\n2. trim関数内で `std::string::find_first_not_of` と  `std::string::find_last_not_of` をC++11対応の代替方法に置き換えました。\n3. ループ変数には `auto` の代わりに `const auto&` を使用し、不要なコピーを避けました。\n\nオリジナルのコードにおける潜在的な問題点は次の通りです：\n\n1. オリジナルのコードはC++23の機能を使用しており、まだ広くサポートされていない可能性があります。\n2. `trim` 関数では `std::string::find_first_not_of` と `std::string::find_last_not_of` を使用しており、これらはC++11には存在しません。\n3. 一部のループで `const auto&` の代わりに `auto` を使用していないと、複雑なオブジェクトが不必要にコピーされる可能性があります。\n\nこれらの問題はリファクタリング版で解決されています。`trim` 関数は、C++11対応の場合と同じ結果を得るために、ラムダ関数を使った `std::find_if_not` を利用するように変更されました。また、 `const auto&` を使用することで、設定マップを反復処理する際に不要なコピーが行われないようにしました。\n```\n\n![`trim` 関数は、C++11に対応する形で、ラムダ関数を使った `std::find_if_not` を使用して同じ結果をもたらすようになりました](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp23_to_11_01.png)\n\n![`const auto&` を使用することで、configマップを反復処理する際の不要なコピーの生成を防ぎ、パフォーマンスを最適化できます](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp23_to_11_02.png)\n\n**非同期練習**：他のバージョンのリファクタリングシナリオをテストしてみましょう。\n\n### COBOLの説明とリファクタリング\n\nGitLab Duoを使用して、COBOLプログラムのソースコードを説明させたり、解析、修正、リファクタリングを実行してもらえます。筆者はCOBOLを書いたことも学んだこともありませんでしたが、この[COBOL Programming Course](https://github.com/openmainframeproject/cobol-programming-course)では豊富な例が紹介されていて有用だと感じました。\n\nその後、次のように、Chatに「COBOLの始め方」「COBOLプログラムの作成方法」「macOSでのCOBOLプログラムのコンパイル方法」について質問しました。\n\n```markdown\nPlease explain what COBOL is and its syntax\n（日本語訳：COBOLとは何か、その構文について説明してください。）\n\nPlease create a COBOL program that shows the first steps\n（日本語訳：COBOLプログラムを作成し、最初のステップを示してください。）\n\nTell me more about the COBOL compiler. Which system do I need? Can I do it on my macOS?\n（日本語訳：COBOLコンパイラについて教えてください。どのようなシステムが必要ですか？ macOSで実行できますか？）\n```\t\n\n![GitLab Duo Chatに説明とその構文を求める](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/vscode_chat_cobol_generate_example.png)\n\nCOBOLプログラムを開き、ソースコードを選択したら、Duo Chatに切り替えて、`/explain` プロンプトを送信し、目的や機能を説明してもらいましょう。\n\nまた、プロンプトをさらに洗練して、全体像をより反映したサマリーを取得することもできます。\n\n```markdown /explain like I am five\n（日本語訳：/explain ５歳児にもわかるように説明してください。）\n```\n\n> ヒント：プログラミング言語は、類似したアルゴリズムや機能を共有しています。COBOLについては、ChatによるPythonを介した説明が提供されたため、以降のプロンプトではPythonでの説明を求めるように調整しました。\n\n```markdown\n/explain in a different programming language\n（日本語訳：/explain 異なるプログラミング言語で説明してください。）\n```\n\nChatでは、`/refactor` スラッシュ（/）コマンドを使用して、コード品質の改善、潜在的な問題の修正、およびCOBOLのPythonへのリファクタリングを実行できます。\n\n```markdown\n/refactor fix the environment error\n（日本語訳：/refactor 環境上のエラーを修正してください。）\n\n/refactor fix potential problems\n（日本語訳：/refactor 潜在的な問題を修正してください。）\n\n/refactor into Python\n（日本語訳：/refactor Pythonにリファクタリングしてください。）\n```\n\n次の[GitLab Duo Coffee Chat - Challenge: Explain and Refactor COBOL programs](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-explain-refactor-cobol-program)の録画では、欠落しているピリオドの見つけ方など、すべての手順が実際のユースケースをもとに説明されています。\n\n\u003C!-- 空白行 -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/pwlDmLQMMPo\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- 空白行 -->\n\n## 異なる言語間でのリファクタリング\n\nモダナイゼーションとコード品質の改善には、プログラミング言語の変更が必要になる場合があります。GitLab Duoのリファクタリングプロンプトを使用して、移行プロセスを迅速に進められますCOBOLとPythonの例は、エンタープライズ環境において一般的な要件のひとつに過ぎません。その他のユースケースを詳しく見ていきましょう。\n\n### CをRustにリファクタリング\n\n2024年初頭に、Cを始めとするいくつかのプログラミング言語は、メモリの安全性に問題があると指摘されました。今後のプロジェクトでは、Rustのような[メモリ安全な言語](https://about.gitlab.com/blog/memory-safe-vs-unsafe/)（英語）が推奨されています。ここでは、移行へのアプローチや、想定すべき課題について理解しましょう。\n\n簡単なCの例で試してみましょう。このコードはコード提案を使用して生成されており、オペレーティングシステムの基本情報（名前、バージョン、プラットフォームなど）を表示します。このCコードは、Windows、Linux、macOSでクロスプラットフォームにコンパイルできます。\n\n```c\n// OSファイルを読み込み、プラットフォーム、名前、バージョンを特定する\n// ターミナルに出力する\n#include \u003Cstdio.h>\n#include \u003Cstdlib.h>\n#include \u003Cstring.h>\n\n#ifdef _WIN32\n    #include \u003Cwindows.h>\n#elif __APPLE__\n    #include \u003Csys/utsname.h>\n#else\n    #include \u003Csys/utsname.h>\n#endif\n\nvoid get_os_info() {\n    #ifdef _WIN32\n        OSVERSIONINFOEX info;\n        ZeroMemory(&info, sizeof(OSVERSIONINFOEX));\n        info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);\n        GetVersionEx((OSVERSIONINFO*)&info);\n\n        printf(\"Platform: Windows\\n\");\n        printf(\"Version: %d.%d\\n\", info.dwMajorVersion, info.dwMinorVersion);\n        printf(\"Build: %d\\n\", info.dwBuildNumber);\n    #elif __APPLE__\n        struct utsname sys_info;\n        uname(&sys_info);\n\n        printf(\"Platform: macOS\\n\");\n        printf(\"Name: %s\\n\", sys_info.sysname);\n        printf(\"Version: %s\\n\", sys_info.release);\n    #else\n        struct utsname sys_info;\n        uname(&sys_info);\n\n        printf(\"Platform: %s\\n\", sys_info.sysname);\n        printf(\"Name: %s\\n\", sys_info.nodename);\n        printf(\"Version: %s\\n\", sys_info.release);\n    #endif\n}\n\nint main() {\n    get_os_info();\n    return 0;\n}\n```\n\nここでは、JetBrains CLionなどを使用して [`os.c`](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-c-to-rust/-/blob/897bf57a14bb7be07d842e7f044f93a61456d611/c/os.c) のソースコードを開きます。 ソースコードを選択し、Chatプロンプトで `/explain` を使用して目的や機能を説明します。次に、Chatプロンプトで `/refactor` を使用してCコードをリファクタリングし、さらに `/refactor into Rust` を使用してRustにリファクタリングします。\n\n新しいRustプロジェクトを初期化（ヒント：Duo Chatに質問してみましょう）し、生成されたソースコードを `src/main.rs` ファイルにコピーします。`cargo build` を実行してコードをコンパイルします。\n\n![新しいRustプロジェクトを初期化し、生成されたソースコードを `src/main.rs` ファイルにコピーします。`cargo build` を実行してコードをコンパイルします。](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/jetbrains_clion_c_rust.png)\n\n[GitLab Duo Coffee Chat: Challenge - Refactor C into Rust ]( https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-c-to-rust)の録画では、の録画では、すべての手順を確認できるほか、コンパイルエラーが発生し、それがChatと `/refactor` スラッシュ(/) コマンドによって修正される様子もご覧になれます。また、このセッションでは、新しいRustコードのメンテナンス性を向上させるために、エラーハンドリングを追加する方法も紹介されています。\n\n\u003C!-- 空白行 -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/nf8g2ucqvkI\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- 空白行 -->\n\n### PerlをPythonにリファクタリング\n\n本番環境サーバーでジョブを実行するスクリプトがありますが、作成者は10年前に退社しており、誰もそのスクリプトに手を付けたがりません。この問題は、複数のスクリプトや、さらにはアプリケーション全体にも影響している可能性があります。そこで、すべてをモダンなPython 3に移行する決定が下されました。ここでは、コードのモダナイゼーションを行い、PerlからPythonへの変更点を理解することを目標とします。\n\n最近、GitLab Duoのワークショップに参加したお客様から、GitLab Duoを使って直接移行が可能かどうかという質問がありました。一言でお答えすれば、「可能」です。これを詳しく説明するならば、この記事にある他の例と同様に、洗練されたChatプロンプトを使用することで、PerlコードをPythonにリファクタリングすることができます。\n\n`script.pl` ソースコードをIDEで開き、選択して、Chatを開きます。\n\n```perl\n#!/usr/bin/perl\nuse strict;\nuse warnings;\n\nopen my $md_fh, '\u003C', 'file.md' or die \"Could not open file.md: $!\";\n\nmy $l = 0;\nmy $e = 0;\nmy $h = 0;\n\nwhile (my $line = \u003C$md_fh>) {\n  $l++;\n  if ($line =~ /^\\s*$/) {\n    $e++;\n    next;\n  }\n  if ($line =~ /^#+\\s*(.+)/) {\n    print \"$1\\n\";\n    $h++;   }\n}\n\nprint \"\\nS:\\n\"; print \"L: $l\\n\";\nprint \"E: $e\\n\"; print \"H: $h\\n\";\n```\n\n次のプロンプトを使用できます：\n\n1. `/explain` でその目的を説明させ、 `/refactor` でコードを改善させます。\n2. `/refactor into Python`：実行可能なPythonスクリプトを取得します。\n\n![Pythonへのリファクタリング](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/pycharm_duo_refactor_perl_python.png)\n\n> ヒント：Perlコードは、より多くのターゲット言語にリファクタリングできます。[GitLab Duo Coffee Chat：チャレンジ - PerlからPythonへのリファクタリング](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-perl-python)の録画では、PHP、Ruby、Rust、Go、Java、VB.NET、C#などの言語も取り上げています。\n>\n> Perlスクリプトの使用を継続するには、Duoのコード提案で[Perlを追加言語として](https://docs.gitlab.com/ee/user/project/repository/code_suggestions/supported_extensions.html#add-support-for-more-languages)設定できます。ChatはすでにPerlを理解しており、質問やスラッシュ（/） コマンドのプロンプトにも対応できます。次の録画でこれについて確認できます。\n\n\u003C!-- 空白行 -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/03HGhxXg9lw\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- 空白行 -->\n\n## その他のリファクタリング実践例\n\n### JavaScriptのリファクタリング\n\nJavaScriptをリファクタリングしてコード品質を向上させたり、機能を追加したりする方法について、Eddie Jaoudeが実用的な例を交えて紹介しています。\n\n\u003C!-- 空白行 -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/mHn8KOzpPNY\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- 空白行 -->\n\n### BashをZSHやSHにリファクタリング\n\n筆者はBashをShellとして20年間使用していましたが、最近になってmacOSのZSHに移行しました。この移行に伴い、スクリプトが機能しなくなったり、端末に不明なエラーが発生したりしました。リファクタリングの別のユースケースとして、Shellの制約があります。たとえば、一部のオペレーティングシステムやLinux/Unixディストリビューション（Alpineなど）では、Bashが提供されておらず、SHしか使用できません。\n\n![シェルスクリプトのリファクタリング](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/intellj_refactor_shell_scripts.png)\n\n[GitLab Duo Coffee Chat: Challenge - Refactor Shell Scripts ]( https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-shell-scripts)では、syslogファイルを追跡するCプログラムと、Bashで記述されたビルドスクリプトの例が紹介されています。このチャレンジの中では、コードの改善を目的として、Chatに対して `/explain` や `/refactor` のプロンプトが使用されます。また、BashをPOSIX準拠のSHやZSHにリファクタリングすることもできます。セッションの最後では、Chatに5つの異なるShellスクリプトの実装を提供させ、そのサマリーについて説明するようリクエストしています。\n\n\u003C!-- 空白行 -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/mssqYjlKGzU\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- 空白行 -->\n\n### その他のユースケースとチュートリアル\n\n- [ドキュメント：GitLab Duoのユースケース](https://docs.gitlab.com/ee/user/gitlab_duo/use_cases.html)\n- [チュートリアル：AI搭載のGitLab Duoチャットを使用するためのベストプラクティス【10選】](https://about.gitlab.com/blog/top-tips-for-efficient-ai-powered-code-suggestions-with-gitlab-duo/)\n- [チュートリアル：AI搭載のGitLab Duoチャットを使用するためのベストプラクティス【10選】](https://about.gitlab.com/ja-jp/blog/10-best-practices-for-using-ai-powered-gitlab-duo-chat/)\n\n## 重要なポイント\n\n1. GitLab Duoは、コードの説明やリファクタリングにおいて効率的なサポートを提供します。\n1. 言語標準間でコードをリファクタリングしたり、Chatで追加の質問をしたりできます。\n1. コード提案のプロンプトは、特定の言語標準に基づいたコードを生成できます。また、コード補完は現行のコードのコンテキストを尊重します。\n1. 新しいプログラミング言語へのリファクタリングは、長期的な移行プロセスやモダナイゼーションの計画に有効です。\n1. コードは、古いシステムがサポートする言語標準に「ダウングレード」することもできます。\n1. GitLab Duoは、複雑なコードやプログラミング言語について、異なるプログラミング言語の例を用いて説明できます。\n1. GitLab.comにおけるAnthropic Claude 3.5へのアップデートにより、コード提案およびChatの質と速度がさらに向上しました（Self-Managed版では17.3へのアップグレードを推奨しています）。\n1. 本番環境における問題がある場合を除き、ユースケースはアイデア次第で無限に広がります。\n\nコード提案とChatを活用した効率的なワークフローについて理解を深めましょう。GitLab DuoのAI搭載コードリファクタリングを、今すぐお試しいただけます。\n\n> [GitLab Duoのの無料トライアルを開始しましょう！](https://about.gitlab.com/ja-jp/solutions/gitlab-duo-pro/sales/?type=free-trial&toggle=gitlab-duo-pro_)\n\n*監修：知念 梨果 [@rikachinen](https://gitlab.com/rikachinen)* \u003Cbr>\n*（GitLab合同会社 カスタマーサクセス本部 カスタマーサクセスエンジニア）*\n",[23,24,25],"AI/ML","tutorial","DevSecOps","2025-02-10","yml",{},true,"/ja-jp/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo",{"title":15,"description":16,"ogTitle":15,"ogDescription":16,"noIndex":12,"ogImage":19,"ogUrl":32,"ogSiteName":33,"ogType":34,"canonicalUrls":32},"https://about.gitlab.com/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo","https://about.gitlab.com","article","ja-jp/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo",[37,24,38],"aiml","devsecops","BnwrInF33vxVt3nwsySgHutZaqZbxGkVDAaqwiVJu_g",{"data":41},{"logo":42,"freeTrial":47,"sales":52,"login":57,"items":62,"search":370,"minimal":403,"duo":420,"pricingDeployment":430},{"config":43},{"href":44,"dataGaName":45,"dataGaLocation":46},"/ja-jp/","gitlab logo","header",{"text":48,"config":49},"無料トライアルを開始",{"href":50,"dataGaName":51,"dataGaLocation":46},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":53,"config":54},"お問い合わせ",{"href":55,"dataGaName":56,"dataGaLocation":46},"/ja-jp/sales/","sales",{"text":58,"config":59},"サインイン",{"href":60,"dataGaName":61,"dataGaLocation":46},"https://gitlab.com/users/sign_in/","sign in",[63,90,186,191,292,352],{"text":64,"config":65,"cards":67},"プラットフォーム",{"dataNavLevelOne":66},"platform",[68,74,82],{"title":64,"description":69,"link":70},"DevSecOpsに特化したインテリジェントオーケストレーションプラットフォーム",{"text":71,"config":72},"プラットフォームを詳しく見る",{"href":73,"dataGaName":66,"dataGaLocation":46},"/ja-jp/platform/",{"title":75,"description":76,"link":77},"GitLab Duo Agent Platform","ソフトウェアライフサイクル全体を支えるエージェント型AI",{"text":78,"config":79},"GitLab Duoのご紹介",{"href":80,"dataGaName":81,"dataGaLocation":46},"/ja-jp/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":83,"description":84,"link":85},"GitLabが選ばれる理由","エンタープライズがGitLabを選ぶ主な理由をご覧ください",{"text":86,"config":87},"詳細はこちら",{"href":88,"dataGaName":89,"dataGaLocation":46},"/ja-jp/why-gitlab/","why gitlab",{"text":91,"left":29,"config":92,"link":94,"lists":98,"footer":168},"製品",{"dataNavLevelOne":93},"solutions",{"text":95,"config":96},"すべてのソリューションを表示",{"href":97,"dataGaName":93,"dataGaLocation":46},"/ja-jp/solutions/",[99,124,146],{"title":100,"description":101,"link":102,"items":107},"自動化","CI/CDと自動化でデプロイを加速",{"config":103},{"icon":104,"href":105,"dataGaName":106,"dataGaLocation":46},"AutomatedCodeAlt","/ja-jp/solutions/delivery-automation/","automated software delivery",[108,112,115,120],{"text":109,"config":110},"CI/CD",{"href":111,"dataGaLocation":46,"dataGaName":109},"/ja-jp/solutions/continuous-integration/",{"text":75,"config":113},{"href":80,"dataGaLocation":46,"dataGaName":114},"gitlab duo agent platform - product menu",{"text":116,"config":117},"ソースコード管理",{"href":118,"dataGaLocation":46,"dataGaName":119},"/ja-jp/solutions/source-code-management/","Source Code Management",{"text":121,"config":122},"自動化されたソフトウェアデリバリー",{"href":105,"dataGaLocation":46,"dataGaName":123},"Automated software delivery",{"title":125,"description":126,"link":127,"items":132},"セキュリティ","セキュリティを犠牲にすることなくコード作成を高速化",{"config":128},{"href":129,"dataGaName":130,"dataGaLocation":46,"icon":131},"/ja-jp/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[133,137,142],{"text":134,"config":135},"Application Security Testing",{"href":129,"dataGaName":136,"dataGaLocation":46},"Application security testing",{"text":138,"config":139},"ソフトウェアサプライチェーンの安全性",{"href":140,"dataGaLocation":46,"dataGaName":141},"/ja-jp/solutions/supply-chain/","Software supply chain security",{"text":143,"config":144},"Software Compliance",{"href":145,"dataGaName":143,"dataGaLocation":46},"/ja-jp/solutions/software-compliance/",{"title":147,"link":148,"items":153},"測定",{"config":149},{"icon":150,"href":151,"dataGaName":152,"dataGaLocation":46},"DigitalTransformation","/ja-jp/solutions/visibility-measurement/","visibility and measurement",[154,158,163],{"text":155,"config":156},"可視性と測定",{"href":151,"dataGaLocation":46,"dataGaName":157},"Visibility and Measurement",{"text":159,"config":160},"バリューストリーム管理",{"href":161,"dataGaLocation":46,"dataGaName":162},"/ja-jp/solutions/value-stream-management/","Value Stream Management",{"text":164,"config":165},"分析とインサイト",{"href":166,"dataGaLocation":46,"dataGaName":167},"/ja-jp/solutions/analytics-and-insights/","Analytics and insights",{"title":169,"items":170},"GitLabが活躍する場所",[171,176,181],{"text":172,"config":173},"Enterprise",{"href":174,"dataGaLocation":46,"dataGaName":175},"/ja-jp/enterprise/","enterprise",{"text":177,"config":178},"スモールビジネス",{"href":179,"dataGaLocation":46,"dataGaName":180},"/ja-jp/small-business/","small business",{"text":182,"config":183},"公共機関",{"href":184,"dataGaLocation":46,"dataGaName":185},"/ja-jp/solutions/public-sector/","public sector",{"text":187,"config":188},"価格",{"href":189,"dataGaName":190,"dataGaLocation":46,"dataNavLevelOne":190},"/ja-jp/pricing/","pricing",{"text":192,"config":193,"link":195,"lists":199,"feature":279},"関連リソース",{"dataNavLevelOne":194},"resources",{"text":196,"config":197},"すべてのリソースを表示",{"href":198,"dataGaName":194,"dataGaLocation":46},"/ja-jp/resources/",[200,233,251],{"title":201,"items":202},"はじめに",[203,208,213,218,223,228],{"text":204,"config":205},"インストール",{"href":206,"dataGaName":207,"dataGaLocation":46},"/ja-jp/install/","install",{"text":209,"config":210},"クイックスタートガイド",{"href":211,"dataGaName":212,"dataGaLocation":46},"/ja-jp/get-started/","quick setup checklists",{"text":214,"config":215},"学ぶ",{"href":216,"dataGaLocation":46,"dataGaName":217},"https://university.gitlab.com/","learn",{"text":219,"config":220},"製品ドキュメント",{"href":221,"dataGaName":222,"dataGaLocation":46},"https://docs.gitlab.com/","product documentation",{"text":224,"config":225},"ベストプラクティスビデオ",{"href":226,"dataGaName":227,"dataGaLocation":46},"/ja-jp/getting-started-videos/","best practice videos",{"text":229,"config":230},"インテグレーション",{"href":231,"dataGaName":232,"dataGaLocation":46},"/ja-jp/integrations/","integrations",{"title":234,"items":235},"検索する",[236,241,246],{"text":237,"config":238},"お客様成功事例",{"href":239,"dataGaName":240,"dataGaLocation":46},"/ja-jp/customers/","customer success stories",{"text":242,"config":243},"ブログ",{"href":244,"dataGaName":245,"dataGaLocation":46},"/ja-jp/blog/","blog",{"text":247,"config":248},"リモート",{"href":249,"dataGaName":250,"dataGaLocation":46},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":252,"items":253},"つなげる",[254,259,264,269,274],{"text":255,"config":256},"GitLabサービス",{"href":257,"dataGaName":258,"dataGaLocation":46},"/ja-jp/services/","services",{"text":260,"config":261},"コミュニティ",{"href":262,"dataGaName":263,"dataGaLocation":46},"/community/","community",{"text":265,"config":266},"フォーラム",{"href":267,"dataGaName":268,"dataGaLocation":46},"https://forum.gitlab.com/","forum",{"text":270,"config":271},"イベント",{"href":272,"dataGaName":273,"dataGaLocation":46},"/events/","events",{"text":275,"config":276},"パートナー",{"href":277,"dataGaName":278,"dataGaLocation":46},"/ja-jp/partners/","partners",{"backgroundColor":280,"textColor":281,"text":282,"image":283,"link":287},"#2f2a6b","#fff","ソフトウェア開発の未来への洞察",{"altText":284,"config":285},"ソースプロモカード",{"src":286},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":288,"config":289},"最新情報を読む",{"href":290,"dataGaName":291,"dataGaLocation":46},"/ja-jp/the-source/","the source",{"text":293,"config":294,"lists":296},"会社情報",{"dataNavLevelOne":295},"company",[297],{"items":298},[299,304,310,312,317,322,327,332,337,342,347],{"text":300,"config":301},"GitLabについて",{"href":302,"dataGaName":303,"dataGaLocation":46},"/ja-jp/company/","about",{"text":305,"config":306,"footerGa":309},"採用情報",{"href":307,"dataGaName":308,"dataGaLocation":46},"/jobs/","jobs",{"dataGaName":308},{"text":270,"config":311},{"href":272,"dataGaName":273,"dataGaLocation":46},{"text":313,"config":314},"経営陣",{"href":315,"dataGaName":316,"dataGaLocation":46},"/company/team/e-group/","leadership",{"text":318,"config":319},"チーム",{"href":320,"dataGaName":321,"dataGaLocation":46},"/company/team/","team",{"text":323,"config":324},"ハンドブック",{"href":325,"dataGaName":326,"dataGaLocation":46},"https://handbook.gitlab.com/","handbook",{"text":328,"config":329},"投資家向け情報",{"href":330,"dataGaName":331,"dataGaLocation":46},"https://ir.gitlab.com/","investor relations",{"text":333,"config":334},"トラストセンター",{"href":335,"dataGaName":336,"dataGaLocation":46},"/ja-jp/security/","trust center",{"text":338,"config":339},"AI Transparency Center",{"href":340,"dataGaName":341,"dataGaLocation":46},"/ja-jp/ai-transparency-center/","ai transparency center",{"text":343,"config":344},"ニュースレター",{"href":345,"dataGaName":346,"dataGaLocation":46},"/company/contact/#contact-forms","newsletter",{"text":348,"config":349},"プレス",{"href":350,"dataGaName":351,"dataGaLocation":46},"/press/","press",{"text":53,"config":353,"lists":354},{"dataNavLevelOne":295},[355],{"items":356},[357,360,365],{"text":53,"config":358},{"href":55,"dataGaName":359,"dataGaLocation":46},"talk to sales",{"text":361,"config":362},"サポートポータル",{"href":363,"dataGaName":364,"dataGaLocation":46},"https://support.gitlab.com","support portal",{"text":366,"config":367},"カスタマーポータル",{"href":368,"dataGaName":369,"dataGaLocation":46},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":371,"login":372,"suggestions":379},"閉じる",{"text":373,"link":374},"リポジトリとプロジェクトを検索するには、次にログインします",{"text":375,"config":376},"GitLab.com",{"href":60,"dataGaName":377,"dataGaLocation":378},"search login","search",{"text":380,"default":381},"提案",[382,384,389,391,395,399],{"text":75,"config":383},{"href":80,"dataGaName":75,"dataGaLocation":378},{"text":385,"config":386},"コード提案（AI）",{"href":387,"dataGaName":388,"dataGaLocation":378},"/ja-jp/solutions/code-suggestions/","Code Suggestions (AI)",{"text":109,"config":390},{"href":111,"dataGaName":109,"dataGaLocation":378},{"text":392,"config":393},"GitLab on AWS",{"href":394,"dataGaName":392,"dataGaLocation":378},"/ja-jp/partners/technology-partners/aws/",{"text":396,"config":397},"GitLab on Google Cloud",{"href":398,"dataGaName":396,"dataGaLocation":378},"/ja-jp/partners/technology-partners/google-cloud-platform/",{"text":400,"config":401},"GitLabを選ぶ理由",{"href":88,"dataGaName":402,"dataGaLocation":378},"Why GitLab?",{"freeTrial":404,"mobileIcon":408,"desktopIcon":413,"secondaryButton":416},{"text":48,"config":405},{"href":406,"dataGaName":51,"dataGaLocation":407},"https://gitlab.com/-/trials/new/","nav",{"altText":409,"config":410},"GitLabアイコン",{"src":411,"dataGaName":412,"dataGaLocation":407},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":409,"config":414},{"src":415,"dataGaName":412,"dataGaLocation":407},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":201,"config":417},{"href":418,"dataGaName":419,"dataGaLocation":407},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp/compare/gitlab-vs-github/","get started",{"freeTrial":421,"mobileIcon":426,"desktopIcon":428},{"text":422,"config":423},"GitLab Duoの詳細について",{"href":424,"dataGaName":425,"dataGaLocation":407},"/ja-jp/gitlab-duo/","gitlab duo",{"altText":409,"config":427},{"src":411,"dataGaName":412,"dataGaLocation":407},{"altText":409,"config":429},{"src":415,"dataGaName":412,"dataGaLocation":407},{"freeTrial":431,"mobileIcon":436,"desktopIcon":438},{"text":432,"config":433},"料金ページに戻る",{"href":189,"dataGaName":434,"dataGaLocation":407,"icon":435},"back to pricing","GoBack",{"altText":409,"config":437},{"src":411,"dataGaName":412,"dataGaLocation":407},{"altText":409,"config":439},{"src":415,"dataGaName":412,"dataGaLocation":407},{"title":441,"button":442,"config":447},"エージェント型AIがソフトウェア配信をどのように変革するかをご覧ください",{"text":443,"config":444},"GitLab Transcendを今すぐ視聴",{"href":445,"dataGaName":446,"dataGaLocation":46},"/ja-jp/events/transcend/virtual/","transcend event",{"layout":448,"icon":449},"release","AiStar",{"data":451},{"text":452,"source":453,"edit":459,"contribute":464,"config":469,"items":474,"minimal":648},"GitはSoftware Freedom Conservancyの商標です。当社は「GitLab」をライセンスに基づいて使用しています",{"text":454,"config":455},"ページのソースを表示",{"href":456,"dataGaName":457,"dataGaLocation":458},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":460,"config":461},"このページを編集",{"href":462,"dataGaName":463,"dataGaLocation":458},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":465,"config":466},"ご協力をお願いします",{"href":467,"dataGaName":468,"dataGaLocation":458},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":470,"facebook":471,"youtube":472,"linkedin":473},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[475,498,552,582,617],{"title":64,"links":476,"subMenu":481},[477],{"text":478,"config":479},"DevSecOpsプラットフォーム",{"href":73,"dataGaName":480,"dataGaLocation":458},"devsecops platform",[482],{"title":187,"links":483},[484,488,493],{"text":485,"config":486},"プランの表示",{"href":189,"dataGaName":487,"dataGaLocation":458},"view plans",{"text":489,"config":490},"Premiumを選ぶ理由",{"href":491,"dataGaName":492,"dataGaLocation":458},"/ja-jp/pricing/premium/","why premium",{"text":494,"config":495},"Ultimateを選ぶ理由",{"href":496,"dataGaName":497,"dataGaLocation":458},"/ja-jp/pricing/ultimate/","why ultimate",{"title":499,"links":500},"ソリューション",[501,506,509,511,516,521,525,528,531,536,538,540,542,547],{"text":502,"config":503},"デジタルトランスフォーメーション",{"href":504,"dataGaName":505,"dataGaLocation":458},"/ja-jp/topics/digital-transformation/","digital transformation",{"text":507,"config":508},"セキュリティとコンプライアンス",{"href":129,"dataGaName":136,"dataGaLocation":458},{"text":121,"config":510},{"href":105,"dataGaName":106,"dataGaLocation":458},{"text":512,"config":513},"アジャイル開発",{"href":514,"dataGaName":515,"dataGaLocation":458},"/ja-jp/solutions/agile-delivery/","agile delivery",{"text":517,"config":518},"クラウドトランスフォーメーション",{"href":519,"dataGaName":520,"dataGaLocation":458},"/ja-jp/topics/cloud-native/","cloud transformation",{"text":522,"config":523},"SCM",{"href":118,"dataGaName":524,"dataGaLocation":458},"source code management",{"text":109,"config":526},{"href":111,"dataGaName":527,"dataGaLocation":458},"continuous integration & delivery",{"text":159,"config":529},{"href":161,"dataGaName":530,"dataGaLocation":458},"value stream management",{"text":532,"config":533},"GitOps",{"href":534,"dataGaName":535,"dataGaLocation":458},"/ja-jp/solutions/gitops/","gitops",{"text":172,"config":537},{"href":174,"dataGaName":175,"dataGaLocation":458},{"text":177,"config":539},{"href":179,"dataGaName":180,"dataGaLocation":458},{"text":182,"config":541},{"href":184,"dataGaName":185,"dataGaLocation":458},{"text":543,"config":544},"教育",{"href":545,"dataGaName":546,"dataGaLocation":458},"/ja-jp/solutions/education/","education",{"text":548,"config":549},"金融サービス",{"href":550,"dataGaName":551,"dataGaLocation":458},"/ja-jp/solutions/finance/","financial services",{"title":192,"links":553},[554,556,558,560,563,565,568,570,572,574,576,578,580],{"text":204,"config":555},{"href":206,"dataGaName":207,"dataGaLocation":458},{"text":209,"config":557},{"href":211,"dataGaName":212,"dataGaLocation":458},{"text":214,"config":559},{"href":216,"dataGaName":217,"dataGaLocation":458},{"text":219,"config":561},{"href":221,"dataGaName":562,"dataGaLocation":458},"docs",{"text":242,"config":564},{"href":244,"dataGaName":245},{"text":566,"config":567},"お客様の成功事例",{"href":239,"dataGaLocation":458},{"text":237,"config":569},{"href":239,"dataGaName":240,"dataGaLocation":458},{"text":247,"config":571},{"href":249,"dataGaName":250,"dataGaLocation":458},{"text":255,"config":573},{"href":257,"dataGaName":258,"dataGaLocation":458},{"text":260,"config":575},{"href":262,"dataGaName":263,"dataGaLocation":458},{"text":265,"config":577},{"href":267,"dataGaName":268,"dataGaLocation":458},{"text":270,"config":579},{"href":272,"dataGaName":273,"dataGaLocation":458},{"text":275,"config":581},{"href":277,"dataGaName":278,"dataGaLocation":458},{"title":583,"links":584},"Company",[585,587,589,591,593,595,597,601,606,608,610,612],{"text":300,"config":586},{"href":302,"dataGaName":295,"dataGaLocation":458},{"text":305,"config":588},{"href":307,"dataGaName":308,"dataGaLocation":458},{"text":313,"config":590},{"href":315,"dataGaName":316,"dataGaLocation":458},{"text":318,"config":592},{"href":320,"dataGaName":321,"dataGaLocation":458},{"text":323,"config":594},{"href":325,"dataGaName":326,"dataGaLocation":458},{"text":328,"config":596},{"href":330,"dataGaName":331,"dataGaLocation":458},{"text":598,"config":599},"Sustainability",{"href":600,"dataGaName":598,"dataGaLocation":458},"/sustainability/",{"text":602,"config":603},"ダイバーシティ、インクルージョン、ビロンギング（DIB）",{"href":604,"dataGaName":605,"dataGaLocation":458},"/ja-jp/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":333,"config":607},{"href":335,"dataGaName":336,"dataGaLocation":458},{"text":343,"config":609},{"href":345,"dataGaName":346,"dataGaLocation":458},{"text":348,"config":611},{"href":350,"dataGaName":351,"dataGaLocation":458},{"text":613,"config":614},"現代奴隷制の透明性に関する声明",{"href":615,"dataGaName":616,"dataGaLocation":458},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":53,"links":618},[619,621,626,628,633,638,643],{"text":53,"config":620},{"href":55,"dataGaName":56,"dataGaLocation":458},{"text":622,"config":623},"サポートを受ける",{"href":624,"dataGaName":625,"dataGaLocation":458},"/support/","get help",{"text":366,"config":627},{"href":368,"dataGaName":369,"dataGaLocation":458},{"text":629,"config":630},"ステータス",{"href":631,"dataGaName":632,"dataGaLocation":458},"https://status.gitlab.com/","status",{"text":634,"config":635},"利用規約",{"href":636,"dataGaName":637,"dataGaLocation":458},"/terms/","terms of use",{"text":639,"config":640},"プライバシーに関する声明",{"href":641,"dataGaName":642,"dataGaLocation":458},"/ja-jp/privacy/","privacy statement",{"text":644,"config":645},"Cookieの設定",{"dataGaName":646,"dataGaLocation":458,"id":647,"isOneTrustButton":29},"cookie preferences","ot-sdk-btn",{"items":649},[650,652,654],{"text":634,"config":651},{"href":636,"dataGaName":637,"dataGaLocation":458},{"text":639,"config":653},{"href":641,"dataGaName":642,"dataGaLocation":458},{"text":644,"config":655},{"dataGaName":646,"dataGaLocation":458,"id":647,"isOneTrustButton":29},[657],{"id":658,"title":18,"body":8,"config":659,"content":661,"description":8,"extension":27,"meta":665,"navigation":29,"path":666,"seo":667,"stem":668,"__hash__":669},"blogAuthors/en-us/blog/authors/michael-friedrich.yml",{"template":660},"BlogAuthor",{"name":18,"config":662},{"headshot":663,"ctfId":664},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659879/Blog/Author%20Headshots/dnsmichi-headshot.jpg","dnsmichi",{},"/en-us/blog/authors/michael-friedrich",{},"en-us/blog/authors/michael-friedrich","lJ-nfRIhdG49Arfrxdn1Vv4UppwD51BB13S3HwIswt4",[671,683,696],{"content":672,"config":681},{"title":673,"description":674,"heroImage":675,"date":676,"body":677,"category":9,"tags":678,"updatedDate":680},"エージェント型SDLC：GitLabとタタ・コンサルタンシー・サービシズ（TCS社）が企業全体でインテリジェントオーケストレーションを提供","開発者と連携してワークフローを自動化し、コンプライアンスを強化し、デリバリーを加速するAIエージェントでDevSecOpsをスケールします。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1771866240/l16gpgupgz8uelyc8jfy.png","2026-02-24","GitLabとタタ・コンサルタンシー・サービシズ（以下TCS社）は、企業がイノベーション速度を大規模に加速できるよう支援するパートナーシップを発表しました。\n企業は迅速で安全なソフトウェアデリバリーを必要としていますが、断片化されたツールチェーン、一貫性のないセキュリティ制御、手動のコンプライアンスプロセスによってソフトウェアデリバリーが遅くなることがよくあります。AI生成コードとAI主導の脅威により、新たな複雑さが加わっています。\nGitLabとTCS Center of Excellence（CoE）アクセラレーターは連携して、移行の摩擦を軽減し、ガードレールを体系化し、DevSecOpsの大規模な導入を産業化します。両社は共に、開発中に必要な監査可能なガードレールを備えた標準化からインテリジェントオーケストレーションへの道筋を可能にします。\n\n## 将来に対応した企業の支援\n\nお客様は、数年ごとに大規模な再エンジニアリングを強いることなく、長期間使用できるよう構築されたDevSecOpsプラットフォームを求めています。GitLabの統合データモデルは、ソフトウェアライフサイクル全体を単一のコンテキストソースに接続し、企業がパイプライン、制御、メトリクスを大規模に標準化できるようにします。GitLabのAI主導機能における継続的なイノベーションは、企業がエージェント型ワークフローを採用して価値実現までの時間を短縮する中で、その長期的な関連性を強化します。\n\nGitLabとTCS社は、マルチエージェントオーケストレーション、動的プランニング、信頼度スコア付き意思決定、継続的学習サイクルを同期させて、コーディング、レビュー、テスト、セキュリティ、CI/CDワークフローを自動化します。\n\n[GitLab Duo Agent Platform](https://about.gitlab.com/gitlab-duo-agent-platform/)は、コンテキスト認識型の自律的アクション、マルチステップ推論、コードモダナイゼーション、セキュリティスキャン、フロー自動化を通じて、ソフトウェアライフサイクル全体でインテリジェントオーケストレーションを提供し、ソフトウェア開発を合理化・加速します。これは、IT運用のためのTCS社の構造化されたエージェント階層と自然に整合し、動的推論、プランニング、ドメインエージェントがMCP主導の統合と豊富なプロジェクトコンテキストフローを通じてGitLab Duo Platformの専門エージェント（プランナー、セキュリティアナリスト、コードレビューなど）を呼び出すことを可能にし、GitLabのAIネイティブDevSecOps制御によって管理されます。\n\n## プラットフォームエンジニアリングによるDevSecOpsのスケール\n\nプラットフォームエンジニアリングは、個々のパイプラインとツールチェーンの管理から、組織全体でソフトウェアの構築、保護、テスト、デプロイ方法を標準化する内部開発者プラットフォーム（IDP）の構築へと焦点を移します。\n\n 企業は、プラットフォームエンジニアリングを通じて開発者エクスペリエンスを製品化し、セルフサービスのゴールデンパスでIDPを運用することでスケールします。セキュリティ、コンプライアンス、ガバナンスは、policy-as-codeを通じてデフォルトで組み込まれ、Day 2運用を標準化します。GitLabはIDPコントロールプレーンとなり、TCS社はコントロールプレーン上のラッパーとしてセルフサービスの設計と展開を産業化し、強力な開発者エクスペリエンスを提供します。ソリューションアーキテクトとして、TCS社はセルフサービスパスを構築し、GitLab Duo Agent PlatformはSDLC全体で開発を自動化するエージェント型AIを追加します。\n\n| カテゴリ                       | 詳細                                                                                                    |\n| -------------------------- | ----------------------------------------------------------------------------------------------------- |\n| エクスペリエンスレイヤー（IDP）          | • 開発者セルフサービススキャフォールディング \u003Cbr> • ワンクリック環境/Runner/スキャン \u003Cbr> • 標準化されたオンボーディング                             |\n| プラットフォームコントロールプレーン（GitLab） | • 制御ポイントとしてのマージリクエスト \u003Cbr> • 統合CI/CD \u003Cbr> • セキュリティ \u003Cbr> • ソフトウェア部品表（SBOM） \u003Cbr> • 承認 \u003Cbr> • テレメトリ       |\n| ガードレールとガバナンス               | • ポリシーベースのガバナンス \u003Cbr> • コンプライアンス as code \u003Cbr> • リスク階層化されたゴールデンパス \u003Cbr> • 手動ゲートなしの必須制御                   |\n| インフラストラクチャとランタイム           | • クラウドランディングゾーン \u003Cbr> • Kubernetes/VMランタイム \u003Cbr> • GitOps主導の望ましい状態の強制                                   |\n| ゴールデンパス                    | • 製品が継続的に改善され、安全に拡張可能であることを保証 \u003Cbr> • 自律性を保持しながらパイプラインドリフトを排除                                          |\n| Day 2運用                    | • 自動ロールバック \u003Cbr> • リリースポリシーに関連付けられたランタイムSLO \u003Cbr> • 脆弱性SLA \u003Cbr> • コスト可視性 \u003Cbr> • プラットフォームに組み込まれた運用エクセレンス |\n\n## DevSecOpsからインテリジェントオーケストレーションへ\n\n統合DevSecOpsプラットフォームは企業に基盤を提供しますが、AIエージェントがソフトウェアライフサイクルの積極的な参加者になるにつれて、プラットフォームはコードとパイプラインの管理以上のことを行う必要があります。人間とAIエージェントの作業を、完全なライフサイクルコンテキストとフローに組み込まれたガードレールとともにオーケストレーションする必要があります。これが、GitLab Duo Agent Platformが可能にするDevSecOpsからインテリジェントオーケストレーションへの移行であり、時間の経過とともにソフトウェアデリバリーの品質を向上させます。\n\n### GitLab Duo Agent Platform\n\nGitLab Duo Agent Platformは、開発者と協力者として連携するAIエージェントをソフトウェア開発ライフサイクルに導入します。複数のAIエージェントが、コード生成やテストからCI/CD修正まで、タスクを並行して処理し、ボトルネックを削減してリリースを高速化します。開発者は定義されたルールを使用してこれらのエージェントを操縦・誘導し、反復的な作業をオフロードしながら制御を維持します。このエージェントオーケストレーションは、複雑なワークフロー（壊れたパイプラインの自動修正など）に取り組み、チームがより価値の高い作業に集中できるようにします。\n\nAIエージェントはGitLabの統合データモデル内で動作し、マージリクエストを作成し、コードを改善し、コンプライアンスをサポートすることで、生産性と速度を向上させます。すべてのエージェントアクションには完全なプロジェクトコンテキストがあり、監査可能で、ポリシーに準拠しているため、企業は数千人のエンジニアにわたってAIを自信を持ってスケールし、すべての自動化されたワークフローでセキュリティと規制コンプライアンスを維持できます。これにより、アプリケーションエンジニア、DevSecOpsエンジニア、スクラムマスター、プロダクトマネージャーの負担が軽減されます。\n\n## リファレンスアーキテクチャの理解\n\n![GitLab TCSリファレンスアーキテクチャ](https://res.cloudinary.com/about-gitlab-com/image/upload/v1771866349/ynfgc7ugqjasyj1uhew0.png)\n\n## GitLab + TCS：強力な組み合わせ\n\n GitLabは、ソフトウェアチームとAIエージェントが開発ライフサイクル全体で連携するDevSecOpsのインテリジェントオーケストレーションプラットフォームを提供します。TCS社は、産業化された導入エンジン、実証済みのリファレンスアーキテクチャ、大規模移行ファクトリー、エンタープライズグレードのセキュリティベースライン、エンタープライズAI機能、AI Trust & Riskマネジメントツールとフレームワーク、プラットフォーム運用のプロダクトマインドセットを提供します。\n\nこの組み合わせを真に差別化するのは、業界、地域、規制環境を超えて数十年にわたってお客様と協力してきたTCS社の文脈的知識です。この経験により、TCS社はレガシー資産、コンプライアンス要件、運用モデル、スケールの課題などの企業制約に対処するためにGitLab機能を文脈化することができます。これは、ツールを単独で実装するのではなく、企業の制約を考慮したアプローチです。GitLabとTCS社は共に、組み込まれたコンプライアンスを備えたクラウド全体での迅速で確実なエンタープライズスケールデリバリーを可能にします。\n\n> GitLab + TCSの詳細については、ecosystem@gitlab.comまでお問い合わせください。",[23,679],"product","2026-02-26",{"featured":12,"template":13,"slug":682},"agentic-sdlc-gitlab-and-tcs-deliver-intelligent-orchestration-across-the-enterprise",{"content":684,"config":694},{"title":685,"description":686,"authors":687,"heroImage":689,"date":690,"body":691,"category":9,"tags":692},"エージェント型AIを自社の制御下で：セルフホスト対応Duo Agent Platformと自社モデル持ち込み（BYOM）","GitLab 18.9がセルフホスト対応Duo Agent Platformと自社モデル持ち込み（Bring Your Own Model）サポートにより、規制対応エンタープライズにガバナンスを備えたエージェント型AIを提供する方法をご紹介します。",[688],"Rebecca Carter","https://res.cloudinary.com/about-gitlab-com/image/upload/v1771438388/t6sts5qw4z8561gtlxiq.png","2026-02-19","規制産業に属する組織がAIによる自動化を進める上では、避けられない制約があります。データレジデンシー、ベンダー管理、ガバナンスはいずれも譲れない要件であり、多くの組織はすでに自社モデルに多大な投資を重ね、その運用方法と運用場所を厳格な承認プロセスで管理しています。\n\n[GitLab 18.9](https://about.gitlab.com/ja-jp/blog/gitlab-18-09-release/)では、こうしたエンタープライズのお客様が直面する重要な戦略的ギャップを埋める2つの機能を提供します。[GitLab Duo Agent Platform](https://about.gitlab.com/ja-jp/gitlab-duo-agent-platform/)を、最も厳格な規制環境でも本番運用できる、ガバナンス対応のAIコントロールプレーンへと進化させる機能です。\n\n## オンライン クラウドライセンス向けGitLab Duo Agent Platformセルフホスト版\nGitLab Duo Agent Platformを活用すると、エンジニアリングチームはAI駆動のフローを構築し、サービスのリファクタリングやCI/CDパイプラインの強化、脆弱性のトリアージといった一連のタスクを自動化できます。しかしこれまで、セルフホストモデルを使った本番環境での利用は、主にオフラインまたはアドオンライセンスを前提とした構成に限られており、厳格な規制下で事業を行うオンライン クラウド ライセンスのお客様には対応していませんでした。\n\nこのたび一般提供を開始した[オンライン クラウドライセンス向けセルフホスト版](https://docs.gitlab.com/ja-jp/subscriptions/subscription-add-ons/#gitlab-duo-agent-platform-self-hosted)は、[GitLabクレジット](https://docs.gitlab.com/ja-jp/subscriptions/gitlab_credits/)を基盤とした従量課金モデルを採用。エンタープライズが内部チャージバックや信頼性確保に求める、透明性の高い予測可能なメタリングを実現します。\n* **データレジデンシーと制御**：オンライン クラウドライセンスのまま、自社インフラまたは承認済みクラウド環境上のモデルを使って本番稼働が可能です。モデルの実行場所や推論トラフィックのルーティングを、承認済み環境の範囲内で管理できます。\n* **コストの透明性とチャージバック**：GitLabクレジットとリクエスト単位のメタリングにより、詳細なコスト把握が可能になります。正確な内部チャージバックや規制対応のレポーティングに不可欠な仕組みです。\n* **導入加速**：金融サービス、政府機関、重要インフラなど、外部AIベンダーへのデータ送信が認められないセクターにおける、エージェント型AI導入の大きな障壁を取り除きます。\nGitLab 18.9から、Duo Agent Platformがオンライン クラウドライセンスの正式対応機能となります。\n\n## Bring Your Own Model（BYOM）/自分のモデルを持ち込む\nオーケストレーションレイヤーのセルフホスト化は、あくまでも出発点です。規制対応を求められるお客様の多くは、すでに自社モデルに相当な投資をしています。ドメイン特化型のLLM、データ主権のためのリージョン内またはエアギャップ環境へのデプロイ、自社のリスク方針に基づいて開発されたクローズドソースの社内モデルなど、その形は様々です。\n\n**Bring Your Own Model**（BYOM）は、GitLab Duo Agent Platformの柔軟性をさらに拡げる機能です。管理者は[GitLab AIゲートウェイ](https://docs.gitlab.com/ja-jp/administration/gitlab_duo/gateway/)を通じて、自社で開発、調達、承認したモデルをそのままGitLab Duo Agent Platformに接続して活用できます。外部ベンダーのモデルに依存することなく、モデルの選択と管理権限は完全にお客様の手に委ねられます。\n* **統合とガバナンス**：BYOMモデル（お客様が持ち込んだモデル）は、GitLabのAIコントロールプレーン上でGitLab管理モデルと同等のエンタープライズ対応オプションとして扱われます。自社承認済みのモデルを、GitLab環境にシームレスに組み込むことができます。\n* **詳細なマッピング**：AIゲートウェイへの登録後、各モデルを特定のDuo Agent Platformフローや機能に紐づけることができます。どのエージェントやフローがどのモデルを使うか、きめ細かな制御が可能です。\nなお、モデルの検証、パフォーマンス評価、リスク管理の責任は管理者が担います。互換性、性能、リスク評価は、導入するモデルを選んだ側の責任となります。\n\nこれら2つの機能を組み合わせることで、エンタープライズのエンジニアリングリーダーはエージェント型AIを包括的に制御できるようになります。乱立するポイントソリューションや、管理不在のいわば野放しのAIツールを置き換え、エージェント型AIを一元管理する単一のガバナンス対応コントロールプレーンが手に入ります。自社で開発、調達、承認したモデルをそのまま持ち込みながら、強固なガバナンスも確保できる、すでに信頼しているDevSecOpsプラットフォームの中でそれを実現できる、これが規制対応組織の求めていた答えです。\n\n> GitLab Duo Agent Platformにご興味のある方は、[お問い合わせいただくか、今すぐ無料トライアルにお申し込みください](https://about.gitlab.com/ja-jp/gitlab-duo-agent-platform/)。\n\n-----------\n\n_本ブログには、1933年証券法第27A条（改正版）および1934年証券取引所法第21E条に定める「将来の見通しに関する記述」が含まれています。これらの記述に反映されている期待は合理的と考えていますが、実際の結果や成果が大きく異なる可能性のある既知/未知のリスク、不確実性、前提条件、その他の要因が存在します。これらのリスクおよびその他の要因の詳細は、SECへの提出書類における「リスク要因」の項目をご参照ください。法律で義務付けられている場合を除き、本ブログ投稿の公開日以降にこれらの記述を更新または修正する義務を負いません。_",[23,679,693],"features",{"featured":29,"template":13,"slug":695},"agentic-ai-enterprise-control-self-hosted-duo-agent-platform-and-byom",{"content":697,"config":706},{"title":698,"description":699,"authors":700,"heroImage":702,"date":703,"body":704,"category":9,"tags":705},"GitLab Duo Agent Platformの正式版リリースを発表","ソフトウェアライフサイクル全体におけるエージェント型AIが、コーディングの高速化をイノベーションサイクルの加速へと変える仕組みをご紹介します。",[701],"Bill Staples","https://res.cloudinary.com/about-gitlab-com/image/upload/v1768314192/llizjeumcduj2enqpdi4.png","2026-01-15","GitLab Duo Agent Platformの正式版リリースを発表できることを大変うれしく思います。これはGitLab、お客様、そして業界全体にとって重要な節目です。ソフトウェア開発ライフサイクル全体にエージェント型AIを導入するというビジョンを実現する最初の一歩となります。\n\nAIツールは、デベロッパーがコードを書く能力を急速に向上させており、場合によっては生産性が10倍向上したという報告もあります。しかし残念ながら、デベロッパーの時間のうちコードを書くことに費やされるのは約20%に過ぎないため、AIによって得られるイノベーション速度と提供の全体的な向上は段階的なものにとどまります。これはソフトウェア提供における[AIパラドックス](https://about.gitlab.com/press/releases/2025-11-10-gitlab-survey-reveals-the-ai-paradox/)としてよく知られています。\n\nさらに、多くのチームでは、コード作成の速度が上がったことで、コードレビュー、セキュリティ脆弱性、コンプライアンスチェック、下流のバグ修正など、新たなボトルネックが生じています。\n\nGitLab Duo Agent Platformは、ソフトウェアライフサイクル全体でインテリジェントなオーケストレーションとエージェント型AI自動化を実現することで、AIパラドックスに対処します。\n\n詳しくは以下の動画をご覧いただき、さらに詳細は下記をお読みください。\n\n\u003Ciframe src=\"https://player.vimeo.com/video/1154785472?badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479\" frameborder=\"0\" allow=\"autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" style=\"position:absolute;top:0;left:0;width:100%;height:100%;\" title=\"18.8 Release Video V2\">\u003C/iframe>\u003Cscript src=\"https://player.vimeo.com/api/player.js\">\u003C/script>\n\n> :bulb: 2月10日のGitLab Transcendにご参加いただき、エージェント型AIがソフトウェア提供をどのように変革するかをご覧ください。お客様の事例を聞き、独自のモダナイゼーションの取り組みを開始する方法をご確認ください。[今すぐ登録](https://about.gitlab.com/events/transcend/virtual/)\n\nまた、GitLab PremiumおよびUltimateサブスクリプションをご利用中のお客様に、追加費用なしでユーザーあたりそれぞれ12ドルおよび24ドルのGitLabクレジットを付与いたします。\\*これらのクレジットは毎月更新され、GitLab Duo Agent Platformのすべての機能をご利用いただけます。\n\nGitLabクレジットの仕組みを簡単に説明します。GitLabクレジットは、GitLabの使用量ベースの製品に使用される仮想通貨です。GitLab Duo Agent Platformの使用量は、上記の含まれるクレジットから消費されます。その後、組織全体で共有クレジットプールへのコミットメントを決定するか、オンデマンドで月単位でお支払いいただくことができます。詳細については、[GitLabクレジットの紹介記事](https://about.gitlab.com/blog/introducing-gitlab-credits/)をご覧ください。\n\nGitLab Duo ProまたはDuo Enterpriseサブスクリプションをご利用のお客様は、引き続きこれらの製品をご利用いただくか、いつでもDuo Agent Platformに移行していただけます。Duo Enterpriseの契約残高は、いつでもGitLabクレジットに変換できます。詳細については、GitLab担当者にお問い合わせください。\n\n本日からお試しいただける機能とユースケースをご紹介します。\n\n### 人間とエージェントが協働するための統合エクスペリエンス\n\n[GitLab Duo Agent Platform](https://docs.gitlab.com/ja-jp/user/duo_agent_platform/?utm_source=chatgpt.com)は、人間とAIエージェントがGitLab内でシームレスに統合できるように設計された、統一されたユーザーエクスペリエンスを提供します。デベロッパーとそのチームは、ほぼすべてのページでDuo Agentic Chatを利用し、コンテキストに応じた質問をしたり、非同期エージェントセッションをフォローしたり、イシュー、マージリクエスト、パイプラインアクティビティなどの使い慣れたワークフロー内でエージェントとやり取りしたりできます。これにより、AIのアクションが透明になり、日常業務を通じて簡単にガイドできるようになります。\n\n### Agentic Chat:インテリジェントでコンテキスト認識型のアシスタンス\n\n[Gitlab Duo Agentic Chat](https://docs.gitlab.com/ja-jp/user/gitlab_duo_chat/agentic_chat/)は、GitLab Web UIおよびIDEで真のマルチステップ推論を実現し、イシュー、マージリクエスト、パイプライン、セキュリティ調査結果などからのライフサイクル全体のコンテキストを活用します。以前リリースされたDuo Chatをベースに、Agentic Chatはユーザーに代わって自律的にアクションを実行し、複雑な質問により包括的に答えることができます。ソフトウェアチームの各メンバーに、オンボーディング、コード品質、提供速度の向上に役立つ、正確でコンテキスト認識型のガイダンスを提供します。\n\nGitLab Duo Agentic Chatは、デベロッパーとAIの協働を可能にする数多くの[ユースケース](https://about.gitlab.com/gitlab-duo/prompt-library/)をサポートしています。開始方法の詳細については、[「GitLab Duo Agent Platform完全ガイド」](https://about.gitlab.com/blog/gitlab-duo-agent-platform-complete-getting-started-guide/)をご覧いただき、こちらの[拡張中の推奨プロンプト集](https://about.gitlab.com/gitlab-duo/prompt-library/)もご確認ください。\n\n* **分析**\n  Web UIでは、Agentic Chatはイシュー、エピック、マージリクエストを作成し、要約を提供し、重要な発見を強調し、特定のプロジェクト、イシュー、エピック、マージリクエストなどからのリアルタイムコンテキストに基づいた実用的なガイダンスを提供できます。Agentic Chatは、デベロッパーがIDEまたはGitLabリポジトリ内で、馴染みのないコード、依存関係、アーキテクチャ、プロジェクト構造を理解するのに役立ちます。\n\n\n* **コード**\n  Agentic Chatは、幅広い言語とフレームワークにわたって、コード、設定、Infrastructure as Codeを生成できます。バグの修正、アーキテクチャとコードのモダナイゼーション、テストの生成、より迅速なオンボーディングのためのドキュメント作成を支援します。デベロッパーの手元で、Agentic ChatはVS Code、JetBrains IDE、Cursor、Windsurfにおける協働パートナーであり、オプションのユーザーレベルおよびワークスペースレベルのルールで応答をカスタマイズできます。\n\n* **CI/CD**\n  Agentic Chatは、既存のパイプラインをより深く理解し、設定し、トラブルシューティングしたり、新しいパイプラインをゼロから作成したりするのに役立ちます。\n\n* **セキュリティ**\n  Agentic Chatは、脆弱性を説明し、到達可能性に基づいて問題に優先順位を付け、時間を節約できる修正を推奨します。\n\n## エージェント:オンデマンドで協働する専門家\n\nGitLab Duo Agent Platformにより、デベロッパーは専門のエージェントにタスクを委任できます。このプラットフォームは、基本エージェント、カスタムエージェント、外部エージェントの独自の組み合わせを提供し、すべてGitLabユーザーエクスペリエンスにシームレスに統合されているため、あらゆるタスクに適したエージェントを簡単に選択できます。\n\n**[基本エージェント](https://docs.gitlab.com/ja-jp/user/duo_agent_platform/agents/foundational_agents/)**は、GitLabの専門家によって事前に構築されており、ソフトウェア提供サイクルで最も複雑なタスクを処理する準備が整っています。以下の基本エージェントは、GitLab Duo Agent Platformの正式版の一部として含まれており、その他のエージェントは現在ベータ版で、近日中に提供予定です。\n\n* [**プランナーエージェント**](https://docs.gitlab.com/ja-jp/user/duo_agent_platform/agents/foundational_agents/planner/)は、チームがGitLab内で直接作業を構造化、優先順位付け、分割するのを支援し、計画をより明確に、より迅速に、より実行しやすくします。\n\n* [**セキュリティ分析エージェント**](https://docs.gitlab.com/ja-jp/user/duo_agent_platform/agents/foundational_agents/security_analyst_agent/)は、脆弱性とセキュリティシグナルをレビューし、その影響を平易な言葉で説明し、チームが最初に対処すべきことを理解するのを支援します。\n\n[**カスタムエージェント**](https://docs.gitlab.com/ja-jp/user/duo_agent_platform/ai_catalog/)は、AIカタログを使用して構築できます。AIカタログは、チームがカスタムエージェントとフローを作成、公開、管理、共有するための中央リポジトリです。チームは、エンジニアリングチームの働き方を再現し、エンジニアが使用するエンジニアリング基準とガバナンスの仕組みを使用して問題に取り組むために、特定のコンテキストと機能を持つエージェントとフローを作成できます。\n\n[**外部エージェント**](https://docs.gitlab.com/ja-jp/user/duo_agent_platform/agents/external/)は、GitLabにシームレスに統合されており、AnthropicのClaude CodeやOpenAIのCodex CLIなど、最高クラスのAIツールが含まれています。ユーザーは、コード生成、コードレビュー、分析などのユースケースで、透明性の高いセキュリティと組み込みLLMサブスクリプションにより、これらのツールをGitLabからネイティブにアクセスできます。\n\nこれらのアプローチにより、チームは専門エージェント、組織固有の自動化、外部AIツールの統合など、エージェント型AIをどのように採用するかについて柔軟性を得ることができます。すべて単一のガバナンスされたプラットフォーム内で実現します。\n\n## フロー:複数ステップの作業を反復可能でガイド付きの進捗へ\n\nフローは、複数のエージェントワークフローを使用して複雑なタスクを最初から最後まで自動化します。\n\nエンジニアリングチームは、正式版に含まれるいくつかのフローを構築しており、さらに多くのフローが提供予定です。\n\n* [**デベロッパー(Issue to MR)**](https://docs.gitlab.com/ja-jp/user/duo_agent_platform/flows/foundational_flows/issue_to_mr/)フローは、明確に定義されたイシューから構造化されたマージリクエストを作成し、チームがすぐに作業を開始できるようにします。\n\n* [**GitLab CI/CD変換**](https://docs.gitlab.com/ja-jp/user/duo_agent_platform/flows/foundational_flows/convert_to_gitlab_ci/)フローは、チームが手動で書き直すことなくパイプライン設定を移行またはモダナイズするのに役立ちます。\n\n* [**CI/CDパイプライン修復**](https://docs.gitlab.com/ja-jp/user/duo_agent_platform/flows/foundational_flows/fix_pipeline/)フローは、障害を分析し、考えられる原因を特定し、推奨される変更を準備します。\n\n* [**コードレビュー**](https://docs.gitlab.com/ja-jp/user/duo_agent_platform/flows/foundational_flows/code_review/)フローは、コード変更、マージリクエストコメントなどを分析し、AIネイティブの分析とフィードバックでコードレビューを効率化します。\n\n* [**ソフトウェア開発**](https://docs.gitlab.com/ja-jp/user/duo_agent_platform/flows/foundational_flows/software_development/)フローは、日常的な開発とレビュー段階を通じて作業をガイドします。\n\n## MCP Client:GitLab Duo Agent Platformをチームが既に使用しているツールに接続\n\n[MCPクライアント](https://docs.gitlab.com/ja-jp/user/gitlab_duo/model_context_protocol/mcp_clients/)により、IDE内のGitLab Duo Agent PlatformがJira、Slack、Confluence、その他のMCP対応ツールなどの外部システムに安全に接続し、コンテキストを取り込み、DevSecOpsツールチェーン全体でアクションを実行できるようになります。\n\n個々のツール内でAIアシスタンスがサイロ化されるのではなく、MCPクライアントはGitLab Duo Agent Platformが、計画、協働、実行が実際に行われるシステム全体を理解し、動作することを可能にします。これにより、手動でのコンテキスト切り替えが削減され、チームが実際に作業する方法を反映した、より完全なエンドツーエンドのAI駆動ワークフローが実現します。\n\n正式版に含まれる機能:\n\n* Jira、Confluence、Slack、Playwright、GrafanaなどのMCP対応外部システムへの接続\n* ワークスペースレベルおよびユーザーレベルでの設定\n* MCPの使用を有効化または制限するためのグループレベルの制御\n* ツールアクセスのユーザー承認フロー\n* IDE拡張機能でのAgentic Chat全体でのサポート\n\n現在ベータ版のGitLab MCPサーバー機能にさらに多くの機能を追加し、今後のリリースで正式版にする予定です。\n\n## チームとワークロードに適したモデルを選択\n\nGitLab Duo Agent Platformは、チームがプライバシー、セキュリティ、コンプライアンスのニーズに合わせてプラットフォームを調整できる柔軟なモデル選択フレームワークに基づいて構築されています。GitLabは各機能に最適なLLMをデフォルトで設定していますが、管理者はOpenAI GPT-5バリアント、Mistral、Meta Llama、Anthropic Claudeなどのサポートされているモデルから選択することもできます。これにより、チームは組織の基準に基づいて、各特定のユースケースでチャット、コーディングタスク、エージェントインタラクションに何を使用するかについて、より正確な制御と柔軟性を得ることができます。サポートされているモデルの完全なリストとモデル選択設定の詳細については、ドキュメントの[モデル選択](https://docs.gitlab.com/ja-jp/administration/gitlab_duo/model_selection/)セクションをご覧ください。\n\n### ガバナンス、可視性、デプロイの柔軟性\n\nGitLab Duo Agent Platformは、組織がAIを責任を持って採用するために必要な制御と透明性を提供すると同時に、さまざまな環境で機能する柔軟なデプロイオプションを提供します。\n\n正式版に含まれる機能:\n\n* **すべてのプラットフォームで利用可能:**GitLab.com、GitLab Self-Managed、GitLab DedicatedでGitLab 18.8リリースサイクルの一部として利用できます。\n\n* **ガバナンスと可視性:**チームは、エージェントがどのように使用され、どのようなアクションを実行し、作業にどのように貢献しているかを確認できます。使用状況とアクティビティの詳細により、リーダーは採用状況を把握し、影響を測定し、AIが適切に使用されていることを確認できます。これらの制御により、自信を持って大規模にAIを展開しやすくなります。\n\n* **グループベースのアクセス制御:**管理者は、どのユーザーがGitLab Duo Agent Platform機能にアクセスできるかを管理する名前空間レベルのルールを定義でき、組織全体での即時有効化から段階的なロールアウトまで、柔軟な採用をサポートします。LDAPおよびSAML統合により、手動設定なしで大規模なガバナンスを実現できます。\n\n* **モデル選択とセルフホスト型オプション:**LLM選択は、GitLab.com、Self-Managed、Dedicatedのすべての正式版機能で利用できます。トップレベルの名前空間所有者がモデルを選択し、サブグループはそれらの設定を自動的に継承します。より多くの制御が必要な組織のために、プラットフォームはGitLab Self-Managedデプロイメント向けのセルフホスト型モデルをサポートしています。\n\nGitLab Duo Agent Platformの実際の動作をご覧ください:\n\n\u003Ciframe src=\"https://player.vimeo.com/video/1154786333?badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479\" frameborder=\"0\" allow=\"autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" style=\"position:absolute;top:0;left:0;width:100%;height:100%;\" title=\"18.8 Demo\">\u003C/iframe>\u003Cscript src=\"https://player.vimeo.com/api/player.js\">\u003C/script>\n\n## GitLabの最新情報を入手\n\n最新の機能、セキュリティアップデート、パフォーマンス向上を確実に入手するために、GitLabインスタンスを最新の状態に保つことをお勧めします。以下のリソースは、アップグレードの計画と完了に役立ちます。\n\n* [アップグレードパスツール](https://gitlab-com.gitlab.io/support/toolbox/upgrade-path/) – 現在のバージョンを入力すると、インスタンスの正確なアップグレード手順が表示されます\n* [アップグレードに関するドキュメント](https://docs.gitlab.com/ja-jp/update/upgrade_paths/) – サポートされている各バージョンの詳細なガイド(要件、ステップバイステップの手順、ベストプラクティスを含む)\n\n定期的にアップグレードすることで、チームが最新のGitLab機能を活用し、安全でサポートされた状態を維持できます。\n\nハンズオフアプローチをお望みの組織には、[GitLabのManaged Maintenanceサービス](https://content.gitlab.com/viewer/d1fe944dddb06394e6187f0028f010ad#1)をご検討ください。Managed Maintenanceは、チームがイノベーションに集中し続ける一方で、GitLabの専門家がSelf-Managedインスタンスの確実なアップグレード、セキュリティ確保、DevSecOpsリーダーシップの準備を維持するのを支援します。詳細については、アカウントマネージャーにお問い合わせください。\n\n---\n\n\\* GitLab PremiumおよびUltimateサブスクリプションをご利用中のお客様には、ユーザーあたりそれぞれ12ドルおよび24ドルの含まれるクレジットが自動的に提供され、毎月リセットされます。これらのクレジットは期間限定で提供され、変更される可能性があります([プロモーション規約を参照](https://about.gitlab.com/pricing/terms/))。\n\n*このブログ投稿には、改正1933年証券法第27A条および1934年証券取引法第21E条の意味における「将来予想に関する記述」が含まれています。これらの記述に反映された期待は合理的であると考えていますが、実際の結果または成果が大きく異なる可能性のある既知および未知のリスク、不確実性、仮定、その他の要因の影響を受けます。これらのリスクおよびその他の要因の詳細については、SECへの提出書類の「リスク要因」の項をご参照ください。このブログ投稿の日付以降、法律で義務付けられている場合を除き、これらの記述を更新または改訂する義務は負いません。*",[23,679,693],{"featured":29,"template":13,"slug":707},"gitlab-duo-agent-platform-is-generally-available",{"promotions":709},[710,723,734],{"id":711,"categories":712,"header":713,"text":714,"button":715,"image":720},"ai-modernization",[9],"Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":716,"config":717},"Get your AI maturity score",{"href":718,"dataGaName":719,"dataGaLocation":245},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":721},{"src":722},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":724,"categories":725,"header":726,"text":714,"button":727,"image":731},"devops-modernization",[679,38],"Are you just managing tools or shipping innovation?",{"text":728,"config":729},"Get your DevOps maturity score",{"href":730,"dataGaName":719,"dataGaLocation":245},"/assessments/devops-modernization-assessment/",{"config":732},{"src":733},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":735,"categories":736,"header":738,"text":714,"button":739,"image":743},"security-modernization",[737],"security","Are you trading speed for security?",{"text":740,"config":741},"Get your security maturity score",{"href":742,"dataGaName":719,"dataGaLocation":245},"/assessments/security-modernization-assessment/",{"config":744},{"src":745},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"header":747,"blurb":748,"button":749,"secondaryButton":753},"今すぐ開発をスピードアップ","DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。\n",{"text":48,"config":750},{"href":751,"dataGaName":51,"dataGaLocation":752},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":53,"config":754},{"href":55,"dataGaName":56,"dataGaLocation":752},1772652108095]