[{"data":1,"prerenderedAt":814},["ShallowReactive",2],{"/ja-jp/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo":3,"navigation-ja-jp":42,"banner-ja-jp":453,"footer-ja-jp":463,"blog-post-authors-ja-jp-Michael Friedrich":697,"blog-related-posts-ja-jp-refactor-code-into-modern-languages-with-ai-powered-gitlab-duo":711,"blog-promotions-ja-jp":753,"next-steps-ja-jp":805},{"id":4,"title":5,"authorSlugs":6,"authors":8,"body":10,"category":11,"categorySlug":11,"config":12,"content":16,"date":20,"description":17,"extension":26,"externalUrl":27,"featured":14,"heroImage":19,"isFeatured":14,"meta":28,"navigation":29,"path":30,"publishedDate":20,"rawbody":31,"seo":32,"slug":13,"stem":36,"tagSlugs":37,"tags":40,"template":15,"updatedDate":25,"__hash__":41},"blogPosts/ja-jp/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo.yml","AI搭載のGitLab Duoでコードをモダンな言語にリファクタリング",[7],"michael-friedrich",[9],"Michael Friedrich","コードベースやフレームワークのモダナイゼーションを行うために新しいプログラミング言語へ移行する必要があったり、同じ言語内の新しい機能の知識を深めたい場合は、AI搭載の[GitLab Duo](https://about.gitlab.com/gitlab-duo-agent-platform/)が有効です。ここでは、筆者が過去20年にわたるコーディングキャリアで培ったベストプラクティスをもとに、コードリファクタリングの際に直面する課題への効果的なアプローチ方法をご紹介します。\n\nこの記事では、VS CodeとJetBrains IDE（IntelliJ IDEA、PyCharm、CLion）を使用したプロンプトと例を紹介します。いずれのIDEにも[GitLab Duo拡張機能やプラグイン](https://docs.gitlab.com/ja-jp/user/project/repository/code_sugg/ estions/supported_extensions.html)がインストールされています。開発環境としてはGitLab.comが使用されています。ここでは大規模言語モデル（LLM）がAnthropic Claude 3.5にアップデートされており、GitLab Duoの[コード提案](https://docs.gitlab.com/ja-jp/user/gitlab_duo/#code-suggestions)と[Duo Chat](https://docs.gitlab.com/ja-jp/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/ja-jp/user/gitlab_duo_chat/examples/#explain-code-in-the-ide)、[テスト生成](https://docs.gitlab.com/ja-jp/user/gitlab_duo_chat/examples/#write-tests-in-the-ide)、さらには[コードのリファクタリング](https://docs.gitlab.com/ja-jp/user/gitlab_duo_chat/examples/#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/ja-jp/use/ r/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/ja-jp/user/gitlab_duo/use_cases/)\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","ai-ml",{"slug":13,"featured":14,"template":15},"refactor-code-into-modern-languages-with-ai-powered-gitlab-duo",false,"BlogPost",{"title":5,"description":17,"authors":18,"heroImage":19,"date":20,"body":10,"category":11,"tags":21,"updatedDate":25},"この詳細なチュートリアルでは、デベロッパーがAIを活用し、コードを新しいプログラミング言語に移行してモダナイゼーションを進めるプロセスや、同じ言語における新機能についても学べる内容を紹介しています。",[9],"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662465/Blog/Hero%20Images/GitLab_Duo_Workflow_Unified_Data_Store__1_.png","2024-08-26",[22,23,24],"AI/ML","tutorial","DevSecOps","2025-02-10","yml",null,{},true,"/ja-jp/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo","seo:\n  title: AI搭載のGitLab Duoでコードをモダンな言語にリファクタリング\n  description: >-\n    この詳細なチュートリアルでは、デベロッパーがAIを活用し、コードを新しいプログラミング言語に移行してモダナイゼーションを進めるプロセスや、同じ言語における新機能についても学べる内容を紹介しています。\n  ogTitle: AI搭載のGitLab Duoでコードをモダンな言語にリファクタリング\n  ogDescription: >-\n    この詳細なチュートリアルでは、デベロッパーがAIを活用し、コードを新しいプログラミング言語に移行してモダナイゼーションを進めるプロセスや、同じ言語における新機能についても学べる内容を紹介しています。\n  noIndex: false\n  ogImage: >-\n    https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662465/Blog/Hero%20Images/GitLab_Duo_Workflow_Unified_Data_Store__1_.png\n  ogUrl: >-\n    https://about.gitlab.com/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo\n  ogSiteName: https://about.gitlab.com\n  ogType: article\n  canonicalUrls: >-\n    https://about.gitlab.com/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo\ncontent:\n  title: AI搭載のGitLab Duoでコードをモダンな言語にリファクタリング\n  description: >-\n    この詳細なチュートリアルでは、デベロッパーがAIを活用し、コードを新しいプログラミング言語に移行してモダナイゼーションを進めるプロセスや、同じ言語における新機能についても学べる内容を紹介しています。\n  authors:\n    - Michael Friedrich\n  heroImage: >-\n    https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662465/Blog/Hero%20Images/GitLab_Duo_Workflow_Unified_Data_Store__1_.png\n  date: '2024-08-26'\n  body:\n    \"コードベースやフレームワークのモダナイゼーションを行うために新しいプログラミング言語へ移行する必要があったり、同じ言語内の新しい機能の知識を深め\\\n    たい場合は、AI搭載の[GitLab\n    Duo](https://about.gitlab.com/gitlab-duo-agent-platform/)が有効です。ここでは、筆者が過去20年にわたるコーディングキャリア\\\n    で培ったベストプラクティスをもとに、コードリファクタリングの際に直面する課題への効果的なアプローチ方法をご紹介します。\n\n\n    この記事では、VS CodeとJetBrains IDE（IntelliJ\n    IDEA、PyCharm、CLion）を使用したプロンプトと例を紹介します。いずれのIDEにも[GitLab\n    Duo拡張機能やプラグイン](https://docs.gitlab.com/ja-jp/user/project/repository/code_sugg/\n    estions/supported_extensions.html)がインストールされています。開発環境としてはGitLab.comが使用されています\\\n    。ここでは大規模言語モデル（LLM）がAnthropic Claude 3.5にアップデートされており、GitLab\n    Duoの[コード提案](https://docs.gitlab.com/ja-jp/user/gitlab_duo/#code-suggestions)と[\\\n    Duo\n    Chat](https://docs.gitlab.com/ja-jp/user/gitlab_duo/#gitlab-duo-chat)に適用されています\\\n    。これらの機能は卓越したパフォーマンスと効率性を発揮します。\n\n\n    この記事では必要なセクションだけを確認しても良いですし、上から順を追って読んでも構いません。また、自己学習に役立つソースコードや演習問題も用意していま\\\n    す。\n\n\n    - モダンなプログラミング言語標準に合わせたコードのリファクタリング\n\n    \\    - Java 7のコードを生成し、Java 8にリファクタリング\n\n    \\    - C++標準に基づいたリファクタリング\n\n    \\        - 移行：C++03をC++14にリファクタリング\n\n    \\        - ダウングレード：C++23をC++11にリファクタリング\n\n    \\    - COBOLの説明とリファクタリング\n\n    - 異なる言語間でのリファクタリング\n\n    \\    - CをRustにリファクタリング\n\n    \\    - PerlをPythonにリファクタリング\n\n    - その他のリファクタリング実践例\n\n    \\    - JavaScriptのリファクタリング\n\n    \\    - BashをZSHやSHにリファクタリング\n\n    \\    - その他のユースケースやチュートリアル\n\n    - 重要なポイント\n\n\n    ## モダンなプログラミング言語標準に合わせたコードのリファクタリング\n\n\n    次のセクションでは、特定のプログラミング言語におけるリファクタリングの方法、言語固有の違いの説明、および理解の仕方について解説します。\n\n\n    ### Java 7のコードを生成し、Java 8にリファクタリング\n\n\n    あるお客様から、GitLab DuoがJava 7をサポートしているかどうかのご質問が寄せられました。Java\n    7固有のコードを生成するためのコード提案とGitLab Chatのプロンプトをテストしている際、移行支援についても考えました。Anthropic\n    Claude 3.5と同様に、GitLab Duoも言語固有の違いを理解できます。\n\n\n    次の例では、コード提案を使用してJava 7のコードを生成するプロンプトを示しています。\n\n\n    ```java\n\n    // Generate a new class for a File Manager. Use Java 7 features only.\n\n    import java.io.*;\n\n    import java.nio.file.*;\n\n    import java.util.*;\n\n\n    public class FileManager {\n\n    \\    private Path rootDirectory;\n\n\n    \\    public FileManager(String rootPath) throws IOException {\n\n    \\        this.rootDirectory = Paths.get(rootPath);\n\n    \\        if (!Files.exists(rootDirectory)) {\n\n    \\            Files.createDirectories(rootDirectory);\n\n    \\        }\n\n    \\    }\n\n\n    \\    public void createFile(String fileName, String content) throws\n    IOException {\n\n    \\        Path filePath = rootDirectory.resolve(fileName);\n\n    \\        Files.write(filePath, content.getBytes(),\n    StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);\n\n    \\    }\n\n\n    \\    public String readFile(String fileName) throws IOException {\n\n    \\        Path filePath = rootDirectory.resolve(fileName);\n\n    \\        return new String(Files.readAllBytes(filePath));\n\n    \\    }\n\n\n    \\    public void deleteFile(String fileName) throws IOException {\n\n    \\        Path filePath = rootDirectory.resolve(fileName);\n\n    \\        Files.delete(filePath);\n\n    \\    }\n\n\n    \\    public List\u003CString> listFiles() throws IOException {\n\n    \\        List\u003CString> fileList = new ArrayList\u003C>();\n\n    \\        try (DirectoryStream\u003CPath> stream =\n    Files.newDirectoryStream(rootDirectory)) {\n\n    \\            for (Path file : stream) {\n\n    \\                fileList.add(file.getFileName().toString());\n\n    \\            }\n\n    \\        }\n\n    \\        return fileList;\n\n    \\    }\n\n\n    \\    public void copyFile(String sourceFileName, String destinationFileName)\n    throws IOException {\n\n    \\        Path sourcePath = rootDirectory.resolve(sourceFileName);\n\n    \\        Path destinationPath = rootDirectory.resolve(destinationFileName);\n\n    \\        Files.copy(sourcePath, destinationPath,\n    StandardCopyOption.REPLACE_EXISTING);\n\n    \\    }\n\n\n    \\    public void moveFile(String sourceFileName, String destinationFileName)\n    throws IOException {\n\n    \\        Path sourcePath = rootDirectory.resolve(sourceFileName);\n\n    \\        Path destinationPath = rootDirectory.resolve(destinationFileName);\n\n    \\        Files.move(sourcePath, destinationPath,\n    StandardCopyOption.REPLACE_EXISTING);\n\n    \\    }\n\n\n    \\    public long getFileSize(String fileName) throws IOException {\n\n    \\        Path filePath = rootDirectory.resolve(fileName);\n\n    \\        return Files.size(filePath);\n\n    \\    }\n\n\n    \\    public boolean fileExists(String fileName) {\n\n    \\        Path filePath = rootDirectory.resolve(fileName);\n\n    \\        return Files.exists(filePath);\n\n    \\    }\n\n    }\n\n    ```\n\n\n    ご自身のIDEで次の手順を進めてください。\n\n\n    1. 生成されたコードを理解する：エディタでコード部分を選択（スクリーンショットの青色部分）し、GitLab Duo\n    Chatに切り替えて、`/explain` スラッシュ(/) コマンドをプロンプトとして送信します。\n\n\n    ![GitLab Duo Chatで `/explain` スラッシュ(/)\n    コマンドを使用して生成したコードを検証する](https://res.cloudinary.com/about-gitlab-com/image/up\\\n    load/v1749675059/Blog/Content%20Images/intellij_java7_generate_refactor.png)\n\n\n    2. Java 7のコードをJava 8にリファクタリングする：エディタでコードを選択し、Chatに切り替えて、プロンプトを `/refactor\n    using Java 8 features` に変更して送信します。\n\n    3. リファクタリングの代替方法を練習する：新しいファイル `java8.java` を作成し、コード提案を使って `// Generate a new\n    class for a File Manager. Use Java 8 features only.` というプロンプトでJava\n    8固有のコードを生成します。\n\n    4. AI搭載のコード補完機能を使って、同じコンテキストでJava 8のコードの続きを記述します。\n\n\n    次の録画ですべての手順をご覧になれます。\n\n\n    \u003C!-- 空白行 -->\n\n    \u003Cfigure class=\\\"video_container\\\">\n\n    \\  \u003Ciframe src=\\\"https://www.youtube.com/embed/XKRv6uBkD2I\\\"\n    frameborder=\\\"0\\\" allowfullscreen=\\\"true\\\"> \u003C/iframe>\n\n    \u003C/figure>\n\n    \u003C!-- 空白行 -->\n\n\n    ソースコードは[GitLab Duo Challenge - Generate and refactor Java 7 to 8 project ](\n    https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenge\\\n    s/code-challenges/challenge-generate-refactor-java-7-to-8)で取得できます。\n\n\n    ### C++標準に基づいたリファクタリング\n\n\n    C++の標準には長い歴史があり、安定性と成熟度には信頼があります。ターゲットとなるアーキテクチャやプラットフォームに応じて、サポートされる標準はホスト\\\n    のオペレーティングシステム上のコンパイラに依存します。\n\n\n    筆者は自身のキャリアを通して、25種類の異なるLinuxおよびWindowsディストリビューションをサポートするオープンソースプロジェクトに関わり、新\\\n    しい言語機能やC++標準に対するコンパイラのサポートが多様であることを実感してきました。2015年にはC++11の機能を採用し、それ以降C++14やC\\\n    ++17に触れることはありませんでした。\n\n\n    関数やアルゴリズムを新しいC++標準にリファクタリングするのには多大な労力がかかり、その違いを説明する支援が必要でした。当時は、リファクタリングの調べ\\\n    ものを、書籍やオンライン検索、Stack Overflow、そして時にはツールの助けを借りて行っていました。\n\n\n    しかし、AI搭載のアシストやGitLab Duoの登場で状況は変わりました。コード提案やDuo\n    Chatに、特定のC++標準に準拠したソースコードを提示するよう指示したり、異なる出力を比較したりできるようになったのです。\n\n    しかし、AI搭載のアシストやGitLab Duoの登場で状況は変わりました。コード提案やDuo\n    Chatに、特定のC++標準に準拠したソースコードを提示するよう指示したり、異なる出力を比較したりできるようになったのです。\n\n\n    次の例では、C++03標準に特化したプロンプトを使用してソースコードを生成しています。これは、`.ini`\n    構成フォーマット用のシンプルなコンフィグパーサー（configparser）を実装しています。\n\n\n    ```c++\n\n    /* iniフォーマットを解析できるconfigparserを作成\n\n    C++03標準のみを使用\n\n    \\ */\n\n\n    #include \u003Ciostream>\n\n    #include \u003Cfstream>\n\n    #include \u003Cstring>\n\n    #include \u003Cmap>\n\n    #include \u003Csstream>\n\n\n    class ConfigParser {\n\n    private:\n\n    \\    std::map\u003Cstd::string, std::map\u003Cstd::string, std::string> > config;\n\n\n    public:\n\n    \\    ConfigParser() {}\n\n\n    \\    bool parse(const std::string& filename) {\n\n    \\        std::ifstream file(filename.c_str());\n\n    \\        if (!file.is_open()) {\n\n    \\            return false;\n\n    \\        }\n\n\n    \\        std::string line;\n\n    \\        std::string currentSection;\n\n\n    \\        while (std::getline(file, line)) {\n\n    \\            // Trim whitespace\n\n    \\            size_t first = line.find_first_not_of(\\\" \\\\t\\\");\n\n    \\            size_t last = line.find_last_not_of(\\\" \\\\t\\\");\n\n    \\            if (first == std::string::npos) continue; // Skip empty lines\n\n    \\            line = line.substr(first, (last - first + 1));\n\n\n    \\            if (line[0] == '[' && line[line.length() - 1] == ']') {\n\n    \\                // This is a section\n\n    \\                currentSection = line.substr(1, line.length() - 2);\n\n    \\            } else {\n\n    \\                // This is a key-value pair\n\n    \\                size_t delimiterPos = line.find('=');\n\n    \\                if (delimiterPos != std::string::npos) {\n\n    \\                    std::string key = line.substr(0, delimiterPos);\n\n    \\                    std::string value = line.substr(delimiterPos + 1);\n\n    \\                    config[currentSection][key] = value;\n\n    \\                }\n\n    \\            }\n\n    \\        }\n\n\n    \\        file.close();\n\n    \\        return true;\n\n    \\    }\n\n\n    \\    std::string getValue(const std::string& section, const std::string&\n    key) const {\n\n    \\        std::map\u003Cstd::string, std::map\u003Cstd::string, std::string>\n    >::const_iterator sectionIt = config.find(section);\n\n    \\        if (sectionIt != config.end()) {\n\n    \\            std::map\u003Cstd::string, std::string>::const_iterator keyIt =\n    sectionIt->second.find(key);\n\n    \\            if (keyIt != sectionIt->second.end()) {\n\n    \\                return keyIt->second;\n\n    \\            }\n\n    \\        }\n\n    \\        return \\\"\\\";\n\n    \\    }\n\n\n    \\    void printConfig() const {\n\n    \\        std::map\u003Cstd::string, std::map\u003Cstd::string, std::string>\n    >::const_iterator sectionIt;\n\n    \\        for (sectionIt = config.begin(); sectionIt != config.end();\n    ++sectionIt) {\n\n    \\            std::cout \u003C\u003C \\\"[\\\" \u003C\u003C sectionIt->first \u003C\u003C \\\"]\\\" \u003C\u003C std::endl;\n\n    \\            std::map\u003Cstd::string, std::string>::const_iterator keyIt;\n\n    \\            for (keyIt = sectionIt->second.begin(); keyIt !=\n    sectionIt->second.end(); ++keyIt) {\n\n    \\                std::cout \u003C\u003C keyIt->first \u003C\u003C \\\" = \\\" \u003C\u003C keyIt->second \u003C\u003C\n    std::endl;\n\n    \\            }\n\n    \\            std::cout \u003C\u003C std::endl;\n\n    \\        }\n\n    \\    }\n\n    };\n\n\n    int main() {\n\n    \\    ConfigParser parser;\n\n    \\    if (parser.parse(\\\"config.ini\\\")) {\n\n    \\        std::cout \u003C\u003C \\\"Config file parsed successfully.\\\" \u003C\u003C std::endl;\n\n    \\        parser.printConfig();\n\n\n    \\        std::cout \u003C\u003C \\\"Value of 'key1' in 'section1': \\\" \u003C\u003C\n    parser.getValue(\\\"section1\\\", \\\"key1\\\") \u003C\u003C std::endl;\n\n    \\    } else {\n\n    \\        std::cout \u003C\u003C \\\"Failed to parse config file.\\\" \u003C\u003C std::endl;\n\n    \\    }\n\n    \\    return 0;\n\n    }\n\n    ```\n\n\n    同じプロンプトを、[コードの説明](https://docs.gitlab.com/ja-jp/user/gitlab_duo_chat/examples/#explain-code-in-the-ide)、[テスト生成](https://docs.gitlab.com/ja-jp/user/gitlab_duo_chat/examples/#write-tests-in-the-ide)、さらには[コードのリファクタリング](https://docs.gitlab.com/ja-jp/user/gitlab_duo_chat/examples/#refactor-code-in-the-ide)にも適用できます。たとえば、`/explain focus on C++03 features`、`/tests for C++03\n    features`、`/refactor into C++03` などです。\\\n\n\n    次のC++標準は、GitLab Duoのコード提案を使用して動作を確認済みです。\n\n\n    - C++03\n\n    - C++11\n\n    - C++14\n\n    - C++17\n\n    - C++20\n\n    - C++23\n\n\n    ソースコードは、[Challenge - Refactor Cpp Standards Config Parser\n    project](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-\\\n    challenges/code-challenges/challenge-refactor-cpp-standards-config-parser)で\\\n    取得できます。\n\n\n    C++標準間でソースコードをリファクタリングする組み合わせは数多く存在します。次の例では、C++コードを最新バージョンにアップグレードするケースに焦点\\\n    を当てています。一方、熱心なデベロッパーがC++20を使用したいものの、エンタープライズな顧客環境をサポートするためにC++11にダウングレードしなけ\\\n    ればならなかったというシナリオもテストしています。\n\n\n    #### 移行：C++03をC++14にリファクタリング\n\n\n    ここでは、コードのモダナイゼーションを行い、C++03からC++14への変更点を理解することを目標とします。IDEで[03.cpp](https://\\\n    gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-c\\\n    hallenges/challenge-refactor-cpp-standards-config-parser/-/blob/main/03.cpp\\\n    ?ref_type=heads)のソースコードを開き、選択した後、次のChatプロンプトを使用します。\n\n\n    ```markdown\n\n    /refactor into C++14 and explain the changes\n\n    （日本語訳：/C++14にリファクタリングし、変更を説明してください）\n\n    ```\n\n\n    Chatの回答例：\n\n\n    ```markdown\n\n    …\n\n\n    変更点の説明：\n\n\n    1. デフォルトコンストラクタ: `ConfigParser() {}` を `ConfigParser() = default;`\n    に変更し、デフォルトコンストラクタを使用しました。\n\n    2. ファイルオープン: ファイルを開く際、`.c_str()` を削除しました。C++11以降では、`std::string`\n    が直接サポートされています。\n\n    3. ラムダ関数: 文字列のトリミング処理を行うラムダ関数trimを導入し、コードの可読性と再利用性を向上させました。\n\n    4. 自動キーワード: 型推論のために様々な箇所で `auto` を使用し、コードの可読性を改善しました。\n\n    5. 範囲ベースのforループ:  `printConfig`\n    メソッド内で従来のforループを範囲ベースのforループに置き換え、より簡潔でエラーが少ない構造にしました。\n\n    6. 構造化束縛: 範囲ベースのforループで構造化束縛を使用し、キーと値のペアに直接アクセスできるようにしました。\n\n    7. 初期化付きif文: `getValue` メソッド内で、検索操作と条件チェックを1行で行える初期化付きif文を使用しました。\n\n    8. 文字列メンバー関数: 文字列の最初と最後の文字を取得する際に、配列風のアクセスではなく `front()` と `back()` を使用しました。\n\n    9. 初期化の統一: オブジェクトの生成時に `()` ではなく `{}` を使用する統一された初期化を採用しました。\n\n    10. `std::endl` の削除： `std::endl` を `'\\\\n'` に置き換え、パフォーマンスを向上させました。`std::endl`\n    は出力バッファーを強制的にフラッシュするためです。\n\n\n    これらの変更により、コードはよりモダンで簡潔になり、同じ機能を維持しつつ効率性が向上しています。\n\n\n    ```\n\n\n    ![コードに反映された変更](https://res.cloudinary.com/about-gitlab-com/image/upload/v17\\\n    49675059/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp03_to_14_01.p\\\n    ng)\n\n\n    ![コードに反映された変更2](https://res.cloudinary.com/about-gitlab-com/image/upload/v1\\\n    749675060/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp03_to_14_02.\\\n    png)\n\n\n    #### ダウングレード：C++23をC++11にリファクタリング\n\n\n    時に、デベロッパーはC++20のようなモダンなC++標準で新しい機能の概念実証を開始しますが、エンタープライズな顧客環境で実際にサポートされているバー\\\n    ジョンでは、C++11をサポートする古いコンパイラが必要になる場合があります。バージョンをダウングレードするにはコストがかかるほか、どの言語機能がまだ\\\n    サポートされているかを確認し、潜在的なデメリットを検討する必要があります。\n\n\n    IDEで[23.cpp](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-\\\n    duo-challenges/code-challenges/challenge-refactor-cpp-standards-config-pars\\\n    er/-/blob/main/23.cpp?ref_type=heads)のソースコードを開き、選択した後、次のChatプロンプトを使用します。\n\n\n    ```markdown\n\n    /refactor into C++11, explain the necessary changes and potential problems\n\n    （日本語訳：/C++14にリファクタリングし、必要な変更点と潜在的な問題点を説明してください）\n\n    ```\n\n\n    Duo Chatの回答例：\n\n\n    ```markdown\n\n    このコードをC++11に対応させるために必要な主な変更点は次の通りです：\n\n\n    1. C++23標準のコメントを削除しました。これはもう適用されないためです。\n\n    2. trim関数内で `std::string::find_first_not_of`\n    と  `std::string::find_last_not_of` をC++11対応の代替方法に置き換えました。\n\n    3. ループ変数には `auto` の代わりに `const auto&` を使用し、不要なコピーを避けました。\n\n\n    オリジナルのコードにおける潜在的な問題点は次の通りです：\n\n\n    1. オリジナルのコードはC++23の機能を使用しており、まだ広くサポートされていない可能性があります。\n\n    2. `trim` 関数では `std::string::find_first_not_of` と\n    `std::string::find_last_not_of` を使用しており、これらはC++11には存在しません。\n\n    3. 一部のループで `const auto&` の代わりに `auto`\n    を使用していないと、複雑なオブジェクトが不必要にコピーされる可能性があります。\n\n\n    これらの問題はリファクタリング版で解決されています。`trim` 関数は、C++11対応の場合と同じ結果を得るために、ラムダ関数を使った\n    `std::find_if_not` を利用するように変更されました。また、 `const auto&`\n    を使用することで、設定マップを反復処理する際に不要なコピーが行われないようにしました。\n\n    ```\n\n\n    ![`trim` 関数は、C++11に対応する形で、ラムダ関数を使った `std::find_if_not`\n    を使用して同じ結果をもたらすようになりました](https://res.cloudinary.com/about-gitlab-com/image/u\\\n    pload/v1749675059/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp23_t\\\n    o_11_01.png)\n\n\n    ![`const auto&`\n    を使用することで、configマップを反復処理する際の不要なコピーの生成を防ぎ、パフォーマンスを最適化できます](https://res.cloudi\\\n    nary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/du\\\n    o_refactor_cpp_clion_chat_cpp23_to_11_02.png)\n\n\n    **非同期練習**：他のバージョンのリファクタリングシナリオをテストしてみましょう。\n\n\n    ### COBOLの説明とリファクタリング\n\n\n    GitLab\n    Duoを使用して、COBOLプログラムのソースコードを説明させたり、解析、修正、リファクタリングを実行してもらえます。筆者はCOBOLを書いたことも学\\\n    んだこともありませんでしたが、この[COBOL Programming\n    Course](https://github.com/openmainframeproject/cobol-programming-course)では\\\n    豊富な例が紹介されていて有用だと感じました。\n\n\n    その後、次のように、Chatに「COBOLの始め方」「COBOLプログラムの作成方法」「macOSでのCOBOLプログラムのコンパイル方法」について質\\\n    問しました。\n\n\n    ```markdown\n\n    Please explain what COBOL is and its syntax\n\n    （日本語訳：COBOLとは何か、その構文について説明してください。）\n\n\n    Please create a COBOL program that shows the first steps\n\n    （日本語訳：COBOLプログラムを作成し、最初のステップを示してください。）\n\n\n    Tell me more about the COBOL compiler. Which system do I need? Can I do it\n    on my macOS?\n\n    （日本語訳：COBOLコンパイラについて教えてください。どのようなシステムが必要ですか？ macOSで実行できますか？）\n\n    ```\\t\n\n\n    ![GitLab Duo\n    Chatに説明とその構文を求める](https://res.cloudinary.com/about-gitlab-com/image/upload/\\\n    v1749675059/Blog/Content%20Images/vscode_chat_cobol_generate_example.png)\n\n\n    COBOLプログラムを開き、ソースコードを選択したら、Duo Chatに切り替えて、`/explain`\n    プロンプトを送信し、目的や機能を説明してもらいましょう。\n\n\n    また、プロンプトをさらに洗練して、全体像をより反映したサマリーを取得することもできます。\n\n\n    ```markdown\\\n\n    /explain like I am five\n\n    （日本語訳：/explain ５歳児にもわかるように説明してください。）\n\n    ```\n\n\n    >\n    ヒント：プログラミング言語は、類似したアルゴリズムや機能を共有しています。COBOLについては、ChatによるPythonを介した説明が提供されたため\\\n    、以降のプロンプトではPythonでの説明を求めるように調整しました。\n\n\n    ```markdown\n\n    /explain in a different programming language\n\n    （日本語訳：/explain 異なるプログラミング言語で説明してください。）\n\n    ```\n\n\n    Chatでは、`/refactor`\n    スラッシュ（/）コマンドを使用して、コード品質の改善、潜在的な問題の修正、およびCOBOLのPythonへのリファクタリングを実行できます。\n\n\n    ```markdown\n\n    /refactor fix the environment error\n\n    （日本語訳：/refactor 環境上のエラーを修正してください。）\n\n\n    /refactor fix potential problems\n\n    （日本語訳：/refactor 潜在的な問題を修正してください。）\n\n\n    /refactor into Python\n\n    （日本語訳：/refactor Pythonにリファクタリングしてください。）\n\n    ```\n\n\n    次の[GitLab Duo Coffee Chat - Challenge: Explain and Refactor COBOL\n    programs](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo\\\n    -challenges/code-challenges/challenge-explain-refactor-cobol-program)の録画では、\\\n    欠落しているピリオドの見つけ方など、すべての手順が実際のユースケースをもとに説明されています。\n\n\n    \u003C!-- 空白行 -->\n\n    \u003Cfigure class=\\\"video_container\\\">\n\n    \\  \u003Ciframe src=\\\"https://www.youtube.com/embed/pwlDmLQMMPo\\\"\n    frameborder=\\\"0\\\" allowfullscreen=\\\"true\\\"> \u003C/iframe>\n\n    \u003C/figure>\n\n    \u003C!-- 空白行 -->\n\n\n    ## 異なる言語間でのリファクタリング\n\n\n    モダナイゼーションとコード品質の改善には、プログラミング言語の変更が必要になる場合があります。GitLab\n    Duoのリファクタリングプロンプトを使用して、移行プロセスを迅速に進められますCOBOLとPythonの例は、エンタープライズ環境において一般的な要件\\\n    のひとつに過ぎません。その他のユースケースを詳しく見ていきましょう。\n\n\n    ### CをRustにリファクタリング\n\n\n    2024年初頭に、Cを始めとするいくつかのプログラミング言語は、メモリの安全性に問題があると指摘されました。今後のプロジェクトでは、Rustのような[\\\n    メモリ安全な言語](https://about.gitlab.com/blog/memory-safe-vs-unsafe/)（英語）が推奨されていま\\\n    す。ここでは、移行へのアプローチや、想定すべき課題について理解しましょう。\n\n\n    簡単なCの例で試してみましょう。このコードはコード提案を使用して生成されており、オペレーティングシステムの基本情報（名前、バージョン、プラットフォーム\\\n    など）を表示します。このCコードは、Windows、Linux、macOSでクロスプラットフォームにコンパイルできます。\n\n\n    ```c\n\n    // OSファイルを読み込み、プラットフォーム、名前、バージョンを特定する\n\n    // ターミナルに出力する\n\n    #include \u003Cstdio.h>\n\n    #include \u003Cstdlib.h>\n\n    #include \u003Cstring.h>\n\n\n    #ifdef _WIN32\n\n    \\    #include \u003Cwindows.h>\n\n    #elif __APPLE__\n\n    \\    #include \u003Csys/utsname.h>\n\n    #else\n\n    \\    #include \u003Csys/utsname.h>\n\n    #endif\n\n\n    void get_os_info() {\n\n    \\    #ifdef _WIN32\n\n    \\        OSVERSIONINFOEX info;\n\n    \\        ZeroMemory(&info, sizeof(OSVERSIONINFOEX));\n\n    \\        info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);\n\n    \\        GetVersionEx((OSVERSIONINFO*)&info);\n\n\n    \\        printf(\\\"Platform: Windows\\\\n\\\");\n\n    \\        printf(\\\"Version: %d.%d\\\\n\\\", info.dwMajorVersion,\n    info.dwMinorVersion);\n\n    \\        printf(\\\"Build: %d\\\\n\\\", info.dwBuildNumber);\n\n    \\    #elif __APPLE__\n\n    \\        struct utsname sys_info;\n\n    \\        uname(&sys_info);\n\n\n    \\        printf(\\\"Platform: macOS\\\\n\\\");\n\n    \\        printf(\\\"Name: %s\\\\n\\\", sys_info.sysname);\n\n    \\        printf(\\\"Version: %s\\\\n\\\", sys_info.release);\n\n    \\    #else\n\n    \\        struct utsname sys_info;\n\n    \\        uname(&sys_info);\n\n\n    \\        printf(\\\"Platform: %s\\\\n\\\", sys_info.sysname);\n\n    \\        printf(\\\"Name: %s\\\\n\\\", sys_info.nodename);\n\n    \\        printf(\\\"Version: %s\\\\n\\\", sys_info.release);\n\n    \\    #endif\n\n    }\n\n\n    int main() {\n\n    \\    get_os_info();\n\n    \\    return 0;\n\n    }\n\n    ```\n\n\n    ここでは、JetBrains CLionなどを使用して\n    [`os.c`](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-\\\n    challenges/code-challenges/challenge-refactor-c-to-rust/-/blob/897bf57a14bb\\\n    7be07d842e7f044f93a61456d611/c/os.c) のソースコードを開きます。 ソースコードを選択し、Chatプロンプトで\n    `/explain` を使用して目的や機能を説明します。次に、Chatプロンプトで `/refactor`\n    を使用してCコードをリファクタリングし、さらに `/refactor into Rust` を使用してRustにリファクタリングします。\n\n\n    新しいRustプロジェクトを初期化（ヒント：Duo Chatに質問してみましょう）し、生成されたソースコードを `src/main.rs`\n    ファイルにコピーします。`cargo build` を実行してコードをコンパイルします。\n\n\n    ![新しいRustプロジェクトを初期化し、生成されたソースコードを `src/main.rs` ファイルにコピーします。`cargo build`\n    を実行してコードをコンパイルします。](https://res.cloudinary.com/about-gitlab-com/image/uploa\\\n    d/v1749675059/Blog/Content%20Images/jetbrains_clion_c_rust.png)\n\n\n    [GitLab Duo Coffee Chat: Challenge - Refactor C into Rust ](\n    https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenge\\\n    s/code-challenges/challenge-refactor-c-to-rust)の録画では、の録画では、すべての手順を確認できるほか、コ\\\n    ンパイルエラーが発生し、それがChatと `/refactor` スラッシュ(/)\n    コマンドによって修正される様子もご覧になれます。また、このセッションでは、新しいRustコードのメンテナンス性を向上させるために、エラーハンドリングを\\\n    追加する方法も紹介されています。\n\n\n    \u003C!-- 空白行 -->\n\n    \u003Cfigure class=\\\"video_container\\\">\n\n    \\  \u003Ciframe src=\\\"https://www.youtube.com/embed/nf8g2ucqvkI\\\"\n    frameborder=\\\"0\\\" allowfullscreen=\\\"true\\\"> \u003C/iframe>\n\n    \u003C/figure>\n\n    \u003C!-- 空白行 -->\n\n\n    ### PerlをPythonにリファクタリング\n\n\n    本番環境サーバーでジョブを実行するスクリプトがありますが、作成者は10年前に退社しており、誰もそのスクリプトに手を付けたがりません。この問題は、複数の\\\n    スクリプトや、さらにはアプリケーション全体にも影響している可能性があります。そこで、すべてをモダンなPython\n    3に移行する決定が下されました。ここでは、コードのモダナイゼーションを行い、PerlからPythonへの変更点を理解することを目標とします。\n\n\n    最近、GitLab Duoのワークショップに参加したお客様から、GitLab\n    Duoを使って直接移行が可能かどうかという質問がありました。一言でお答えすれば、「可能」です。これを詳しく説明するならば、この記事にある他の例と同様に\\\n    、洗練されたChatプロンプトを使用することで、PerlコードをPythonにリファクタリングすることができます。\n\n\n    `script.pl` ソースコードをIDEで開き、選択して、Chatを開きます。\n\n\n    ```perl\n\n    #!/usr/bin/perl\n\n    use strict;\n\n    use warnings;\n\n\n    open my $md_fh, '\u003C', 'file.md' or die \\\"Could not open file.md: $!\\\";\n\n\n    my $l = 0;\n\n    my $e = 0;\n\n    my $h = 0;\n\n\n    while (my $line = \u003C$md_fh>) {\n\n    \\  $l++;\n\n    \\  if ($line =~ /^\\\\s*$/) {\n\n    \\    $e++;\n\n    \\    next;\n\n    \\  }\n\n    \\  if ($line =~ /^#+\\\\s*(.+)/) {\n\n    \\    print \\\"$1\\\\n\\\";\n\n    \\    $h++;\\\n\n    \\  }\n\n    }\n\n\n    print \\\"\\\\nS:\\\\n\\\";\\\n\n    print \\\"L: $l\\\\n\\\";\n\n    print \\\"E: $e\\\\n\\\";\\\n\n    print \\\"H: $h\\\\n\\\";\n\n    ```\n\n\n    次のプロンプトを使用できます：\n\n\n    1. `/explain` でその目的を説明させ、 `/refactor` でコードを改善させます。\n\n    2. `/refactor into Python`：実行可能なPythonスクリプトを取得します。\n\n\n    ![Pythonへのリファクタリング](https://res.cloudinary.com/about-gitlab-com/image/uploa\\\n    d/v1749675059/Blog/Content%20Images/pycharm_duo_refactor_perl_python.png)\n\n\n    > ヒント：Perlコードは、より多くのターゲット言語にリファクタリングできます。[GitLab Duo Coffee Chat：チャレンジ -\n    PerlからPythonへのリファクタリング](https://gitlab.com/gitlab-da/use-cases/ai/ai-workfl\\\n    ows/gitlab-duo-challenges/code-challenges/challenge-refactor-perl-python)の録\\\n    画では、PHP、Ruby、Rust、Go、Java、VB.NET、C#などの言語も取り上げています。\n\n    >\n\n    >\n    Perlスクリプトの使用を継続するには、Duoのコード提案で[Perlを追加言語として](https://docs.gitlab.com/ja-jp/use/\n    r/project/repository/code_suggestions/supported_extensions.html#add-support\\\n    -for-more-languages)設定できます。ChatはすでにPerlを理解しており、質問やスラッシュ（/）\n    コマンドのプロンプトにも対応できます。次の録画でこれについて確認できます。\n\n\n    \u003C!-- 空白行 -->\n\n    \u003Cfigure class=\\\"video_container\\\">\n\n    \\  \u003Ciframe src=\\\"https://www.youtube.com/embed/03HGhxXg9lw\\\"\n    frameborder=\\\"0\\\" allowfullscreen=\\\"true\\\"> \u003C/iframe>\n\n    \u003C/figure>\n\n    \u003C!-- 空白行 -->\n\n\n    ## その他のリファクタリング実践例\n\n\n    ### JavaScriptのリファクタリング\n\n\n    JavaScriptをリファクタリングしてコード品質を向上させたり、機能を追加したりする方法について、Eddie\n    Jaoudeが実用的な例を交えて紹介しています。\n\n\n    \u003C!-- 空白行 -->\n\n    \u003Cfigure class=\\\"video_container\\\">\n\n    \\  \u003Ciframe src=\\\"https://www.youtube.com/embed/mHn8KOzpPNY\\\"\n    frameborder=\\\"0\\\" allowfullscreen=\\\"true\\\"> \u003C/iframe>\n\n    \u003C/figure>\n\n    \u003C!-- 空白行 -->\n\n\n    ### BashをZSHやSHにリファクタリング\n\n\n    筆者はBashをShellとして20年間使用していましたが、最近になってmacOSのZSHに移行しました。この移行に伴い、スクリプトが機能しなくなった\\\n    り、端末に不明なエラーが発生したりしました。リファクタリングの別のユースケースとして、Shellの制約があります。たとえば、一部のオペレーティングシス\\\n    テムやLinux/Unixディストリビューション（Alpineなど）では、Bashが提供されておらず、SHしか使用できません。\n\n\n    ![シェルスクリプトのリファクタリング](https://res.cloudinary.com/about-gitlab-com/image/uplo\\\n    ad/v1749675059/Blog/Content%20Images/intellj_refactor_shell_scripts.png)\n\n\n    [GitLab Duo Coffee Chat: Challenge - Refactor Shell Scripts ](\n    https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenge\\\n    s/code-challenges/challenge-refactor-shell-scripts)では、syslogファイルを追跡するCプログラム\\\n    と、Bashで記述されたビルドスクリプトの例が紹介されています。このチャレンジの中では、コードの改善を目的として、Chatに対して `/explain`\n    や `/refactor`\n    のプロンプトが使用されます。また、BashをPOSIX準拠のSHやZSHにリファクタリングすることもできます。セッションの最後では、Chatに5つの異\\\n    なるShellスクリプトの実装を提供させ、そのサマリーについて説明するようリクエストしています。\n\n\n    \u003C!-- 空白行 -->\n\n    \u003Cfigure class=\\\"video_container\\\">\n\n    \\  \u003Ciframe src=\\\"https://www.youtube.com/embed/mssqYjlKGzU\\\"\n    frameborder=\\\"0\\\" allowfullscreen=\\\"true\\\"> \u003C/iframe>\n\n    \u003C/figure>\n\n    \u003C!-- 空白行 -->\n\n\n    ### その他のユースケースとチュートリアル\n\n\n    - [ドキュメント：GitLab\n    Duoのユースケース](https://docs.gitlab.com/ja-jp/user/gitlab_duo/use_cases/)\n\n    - [チュートリアル：AI搭載のGitLab\n    Duoチャットを使用するためのベストプラクティス【10選】](https://about.gitlab.com/blog/top-tips-for-e\\\n    fficient-ai-powered-code-suggestions-with-gitlab-duo/)\n\n    - [チュートリアル：AI搭載のGitLab\n    Duoチャットを使用するためのベストプラクティス【10選】](https://about.gitlab.com/ja-jp/blog/10-best-\\\n    practices-for-using-ai-powered-gitlab-duo-chat/)\n\n\n    ## 重要なポイント\n\n\n    1. GitLab Duoは、コードの説明やリファクタリングにおいて効率的なサポートを提供します。\n\n    1. 言語標準間でコードをリファクタリングしたり、Chatで追加の質問をしたりできます。\n\n    1. コード提案のプロンプトは、特定の言語標準に基づいたコードを生成できます。また、コード補完は現行のコードのコンテキストを尊重します。\n\n    1. 新しいプログラミング言語へのリファクタリングは、長期的な移行プロセスやモダナイゼーションの計画に有効です。\n\n    1. コードは、古いシステムがサポートする言語標準に「ダウングレード」することもできます。\n\n    1. GitLab Duoは、複雑なコードやプログラミング言語について、異なるプログラミング言語の例を用いて説明できます。\n\n    1. GitLab.comにおけるAnthropic Claude\n    3.5へのアップデートにより、コード提案およびChatの質と速度がさらに向上しました（Self-Managed版では17.3へのアップグレードを推奨し\\\n    ています）。\n\n    1. 本番環境における問題がある場合を除き、ユースケースはアイデア次第で無限に広がります。\n\n\n    コード提案とChatを活用した効率的なワークフローについて理解を深めましょう。GitLab\n    DuoのAI搭載コードリファクタリングを、今すぐお試しいただけます。\n\n\n    > [GitLab\n    Duoのの無料トライアルを開始しましょう！](https://about.gitlab.com/ja-jp/solutions/gitlab-duo-\\\n    pro/sales/?type=free-trial&toggle=gitlab-duo-pro_)\n\n\n    *監修：知念 梨果 [@rikachinen](https://gitlab.com/rikachinen)* \u003Cbr>\n\n    *（GitLab合同会社 カスタマーサクセス本部 カスタマーサクセスエンジニア）*\\n\"\n  category: ai-ml\n  tags:\n    - AI/ML\n    - tutorial\n    - DevSecOps\n  updatedDate: '2025-02-10'\nconfig:\n  slug: refactor-code-into-modern-languages-with-ai-powered-gitlab-duo\n  featured: false\n  template: BlogPost\n",{"title":5,"description":17,"ogTitle":5,"ogDescription":17,"noIndex":14,"ogImage":19,"ogUrl":33,"ogSiteName":34,"ogType":35,"canonicalUrls":33},"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",[38,23,39],"aiml","devsecops",[22,23,24],"moOWnkQLX9fhjQp1Atz8gcPyQ4G1Z4jtQP59EWcG3oU",{"data":43},{"logo":44,"freeTrial":49,"sales":54,"login":59,"items":64,"search":373,"minimal":406,"duo":423,"switchNav":432,"pricingDeployment":443},{"config":45},{"href":46,"dataGaName":47,"dataGaLocation":48},"/ja-jp/","gitlab logo","header",{"text":50,"config":51},"無料トライアルを開始",{"href":52,"dataGaName":53,"dataGaLocation":48},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp&glm_content=default-saas-trial/","free trial",{"text":55,"config":56},"お問い合わせ",{"href":57,"dataGaName":58,"dataGaLocation":48},"/ja-jp/sales/","sales",{"text":60,"config":61},"サインイン",{"href":62,"dataGaName":63,"dataGaLocation":48},"https://gitlab.com/users/sign_in/","sign in",[65,92,189,194,295,355],{"text":66,"config":67,"cards":69},"プラットフォーム",{"dataNavLevelOne":68},"platform",[70,76,84],{"title":66,"description":71,"link":72},"DevSecOpsに特化したインテリジェントオーケストレーションプラットフォーム",{"text":73,"config":74},"プラットフォームを探索",{"href":75,"dataGaName":68,"dataGaLocation":48},"/ja-jp/platform/",{"title":77,"description":78,"link":79},"GitLab Duo Agent Platform","ソフトウェアライフサイクル全体を支えるエージェント型AI",{"text":80,"config":81},"GitLab Duoのご紹介",{"href":82,"dataGaName":83,"dataGaLocation":48},"/ja-jp/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":85,"description":86,"link":87},"GitLabが選ばれる理由","エンタープライズがGitLabを選ぶ主な理由をご覧ください",{"text":88,"config":89},"詳細はこちら",{"href":90,"dataGaName":91,"dataGaLocation":48},"/ja-jp/why-gitlab/","why gitlab",{"text":93,"left":29,"config":94,"link":96,"lists":100,"footer":171},"製品",{"dataNavLevelOne":95},"solutions",{"text":97,"config":98},"すべてのソリューションを表示",{"href":99,"dataGaName":95,"dataGaLocation":48},"/ja-jp/solutions/",[101,126,149],{"title":102,"description":103,"link":104,"items":109},"自動化","CI/CDと自動化でデプロイを加速",{"config":105},{"icon":106,"href":107,"dataGaName":108,"dataGaLocation":48},"AutomatedCodeAlt","/ja-jp/solutions/delivery-automation/","automated software delivery",[110,114,117,122],{"text":111,"config":112},"CI/CD",{"href":113,"dataGaLocation":48,"dataGaName":111},"/ja-jp/solutions/continuous-integration/",{"text":77,"config":115},{"href":82,"dataGaLocation":48,"dataGaName":116},"gitlab duo agent platform - product menu",{"text":118,"config":119},"ソースコード管理",{"href":120,"dataGaLocation":48,"dataGaName":121},"/ja-jp/solutions/source-code-management/","Source Code Management",{"text":123,"config":124},"自動化されたソフトウェアデリバリー",{"href":107,"dataGaLocation":48,"dataGaName":125},"Automated software delivery",{"title":127,"description":128,"link":129,"items":134},"セキュリティ","セキュリティを犠牲にすることなくコード作成を高速化",{"config":130},{"href":131,"dataGaName":132,"dataGaLocation":48,"icon":133},"/ja-jp/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[135,139,144],{"text":136,"config":137},"アプリケーションセキュリティテスト",{"href":131,"dataGaName":138,"dataGaLocation":48},"Application security testing",{"text":140,"config":141},"ソフトウェアサプライチェーンの安全性",{"href":142,"dataGaLocation":48,"dataGaName":143},"/ja-jp/solutions/supply-chain/","Software supply chain security",{"text":145,"config":146},"ソフトウェアコンプライアンス",{"href":147,"dataGaName":148,"dataGaLocation":48},"/ja-jp/solutions/software-compliance/","software compliance",{"title":150,"link":151,"items":156},"測定",{"config":152},{"icon":153,"href":154,"dataGaName":155,"dataGaLocation":48},"DigitalTransformation","/ja-jp/solutions/visibility-measurement/","visibility and measurement",[157,161,166],{"text":158,"config":159},"可視性と測定",{"href":154,"dataGaLocation":48,"dataGaName":160},"Visibility and Measurement",{"text":162,"config":163},"バリューストリーム管理",{"href":164,"dataGaLocation":48,"dataGaName":165},"/ja-jp/solutions/value-stream-management/","Value Stream Management",{"text":167,"config":168},"分析とインサイト",{"href":169,"dataGaLocation":48,"dataGaName":170},"/ja-jp/solutions/analytics-and-insights/","Analytics and insights",{"title":172,"items":173},"GitLabが活躍する場所",[174,179,184],{"text":175,"config":176},"大企業",{"href":177,"dataGaLocation":48,"dataGaName":178},"/ja-jp/enterprise/","enterprise",{"text":180,"config":181},"スモールビジネス",{"href":182,"dataGaLocation":48,"dataGaName":183},"/ja-jp/small-business/","small business",{"text":185,"config":186},"公共部門",{"href":187,"dataGaLocation":48,"dataGaName":188},"/ja-jp/solutions/public-sector/","public sector",{"text":190,"config":191},"価格",{"href":192,"dataGaName":193,"dataGaLocation":48,"dataNavLevelOne":193},"/ja-jp/pricing/","pricing",{"text":195,"config":196,"link":198,"lists":202,"feature":282},"リソース",{"dataNavLevelOne":197},"resources",{"text":199,"config":200},"すべてのリソースを表示",{"href":201,"dataGaName":197,"dataGaLocation":48},"/ja-jp/resources/",[203,236,254],{"title":204,"items":205},"はじめに",[206,211,216,221,226,231],{"text":207,"config":208},"インストール",{"href":209,"dataGaName":210,"dataGaLocation":48},"/ja-jp/install/","install",{"text":212,"config":213},"クイックスタートガイド",{"href":214,"dataGaName":215,"dataGaLocation":48},"/ja-jp/get-started/","quick setup checklists",{"text":217,"config":218},"学ぶ",{"href":219,"dataGaLocation":48,"dataGaName":220},"https://university.gitlab.com/","learn",{"text":222,"config":223},"製品ドキュメント",{"href":224,"dataGaName":225,"dataGaLocation":48},"https://docs.gitlab.com/ja-jp/","product documentation",{"text":227,"config":228},"ベストプラクティスビデオ",{"href":229,"dataGaName":230,"dataGaLocation":48},"/ja-jp/getting-started-videos/","best practice videos",{"text":232,"config":233},"インテグレーション",{"href":234,"dataGaName":235,"dataGaLocation":48},"/ja-jp/integrations/","integrations",{"title":237,"items":238},"検索する",[239,244,249],{"text":240,"config":241},"お客様成功事例",{"href":242,"dataGaName":243,"dataGaLocation":48},"/ja-jp/customers/","customer success stories",{"text":245,"config":246},"ブログ",{"href":247,"dataGaName":248,"dataGaLocation":48},"/ja-jp/blog/","blog",{"text":250,"config":251},"リモート",{"href":252,"dataGaName":253,"dataGaLocation":48},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":255,"items":256},"つなげる",[257,262,267,272,277],{"text":258,"config":259},"GitLabサービス",{"href":260,"dataGaName":261,"dataGaLocation":48},"/ja-jp/services/","services",{"text":263,"config":264},"コミュニティ",{"href":265,"dataGaName":266,"dataGaLocation":48},"/community/","community",{"text":268,"config":269},"フォーラム",{"href":270,"dataGaName":271,"dataGaLocation":48},"https://forum.gitlab.com/","forum",{"text":273,"config":274},"イベント",{"href":275,"dataGaName":276,"dataGaLocation":48},"/events/","events",{"text":278,"config":279},"パートナー",{"href":280,"dataGaName":281,"dataGaLocation":48},"/ja-jp/partners/","partners",{"background":283,"textColor":284,"text":285,"image":286,"link":290},"#2f2a6b","#fff","ソフトウェア開発の未来への洞察",{"altText":287,"config":288},"ソースプロモカード",{"src":289},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":291,"config":292},"最新情報を読む",{"href":293,"dataGaName":294,"dataGaLocation":48},"/ja-jp/the-source/","the source",{"text":296,"config":297,"lists":299},"会社情報",{"dataNavLevelOne":298},"company",[300],{"items":301},[302,307,313,315,320,325,330,335,340,345,350],{"text":303,"config":304},"GitLabについて",{"href":305,"dataGaName":306,"dataGaLocation":48},"/ja-jp/company/","about",{"text":308,"config":309,"footerGa":312},"採用情報",{"href":310,"dataGaName":311,"dataGaLocation":48},"/jobs/","jobs",{"dataGaName":311},{"text":273,"config":314},{"href":275,"dataGaName":276,"dataGaLocation":48},{"text":316,"config":317},"経営陣",{"href":318,"dataGaName":319,"dataGaLocation":48},"/company/team/e-group/","leadership",{"text":321,"config":322},"チーム",{"href":323,"dataGaName":324,"dataGaLocation":48},"/company/team/","team",{"text":326,"config":327},"ハンドブック",{"href":328,"dataGaName":329,"dataGaLocation":48},"https://handbook.gitlab.com/","handbook",{"text":331,"config":332},"投資家向け情報",{"href":333,"dataGaName":334,"dataGaLocation":48},"https://ir.gitlab.com/","investor relations",{"text":336,"config":337},"トラストセンター",{"href":338,"dataGaName":339,"dataGaLocation":48},"/ja-jp/security/","trust center",{"text":341,"config":342},"AI Transparency Center",{"href":343,"dataGaName":344,"dataGaLocation":48},"/ja-jp/ai-transparency-center/","ai transparency center",{"text":346,"config":347},"ニュースレター",{"href":348,"dataGaName":349,"dataGaLocation":48},"/company/contact/#contact-forms","newsletter",{"text":351,"config":352},"プレス",{"href":353,"dataGaName":354,"dataGaLocation":48},"/press/","press",{"text":55,"config":356,"lists":357},{"dataNavLevelOne":298},[358],{"items":359},[360,363,368],{"text":55,"config":361},{"href":57,"dataGaName":362,"dataGaLocation":48},"talk to sales",{"text":364,"config":365},"サポートを受ける",{"href":366,"dataGaName":367,"dataGaLocation":48},"https://support.gitlab.com","support portal",{"text":369,"config":370},"カスタマーポータル",{"href":371,"dataGaName":372,"dataGaLocation":48},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":374,"login":375,"suggestions":382},"閉じる",{"text":376,"link":377},"リポジトリとプロジェクトを検索するには、次にログインします",{"text":378,"config":379},"GitLab.com",{"href":62,"dataGaName":380,"dataGaLocation":381},"search login","search",{"text":383,"default":384},"提案",[385,387,392,394,398,402],{"text":77,"config":386},{"href":82,"dataGaName":77,"dataGaLocation":381},{"text":388,"config":389},"コード提案（AI）",{"href":390,"dataGaName":391,"dataGaLocation":381},"/ja-jp/solutions/code-suggestions/","Code Suggestions (AI)",{"text":111,"config":393},{"href":113,"dataGaName":111,"dataGaLocation":381},{"text":395,"config":396},"GitLab on AWS",{"href":397,"dataGaName":395,"dataGaLocation":381},"/ja-jp/partners/technology-partners/aws/",{"text":399,"config":400},"GitLab on Google Cloud",{"href":401,"dataGaName":399,"dataGaLocation":381},"/ja-jp/partners/technology-partners/google-cloud-platform/",{"text":403,"config":404},"GitLabを選ぶ理由",{"href":90,"dataGaName":405,"dataGaLocation":381},"Why GitLab?",{"freeTrial":407,"mobileIcon":411,"desktopIcon":416,"secondaryButton":419},{"text":50,"config":408},{"href":409,"dataGaName":53,"dataGaLocation":410},"https://gitlab.com/-/trials/new/","nav",{"altText":412,"config":413},"GitLabアイコン",{"src":414,"dataGaName":415,"dataGaLocation":410},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":412,"config":417},{"src":418,"dataGaName":415,"dataGaLocation":410},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":204,"config":420},{"href":421,"dataGaName":422,"dataGaLocation":410},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp/get-started/","get started",{"freeTrial":424,"mobileIcon":428,"desktopIcon":430},{"text":425,"config":426},"GitLab Duoの詳細について",{"href":82,"dataGaName":427,"dataGaLocation":410},"gitlab duo",{"altText":412,"config":429},{"src":414,"dataGaName":415,"dataGaLocation":410},{"altText":412,"config":431},{"src":418,"dataGaName":415,"dataGaLocation":410},{"button":433,"mobileIcon":438,"desktopIcon":440},{"text":434,"config":435},"/switch",{"href":436,"dataGaName":437,"dataGaLocation":410},"#contact","switch",{"altText":412,"config":439},{"src":414,"dataGaName":415,"dataGaLocation":410},{"altText":412,"config":441},{"src":442,"dataGaName":415,"dataGaLocation":410},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":444,"mobileIcon":449,"desktopIcon":451},{"text":445,"config":446},"料金ページに戻る",{"href":192,"dataGaName":447,"dataGaLocation":410,"icon":448},"back to pricing","GoBack",{"altText":412,"config":450},{"src":414,"dataGaName":415,"dataGaLocation":410},{"altText":412,"config":452},{"src":418,"dataGaName":415,"dataGaLocation":410},{"title":454,"button":455,"config":460},"エージェント型AIがソフトウェア配信をどのように変革するかをご覧ください",{"text":456,"config":457},"GitLab Transcendを今すぐ視聴",{"href":458,"dataGaName":459,"dataGaLocation":48},"/ja-jp/events/transcend/virtual/","transcend event",{"layout":461,"icon":462,"disabled":29},"release","AiStar",{"data":464},{"text":465,"source":466,"edit":472,"contribute":477,"config":482,"items":487,"minimal":688},"GitはSoftware Freedom Conservancyの商標です。当社は「GitLab」をライセンスに基づいて使用しています",{"text":467,"config":468},"ページのソースを表示",{"href":469,"dataGaName":470,"dataGaLocation":471},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":473,"config":474},"このページを編集",{"href":475,"dataGaName":476,"dataGaLocation":471},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":478,"config":479},"ご協力をお願いします",{"href":480,"dataGaName":481,"dataGaLocation":471},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":483,"facebook":484,"youtube":485,"linkedin":486},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[488,533,584,627,654],{"title":190,"links":489,"subMenu":504},[490,494,499],{"text":491,"config":492},"プランの表示",{"href":192,"dataGaName":493,"dataGaLocation":471},"view plans",{"text":495,"config":496},"Premiumを選ぶ理由",{"href":497,"dataGaName":498,"dataGaLocation":471},"/ja-jp/pricing/premium/","why premium",{"text":500,"config":501},"Ultimateを選ぶ理由",{"href":502,"dataGaName":503,"dataGaLocation":471},"/ja-jp/pricing/ultimate/","why ultimate",[505],{"title":55,"links":506},[507,509,511,513,518,523,528],{"text":55,"config":508},{"href":57,"dataGaName":58,"dataGaLocation":471},{"text":364,"config":510},{"href":366,"dataGaName":367,"dataGaLocation":471},{"text":369,"config":512},{"href":371,"dataGaName":372,"dataGaLocation":471},{"text":514,"config":515},"ステータス",{"href":516,"dataGaName":517,"dataGaLocation":471},"https://status.gitlab.com/","status",{"text":519,"config":520},"利用規約",{"href":521,"dataGaName":522,"dataGaLocation":471},"/terms/","terms of use",{"text":524,"config":525},"プライバシーに関する声明",{"href":526,"dataGaName":527,"dataGaLocation":471},"/ja-jp/privacy/","privacy statement",{"text":529,"config":530},"Cookie 優先設定",{"dataGaName":531,"dataGaLocation":471,"id":532,"isOneTrustButton":29},"cookie preferences","ot-sdk-btn",{"title":93,"links":534,"subMenu":543},[535,539],{"text":536,"config":537},"DevSecOpsプラットフォーム",{"href":75,"dataGaName":538,"dataGaLocation":471},"devsecops platform",{"text":540,"config":541},"AI支援開発",{"href":82,"dataGaName":542,"dataGaLocation":471},"ai-assisted development",[544],{"title":545,"links":546},"トピック",[547,551,556,561,566,569,574,579],{"text":111,"config":548},{"href":549,"dataGaName":550,"dataGaLocation":471},"/ja-jp/topics/ci-cd/","cicd",{"text":552,"config":553},"GitOps",{"href":554,"dataGaName":555,"dataGaLocation":471},"/ja-jp/topics/gitops/","gitops",{"text":557,"config":558},"DevOps",{"href":559,"dataGaName":560,"dataGaLocation":471},"/ja-jp/topics/devops/","devops",{"text":562,"config":563},"バージョン管理",{"href":564,"dataGaName":565,"dataGaLocation":471},"/ja-jp/topics/version-control/","version control",{"text":24,"config":567},{"href":568,"dataGaName":39,"dataGaLocation":471},"/ja-jp/topics/devsecops/",{"text":570,"config":571},"クラウドネイティブ",{"href":572,"dataGaName":573,"dataGaLocation":471},"/ja-jp/topics/cloud-native/","cloud native",{"text":575,"config":576},"コーディングのためのAI",{"href":577,"dataGaName":578,"dataGaLocation":471},"/ja-jp/topics/devops/ai-for-coding/","ai for coding",{"text":580,"config":581},"エージェント型AI",{"href":582,"dataGaName":583,"dataGaLocation":471},"/ja-jp/topics/agentic-ai/","agentic ai",{"title":585,"links":586},"ソリューション",[587,590,592,597,601,604,607,610,612,614,617,622],{"text":136,"config":588},{"href":131,"dataGaName":589,"dataGaLocation":471},"Application Security Testing",{"text":123,"config":591},{"href":107,"dataGaName":108,"dataGaLocation":471},{"text":593,"config":594},"アジャイル開発",{"href":595,"dataGaName":596,"dataGaLocation":471},"/ja-jp/solutions/agile-delivery/","agile delivery",{"text":598,"config":599},"SCM",{"href":120,"dataGaName":600,"dataGaLocation":471},"source code management",{"text":111,"config":602},{"href":113,"dataGaName":603,"dataGaLocation":471},"continuous integration & delivery",{"text":162,"config":605},{"href":164,"dataGaName":606,"dataGaLocation":471},"value stream management",{"text":552,"config":608},{"href":609,"dataGaName":555,"dataGaLocation":471},"/ja-jp/solutions/gitops/",{"text":175,"config":611},{"href":177,"dataGaName":178,"dataGaLocation":471},{"text":180,"config":613},{"href":182,"dataGaName":183,"dataGaLocation":471},{"text":615,"config":616},"公共機関",{"href":187,"dataGaName":188,"dataGaLocation":471},{"text":618,"config":619},"教育",{"href":620,"dataGaName":621,"dataGaLocation":471},"/ja-jp/solutions/education/","education",{"text":623,"config":624},"金融サービス",{"href":625,"dataGaName":626,"dataGaLocation":471},"/ja-jp/solutions/finance/","financial services",{"title":195,"links":628},[629,631,633,635,638,640,642,644,646,648,650,652],{"text":207,"config":630},{"href":209,"dataGaName":210,"dataGaLocation":471},{"text":212,"config":632},{"href":214,"dataGaName":215,"dataGaLocation":471},{"text":217,"config":634},{"href":219,"dataGaName":220,"dataGaLocation":471},{"text":222,"config":636},{"href":224,"dataGaName":637,"dataGaLocation":471},"docs",{"text":245,"config":639},{"href":247,"dataGaName":248,"dataGaLocation":471},{"text":240,"config":641},{"href":242,"dataGaName":243,"dataGaLocation":471},{"text":250,"config":643},{"href":252,"dataGaName":253,"dataGaLocation":471},{"text":258,"config":645},{"href":260,"dataGaName":261,"dataGaLocation":471},{"text":263,"config":647},{"href":265,"dataGaName":266,"dataGaLocation":471},{"text":268,"config":649},{"href":270,"dataGaName":271,"dataGaLocation":471},{"text":273,"config":651},{"href":275,"dataGaName":276,"dataGaLocation":471},{"text":278,"config":653},{"href":280,"dataGaName":281,"dataGaLocation":471},{"title":296,"links":655},[656,658,660,662,664,666,668,672,677,679,681,683],{"text":303,"config":657},{"href":305,"dataGaName":298,"dataGaLocation":471},{"text":308,"config":659},{"href":310,"dataGaName":311,"dataGaLocation":471},{"text":316,"config":661},{"href":318,"dataGaName":319,"dataGaLocation":471},{"text":321,"config":663},{"href":323,"dataGaName":324,"dataGaLocation":471},{"text":326,"config":665},{"href":328,"dataGaName":329,"dataGaLocation":471},{"text":331,"config":667},{"href":333,"dataGaName":334,"dataGaLocation":471},{"text":669,"config":670},"Sustainability",{"href":671,"dataGaName":669,"dataGaLocation":471},"/sustainability/",{"text":673,"config":674},"ダイバーシティ、インクルージョン、ビロンギング（DIB）",{"href":675,"dataGaName":676,"dataGaLocation":471},"/ja-jp/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":336,"config":678},{"href":338,"dataGaName":339,"dataGaLocation":471},{"text":346,"config":680},{"href":348,"dataGaName":349,"dataGaLocation":471},{"text":351,"config":682},{"href":353,"dataGaName":354,"dataGaLocation":471},{"text":684,"config":685},"現代奴隷制の透明性に関する声明",{"href":686,"dataGaName":687,"dataGaLocation":471},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":689},[690,692,695],{"text":519,"config":691},{"href":521,"dataGaName":522,"dataGaLocation":471},{"text":693,"config":694},"Cookieの設定",{"dataGaName":531,"dataGaLocation":471,"id":532,"isOneTrustButton":29},{"text":524,"config":696},{"href":526,"dataGaName":527,"dataGaLocation":471},[698],{"id":699,"title":9,"body":27,"config":700,"content":702,"description":27,"extension":26,"meta":706,"navigation":29,"path":707,"seo":708,"stem":709,"__hash__":710},"blogAuthors/en-us/blog/authors/michael-friedrich.yml",{"template":701},"BlogAuthor",{"name":9,"config":703},{"headshot":704,"ctfId":705},"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",[712,725,740],{"content":713,"config":723},{"title":714,"description":715,"authors":716,"heroImage":718,"date":719,"body":720,"category":11,"tags":721},"GitLabとAnthropic：エンタープライズ開発のためのガバナンスAI","GitLabがAnthropicとのClaude統合を強化。ガバナンス・コンプライアンス・監査証跡を組み込んだプラットフォームで、最新Claudeモデルへのアクセス、そしてGoogle CloudやAWSを通じた柔軟なクラウド展開をエンタープライズに提供します。",[717],"Stuart Moncada","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776457632/llddiylsgwuze0u1rjks.png","2026-04-28","エンタープライズや公共セクターのリーダーにとって、この緊張関係は見慣れたものです。ソフトウェアチームはAIを活用してスピードを上げる必要がある一方、セキュリティ、コンプライアンス、規制上の要求はますます厳しくなっています。GitLabはAnthropicとのClaude統合を強化し、新たにリリースされたClaudeモデルへのアクセスを、ガバナンス・コンプライアンス・監査証跡がすでに組み込まれたGitLabのインテリジェントオーケストレーションプラットフォーム上で提供します。\n\nClaudeはGitLab Duo Agent Platformにおけるデフォルトモデルとして、コード生成・レビューからエージェント型チャット、脆弱性の解消まで、幅広いユースケースで機能を支えています。GitLab Duoをご利用いただいている方は、Duoエージェントがソフトウェア開発ライフサイクル（SDLC）全体にわたってワークフローを自動化する様子をすでにご体験いただいています。\n\nこの統合強化により、ClaudeのコアAI機能をGitLabにより迅速に統合し、エンタープライズが展開できる幅を広げるとともに、GitLabがソフトウェア開発・エンジニアリングプラットフォームとして本質的に異なる点を改めて示します。それは、すべてのAIインタラクションに組み込まれたガバナンス・コンプライアンス・監査証跡です。\n\n> 「GitLab Duoにより、チームの計画・構築・リリースのスピードが格段に上がりました。AnthropicのClaudeとGitLabのプラットフォームを組み合わせることで、働き方やガバナンスの仕組みを変えることなく、より高度なAIを活用できています。」 \\\n> – Mans Booijink氏、オペレーションマネージャー、Cube社\n\n## 真の差別化要因：ガバナンスAI\n\nGitLabでは、ガバナンスコントロールと監査機能がSDLCに組み込まれています。GitLab Duo Agent PlatformでClaudeがコード変更を提案する場合、その提案は他のあらゆる変更と同様に、マージリクエストのプロセス、承認ルール、セキュリティスキャン、そして監査証跡を経由します。AIはコントロールを迂回することはできません。AIはコントロールの枠組みの中で動作します。\n\nGitLabがエージェント型ソフトウェア開発、すなわちAIが明確に定義されたタスクを自律的に処理する開発手法へと深く踏み込む中、ガバナンスレイヤーの重要性はさらに増しています。マージリクエストのオープン、脆弱性の解消支援、サービスのリファクタリングを担えるAIエージェントには、人間の開発者と同様に、監査可能性・帰属明確性・ポリシー適用が求められます。この要件はGitLabが当初から下したアーキテクチャ上の決断であり、AIエージェントが担う責務の範囲が広がるにつれて、その重要性はさらに高まっています。\n\n## エンタープライズ向けデプロイの柔軟性\n\nまた、この統合強化により、組織がGitLabを通じて最新のClaudeモデルにアクセスする方法も広がります。GitLab内でのClaudeはGoogle CloudのVertex AIおよびAWS Bedrockを通じて利用可能であり、企業はすでに導入済みのハイパースケーラーとの契約やクラウドガバナンスフレームワークを通じてAIワークロードをルーティングできます。別途ベンダー契約は不要です。データレジデンシーに関する新たな懸念もありません。既存のGCPまたはAWSの関係がそのままオンランプとなります。\n\nGitLabは[Claude Marketplace](https://claude.com/platform/marketplace)にも参加しました。これにより、お客様はGitLabクレジットを購入してAnthropicへの既存の支出コミットメントに充てることができ、AIコストを一元管理しながら、Anthropicへの投資と並行してGitLabを手軽に見つけ、調達できるようになります。\n\n## エージェント型の未来へ\n\n計画・コーディング・テスト・セキュリティ確保・デプロイにわたり、AIが定義されたタスクを自律的にこなすエージェント型ソフトウェア開発というGitLabのビジョンを実現するには、高度な推論能力・信頼性・安全性を備えたモデルが必要です。そして、それらの自律的アクションが完全にガバナンスされるプラットフォームも不可欠です。\n\nエージェント型ワークフローには、高度な推論能力・信頼性・安全性を備えたモデルが求められます。これらの基準は、GitLabがAIモデルパートナーを選定・統合する際の指針となっています。また、GitLabのガバナンスフレームワークにより、AIエージェントがより高度な開発作業を担うようになっても、エンタープライズはエージェントの行動・実行タイミング・変更の追跡方法について完全な可視性とコントロールを維持できます。\n\n## GitLabをご利用のお客様への意味\n\nすでにGitLab Duo Agent Platformをご利用の方は、ソフトウェア開発ライフサイクル全体にわたってClaudeモデルへのアクセスとより深いAIアシスタンスを、これまで通りのガバナンスフレームワークの中でご活用いただけます。\n\nAI活用型ソフトウェア開発プラットフォームを評価中の方は、高度なAI機能とエンタープライズコントロールのどちらかを選ぶ必要はありません。この戦略的連携は、その両方を実現するために構築されています。\n\n> GitLab Duo Agent Platformについてさらに詳しく知りたい方は、[デモのご依頼または無料トライアルのお申し込みはこちら](https://about.gitlab.com/ja-jp/gitlab-duo-agent-platform/)からどうぞ。",[22,722,281],"product",{"featured":29,"template":15,"slug":724},"gitlab-and-anthropic-governed-ai-for-enterprise-development",{"content":726,"config":738},{"title":727,"description":728,"authors":729,"body":732,"heroImage":733,"date":734,"category":11,"tags":735},"GitLabとVertex AI on Google Cloud：エージェント型ソフトウェア開発の加速","Google CloudのVertex AIとGitLab Duo Agent Platformを組み合わせることで、ファウンデーションモデル、エンタープライズ制御、Model Gardenの豊富なモデルを活用したエージェント型開発が実現します。\n",[730,731],"Regnard Raquedan","Rajesh Agadi","GitLab Duo Agent Platformは、組織がソフトウェアをビルド、セキュア化、そして提供する方法を再定義しつつあります。2026年1月の一般提供開始以来、このプラットフォームはソフトウェア開発ライフサイクルのあらゆる段階にエージェント型AIをもたらしています。Duo Agent Platformは、ソフトウェアチームと専門エージェントが連携して計画、コーディング、レビュー、セキュリティ脆弱性の修正を行う、インテリジェントなオーケストレーションレイヤーです。\n\nこのパートナーシップを通じて、[GitLab Duo Agent Platform](https://about.gitlab.com/gitlab-duo-agent-platform/)はVertex AI on Google Cloudとの統合によりソフトウェア開発のオーケストレーションとライフサイクルコンテキストを自動化します。Vertex AIはエージェント呼び出しのモデル層を担い、ソフトウェアチームはすでに定義済みのGoogle Cloudポリシーに従って推論を実行しながら、イシュー、マージリクエスト、パイプライン、セキュリティワークフローの作業を継続できます。\n\nGoogle CloudのVertex AIモデルの進化により、Google CloudユーザーはGitLab Duo Agent Platformをさらに活用できるようになっています。GitLabではAIを活用したDevSecOpsコントロールプレーンを、Vertex AIの急速に進化するAIインフラ基盤と、Duo Agent Platformの柔軟なデプロイ・統合オプションが支えています。この組み合わせにより、エンタープライズスケールで動作する、より高度でガバナンスの効いたエージェント型ワークフローが実現します。\n\n![Google CloudのVertex AIと連携してエージェント型ソフトウェア開発とガバナンスを備えたAIワークフローを実現するGitLab Duo Agent Platformの概念図](https://res.cloudinary.com/about-gitlab-com/image/upload/v1776165990/b7jlux9kydafncwy8spc.png)\n\n## 開発ライフサイクル全体にわたるエージェント\n\n多くのAIツールは、コードをより速く生成するという単一のタスクに集中しています。GitLab Duo Agent Platformはそれをさらに超え、計画からセキュリティレビュー、リリースまで、ソフトウェア開発ライフサイクル（SDLC）全体にわたってAIエージェントをオーケストレーションします。これは、多数のプロジェクトとリリースを抱える多くのチームを対象としています。このスケールにおいて、AIコーディングアシスタントは継続的なイノベーションに必要ではありますが、それだけでは十分ではありません。\n\n単一目的のコーディングアシスタントがプロジェクトの全体像を把握することはほとんどありません。バックログの状況、オープン中のマージリクエスト、失敗したジョブ、セキュリティの検出結果はGitLabに蓄積されていますが、コーディングアシスタント内の別のチャットウィンドウはSDLCのその全体像を引き継ぐことができません。このギャップは、手動によるハンドオフ、コンテキストを持たないAIへの重複した説明、そして一つのシステムとして設計されたわけではないツール間のデータフローをマッピングしようとするガバナンスチームという形で表れます。\n\nGitLab Duo Agent Platformは、エンジニアが日々使用するオブジェクト上でエージェントとフローを動作させることで、このギャップを埋めます。Google Cloudを推論の基盤として選択している場合、Vertex AIはエージェントが呼び出すモデルとサービスを提供し、GitLabのAI Gatewayがアクセスを仲介することで管理者はどこに何が接続されているかを明確に把握できます。例えば、GitLab Duo Planner Agentはバックログを分析し、エピックを構造化タスクに分解し、優先順位付けフレームワークを適用することで、次に何を構築するかをチームが判断するのを支援します。Security Analyst Agentは脆弱性をトリアージし、平易な言葉でリスクを説明し、優先順位に従って修正を推奨します。ビルトインのフローはこれらのエージェントをエンドツーエンドのプロセスへと連結し、開発者がすべてのハンドオフを手動で管理する必要をなくします。\n\nGitLab Duo Agent PlatformのAgentic Chatは、開発者にとって統合された体験を提供します。自然言語でクエリを投げかけることで、プロジェクトのイシュー、マージリクエスト、パイプライン、セキュリティの検出結果、コードベースといった全体像を踏まえた多段階の推論に基づくコンテキスト対応の回答が得られます。GitLabがSDLCの統一データモデルを持つ記録システムとして機能しているため、GitLab Duoエージェントは、スタンドアロンのツール固有AIアシスタントでは到達できないライフサイクルコンテキストをもとに動作します。\n\n### Vertex AIによる能力の拡張\n\nGitLab Duo Agent Platformはモデルフレキシブルな設計となっており、タスクごとに最適なパフォーマンスを発揮するモデルへと異なる機能をルーティングします。このアーキテクチャの選択はGoogle Cloud上で効果を発揮します。Vertex AIはファウンデーションモデルと関連サービスのマネージド環境として機能し、幅広いモデルエコシステムとマネージドインフラを提供することでプラットフォームの能力をさらに引き出します。\n\nVertex AIを通じて利用できる最新世代のAIモデルは、以前のバージョンと比較して推論、ツール使用、長文コンテキスト理解において大幅な改善をもたらします。これらはまさに、GitLabのエージェントが大規模で複雑なコードベースを持つ多くのプロジェクトとチームにわたって依拠するプロパティです。基盤モデルにおけるより長いコンテキストウィンドウと豊富なツール連携により、エージェントが一度のパスで達成できることが広がり、深いバックログ分析やモノレポのセキュリティレビューといったワークロードに特に重要な意味を持ちます。\n\n幅広いファウンデーションモデルへのアクセスを提供する[Vertex AI Model Garden](https://cloud.google.com/model-garden)により、ベンダーロックインではなく、パフォーマンス、コスト、規制要件に基づいてこれらの選択を行う自由がお客様に与えられます。\n\nさらに、GitLabのお客様はDuo Agent PlatformにBYOM（Bring Your Own Model）を利用することで、承認済みのプロバイダーとゲートウェイをセキュリティモデルが期待する場所に配置できます。[18.9リリースにおけるセルフホスト型Duo Agent PlatformとBYOMの解説](https://about.gitlab.com/blog/agentic-ai-enterprise-control-self-hosted-duo-agent-platform-and-byom/)では、その仕組みが詳しく説明されています。このデプロイオプションにより、お客様はソフトウェア開発プロセスに合わせてカスタマイズできるより広いモデルの選択肢へのアクセスを得られます。適切なワークフローに、適切なモデルを、適切なガードレールとともに。\n\nGitLabがVertex AIを基盤として選択したのは、エンタープライズグレードの信頼性と比類ないモデルの幅広さへのニーズによるものです。Vertex AIとModel Gardenは、LLMホスティングの重労働を完全に抽象化し、迅速なバージョン提供、堅牢なセキュリティ、厳格なガバナンスをシームレスに統合に組み込んでいます。Geminiモデルの提供にとどまらず、Vertex AIはサードパーティおよびオープンソースモデルの豊富なカタログへのグローバルかつ低レイテンシのアクセスを提供します。\n\nGoogleCloudの業界をリードするデータプライバシーとモデル保護へのアプローチと組み合わせることで、Vertex AIはGitLabの次世代デベロッパーエクスペリエンスを支える明確な選択肢として浮上しました。\n\nVertex AI Model GardenをバックエンドへIntegrateすることで、GitLabはDevSecOpsプラットフォームを強化しながら、その複雑さをユーザーに負わせることがありません。開発チームは基盤となるLLMの評価や管理に煩わされることなく、アプリケーション構築のための効率的なAI支援ワークフローを体験できます。\n\nGitLabはクラウドオーケストレーションを完全に抽象化し、開発者が優れたコードの記述に集中できる環境を提供する一方、Vertex AIはその支援となる機能を動かしています。\n\n## Google Cloudをご利用のお客様への意義\n\nGitLab Duo Agent Platformはすでに、一つのガバナンスの効いた記録システムの中でソフトウェアライフサイクル全体にわたって動作するAIエージェントを提供しています。Google Cloud上では、Vertex AIがモデルとインフラ層を継続的に進化させながら、迅速なイノベーションを可能にします。\n\nGoogle Cloudをご利用のお客様にとって、この統合は厳格なエンタープライズガバナンスを維持しながらソフトウェア提供を効率化することを意味します。プラットフォームエンジニアリンググループにとっては、クライアントサイドのツールを数十種類カタログ化するのではなく、GitLab内の提案、分析、修正を担うVertex AI連携モデルを標準化することを意味します。セキュリティプログラムは、エージェントが開発者がすでに検出結果をトリアージしている場所と同じ場所で修正を提案・検証することで、頭の切り替えを減らし、管理されていないチャネルへ流出していた作業を削減できます。\n\nクラウドの費用対効果とポリシーの観点から、GitLab内からVertexへのエージェント推論をまとめることで、Google Cloud上ですでに運用している契約や統制に近い形で使用量を管理でき、調達プロセスを迂回する重複支出やシャドーパスを回避するのに役立ちます。\n\nVertex AIはGitLab Duo Agent Platformの基盤インフラプロバイダーであるため、組織はAIツールチェーンの断片化を管理するオーバーヘッドとリスクなしに、デベロッパーの生産性を大幅に向上させることができます。チームは単一のセキュアな記録システムの中で足並みを揃え、アプリケーションをより速くビルドし、確信を持ってリリースできるようになります。\n\nGitLabとGoogle Cloudのコラボレーションは2018年から続いています。今日、これはAIの実験から、Google Cloud上での完全にガバナンスが効いたエージェント型ソフトウェア開発へと移行する組織にとって、最も包括的なパスの一つとなっています。GitLabがエージェントオーケストレーションとデベロッパーコンテキストを拡充し、Vertex AIがモデル能力とエージェントインフラの限界を押し広げていく中で、共同顧客にとっての価値は今後も成長し続けるでしょう。\n\n> [GitLab Duo Agent Platformの無料トライアルを開始](https://about.gitlab.com/free-trial/)して、Google Cloud上でのGitLabとVertex AIのパワーをぜひご体験ください。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663121/Blog/Hero%20Images/LogoLockupPlusLight.png","2026-04-14",[22,281,736,737,722],"google","news",{"featured":29,"template":15,"slug":739},"gitlab-and-vertex-ai-on-google-cloud",{"content":741,"config":751},{"heroImage":742,"body":743,"authors":744,"updatedDate":746,"date":747,"title":748,"tags":749,"description":750,"category":11},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772643639/sapu29gmlgtwvhggmj6k.png","ソフトウェア開発の管理では、複数のツールを同時に扱うことが求められます。Jiraで課題を追跡し、IDEでコードを記述し、GitLabでコラボレーションするといった具合です。こうしたプラットフォーム間のコンテキストの切り替えは集中力を妨げ、デリバリーを遅らせます。\n\nGitLab Duo Agent Platformの[MCP](https://about.gitlab.com/topics/ai/model-context-protocol/)サポートにより、Jiraをはじめ、MCPに対応するあらゆるツールを、AIを活用した開発環境に直接接続できるようになりました。課題の照会、チケットの更新、ワークフローの同期など、すべてを自然言語で、IDEを離れることなく実行できます。\n\n## この記事で学べること\n\nこのチュートリアルでは、以下の内容を解説します。\n\n* **Jira/Atlassian OAuthアプリケーションのセットアップ** — セキュアな認証を設定します\n* **GitLab Duo Agent Platformの設定** — GitLab Duo Agent PlatformをMCPクライアントとして設定します\n* **3つの実践的なユースケース** — 実際のワークフローのデモをご覧ください\n\n## 前提条件\n\n開始する前に、以下の要件を満たしていることをご確認ください。\n\n| 要件 | 詳細 |\n| ---- | ----- |\n| **GitLabインスタンス** | Duo Agent Platformが有効なGitLab 18.8以降 |\n| **Jiraアカウント** | OAuthアプリケーションを作成できる管理者権限を持つJira Cloudインスタンス |\n| **IDE** | GitLab Workflow拡張機能がインストールされたVisual Studio Code |\n| **MCPサポート** | GitLabでMCPサポートが有効化済み |\n\n\n## アーキテクチャの概要\n\nGitLab Duo Agent Platformは**MCPクライアント**として機能し、Atlassian MCPサーバーに接続してJiraのプロジェクト管理データにアクセスします。Atlassian MCPサーバーは認証を処理し、自然言語のリクエストをAPI呼び出しに変換して、構造化されたデータをGitLab Duo Agent Platformに返します。このプロセス全体を通じて、セキュリティと監査管理が維持されます。\n\n## パート1：Jira OAuthアプリケーションの設定\n\nGitLab Duo Agent PlatformをJiraインスタンスに安全に接続するには、Atlassian Developer ConsoleでOAuth 2.0アプリケーションを作成する必要があります。これにより、GitLabのMCPサーバーにJiraデータへの認可されたアクセス権が付与されます。\n\n### セットアップ手順\n\n手動で設定する場合は、以下の手順に従ってください。\n\n1. **Atlassian Developer Consoleへのアクセス**\n\n   * [developer.atlassian.com/console/myapps](https://developer.atlassian.com/console/myapps)にアクセスします。\n\n   * Atlassianアカウントでサインインします。\n\n2. **新しいOAuth 2.0アプリの作成**\n\n   * 「**Create**」→「**OAuth 2.0 integration**」をクリックします。\n\n   * アプリ名を入力します（例：「gitlab-dap-mcp」）。\n\n   * 利用規約に同意し、「**Create**」をクリックします。\n\n3. **権限の設定**\n\n   * 左サイドバーの「**Permissions**」に移動します。\n\n   * 「**Jira API**」を追加し、以下のスコープを設定します。\n\n     * `read:jira-work` — 課題、プロジェクト、ボードの読み取り\n\n     * `write:jira-work` — 課題の作成と更新\n\n     * `read:jira-user` — ユーザー情報の読み取り\n\n4. **認可の設定**\n\n   * 左サイドバーの「**Authorization**」に移動します。\n\n   * お使いの環境のコールバックURLを追加します（`https://gitlab.com/oauth/callback`）。\n\n   * 変更を保存します。\n\n5. **認証情報の取得**\n\n   * 「**Settings**」に移動します。\n\n   * 「**Client ID**」と「**Client Secret**」をコピーします。\n\n   * これらの認証情報はMCP設定に必要なため、安全な場所に保管してください。\n\n\n### インタラクティブウォークスルー：Jira OAuthのセットアップ\n\n以下の画像をクリックして開始してください。\n\n\n[![Jira OAuthセットアップツアー](https://res.cloudinary.com/about-gitlab-com/image/upload/v1772644850/wnzfoq43nkkfmgdqldmr.png)](https://gitlab.navattic.com/jira-oauth-setup)\n\n\n## パート2：GitLab Duo Agent PlatformのMCPクライアントの設定\n\nOAuth認証情報の準備ができたら、GitLab Duo Agent PlatformをAtlassian MCPサーバーに接続するための設定を行います。\n\n### MCP設定ファイルの作成\n\nGitLabプロジェクトの `.gitlab/duo/mcp.json` にMCP設定ファイルを作成します。\n\n\n```json\n{\n  \"mcpServers\": {\n    \"atlassian\": {\n      \"type\": \"http\",\n      \"url\": \"https://mcp.atlassian.com/v1/mcp\",\n      \"auth\": {\n        \"type\": \"oauth2\",\n        \"clientId\": \"YOUR_CLIENT_ID\",\n        \"clientSecret\": \"YOUR_CLIENT_SECRET\",\n        \"authorizationUrl\": \"https://auth.atlassian.com/oauth/authorize\",\n        \"tokenUrl\": \"https://auth.atlassian.com/oauth/token\"\n      },\n      \"approvedTools\": true\n    }\n  }\n}\n```\n\n`YOUR_CLIENT_ID` と `YOUR_CLIENT_SECRET` は、パート1で生成した認証情報に置き換えてください。\n\n### GitLabでMCPを有効化\n\n1. 「**グループ設定**」→「**GitLab Duo**」→「**Configuration**」に移動します。\n2. 「Allow external MCP tools」にチェックが入っていることを確認します。\n\n### 接続の確認\n\nVS Codeでプロジェクトを開いてGitLab Duo Agent Platformのチャットで次のように入力してください。\n\n```text\nWhat MCP tools do you have access to?\n```\n\n次に、以下のように入力します。\n\n```text\nTest the MCP JIRA configuration in this project\n```\n\nこの時点で、IDEからAtlassian MCPウェブサイトにリダイレクトされ、アクセスの承認を求められます。\n\n![Atlassian MCPウェブサイトへのリダイレクト](https://res.cloudinary.com/about-gitlab-com/image/upload/v1772643461/z5acqjgguh0damnnde9g.png \"MCPのAtlassianウェブサイトへのリダイレクト\")\n\n\u003Cbr>\u003C/br>\n\n![アクセスの承認](https://res.cloudinary.com/about-gitlab-com/image/upload/v1772643461/rwowamm8nsubhpixtn3i.png \"アクセスの承認\")\n\n\u003Cbr>\u003C/br>\n\n![JIRAインスタンスを選択して承認](https://res.cloudinary.com/about-gitlab-com/image/upload/v1772643461/chuzqd0jeptfwvoj7wjr.png \"JIRAインスタンスを選択して承認\")\n\n\u003Cbr>\u003C/br>\n\n![成功！](https://res.cloudinary.com/about-gitlab-com/image/upload/v1772643462/bsgti5iste2bzck19o5y.png \"成功！\")\n\n\u003Cbr>\u003C/br>\n\n### MCPダッシュボードでの確認\n\nGitLabには、IDEに組み込みの**MCPダッシュボード**も用意されています。\n\nVS CodeまたはVSCodiumで、コマンドパレット（macOSでは `Cmd+Shift+P`、Windows/Linuxでは `Ctrl+Shift+P`）を開いて「**GitLab: Show MCP Dashboard**」を検索してください。ダッシュボードは新しいエディタータブで表示され、以下の情報を確認できます。\n\n* 設定済みの各MCPサーバーの**接続ステータス**\n* サーバーが公開している**利用可能なツール**（例：`jira_get_issue`、`jira_create_issue`）\n* **サーバーログ** — リアルタイムで呼び出されているツールを確認可能\n\n![MCPサーバーのダッシュボードとステータス](https://res.cloudinary.com/about-gitlab-com/image/upload/v1772643462/mmvdfchucacsydivowvn.png \"MCPサーバーのダッシュボードとステータス\")\n\n\u003Cbr>\u003C/br>\n\n![サーバーの詳細と権限](https://res.cloudinary.com/about-gitlab-com/image/upload/v1772643462/tcocgdvovp2dl42pvfn8.png \"サーバーの詳細と権限\")\n\n\u003Cbr>\u003C/br>\n\n\n![MCPサーバーログ](https://res.cloudinary.com/about-gitlab-com/image/upload/v1772643466/mougvqqk1bozchaufsci.png \"MCPサーバーログ\")\n\n\u003Cbr>\u003C/br>\n\n### インタラクティブウォークスルー：MCPのテスト\n\n\u003Ciframe src=\"https://player.vimeo.com/video/1170005495?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=\"Testing MCP\">\u003C/iframe>\u003Cscript src=\"https://player.vimeo.com/api/player.js\">\u003C/script>\n\n## パート3：実践的なユースケース\n\n統合の設定が完了したら、JiraをGitLab Duo Agent Platformへの接続を実現できる3つの実践的なワークフローを見ていきましょう。\n\n### プランニングアシスタント\n\n**シナリオ：** スプリントプランニングの準備として、バックログをすばやく評価し、優先事項を把握し、ブロッカーを特定する必要があります。\n\nこのデモでは以下の操作を紹介します。\n\n* バックログの照会\n* 未割り当ての高優先度課題の特定\n* AIによるスプリント推奨の取得\n\n#### プロンプト例\n\nGitLab Duo Agent Platformのチャットで以下のプロンプトをお試しください。\n\n```text\nList all the unassigned issues in JIRA for project GITLAB\n```\n\n```text\nSuggest the two top issues to prioritize and summarize them. Assign them to me.\n```\n\n### インタラクティブウォークスルー：プロジェクトプランニング\n\n\u003Ciframe src=\"https://player.vimeo.com/video/1170005462?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=\"Project Planning\">\u003C/iframe>\u003Cscript src=\"https://player.vimeo.com/api/player. js\">\u003C/script>\n\n### コードからの課題トリアージと作成\n\n**シナリオ：** コードレビュー中にバグを発見し、IDEを離れることなく、関連するコンテキストに沿ってJiraの課題を作成したい場合です。\n\nこのデモでは以下の手順を紹介します。\n\n* コーディング中のバグの特定\n* 自然言語を使ったJira課題の詳細な作成\n* コードのコンテキストに沿った課題フィールドの自動入力\n* 現在のブランチへの課題のリンク\n\n#### プロンプト例\n\n```text\nSearch in JIRA for a bug related to: Null pointer exception in PaymentService.processRefund().\nIf it does not exist create it with all the context needed from the code. Find possible blockers that this bug may cause.\n```\n\n```text\nCreate a new branch called issue-gitlab-18, checkout, and link it to the issue we just created. Assign the JIRA issue to me and mark it as in-progress.\n```\n\n### インタラクティブウォークスルー：バグレビューとタスク自動化\n\n\u003Ciframe src=\"https://player.vimeo.com/video/1170005368?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=\"Bug Review\">\u003C/iframe>\u003Cscript src=\"https://player.vimeo.com/api/player.js\">\u003C/script>\n\n### クロスシステムのインシデント調査\n\n**シナリオ：** 本番環境でインシデントが発生し、Jira（インシデントチケット）、GitLabプロジェクト管理、コードベース、マージリクエストからの情報を照合して根本原因を特定する必要があります。\n\nこのデモでは以下を実演します。\n\n* Jiraからのインシデント詳細の取得\n* GitLabの最近のマージリクエストとの照合\n* 関連する可能性のあるコード変更の特定\n* インシデントタイムラインの生成\n* 修正計画の設計とGitLabのワークアイテムとしての作成\n\n#### プロンプト例\n\n```text\n\"We have a production incident INC-1 about checkout failures. Can you help me investigate with all available context?\"\n```\n\n```text\nCreate a timeline of events for incident INC-1 including related Jira issues and recent deployments\n```\n\n```text\nPropose a remediation plan\n```\n\n### インタラクティブウォークスルー：クロスシステムのトラブルシューティングと修正\n\n\u003Ciframe src=\"https://player.vimeo.com/video/1170005413?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=\"Cross System Investigation\">\u003C/iframe>\u003Cscript src=\"https://player.vimeo.com/api/player.js\">\u003C/script>\n\n## トラブルシューティング\n\nよくあるセットアップの問題と解決策を以下にまとめます。\n\n| 問題 | 解決策 |\n| ----- | ----- |\n| 「MCP server not found」 | `mcp.json` ファイルが正しい場所にあり、適切にフォーマットされていることを確認してください。 |\n| 「Authentication failed」 | OAuth認証情報を再確認し、Atlassianでスコープが正しく設定されていることを確認してください。 |\n| 「No Jira tools available」 | `mcp.json` を更新後にVS Codeを再起動し、GitLabでMCPが有効になっていることを確認してください。 |\n| 「Connection timeout」 | `mcp.atlassian.com` へのネットワーク接続を確認してください。 |\n\n\u003Cbr/> 詳細なトラブルシューティングについては、[GitLab MCPクライアントのドキュメント](https://docs.gitlab.com/ja-jp/user/gitlab_duo/model_context_protocol/mcp_clients/)をご参照ください。\n\n\n## セキュリティに関する考慮事項\n\nJiraをGitLab Duo Agent Platformと統合する際は、以下の点にご注意ください。\n\n* **OAuthトークン** — 認証情報を安全に管理してください。\n* **最小権限の原則** — Jiraスコープは必要最小限のみ付与してください。\n* **トークンのローテーション** — セキュリティ管理の一環として、OAuth認証情報を定期的にローテーションしてください。\n\n\n## まとめ\n\nMCPを通じてGitLab Duo Agent Platformをさまざまなツールに接続することで、開発ライフサイクルとのインタラクションが大きく変わります。この記事では、以下の方法を学びました。\n\n* **自然言語による課題の照会** — バックログ、スプリント、インシデントについて自然言語で質問できます。\n* **DevSecOps環境全体での課題の作成と更新** — IDEを離れることなくバグを報告し、チケットを更新できます。\n* **システム間の情報照合** — JiraのデータをGitLabのプロジェクト管理、マージリクエスト、パイプラインと組み合わせることで、全体的な可視性が得られます。\n* **コンテキスト切り替えの削減** — プロジェクト管理とのつながりを維持しながら、コードに集中できます。\n\nこの統合は、MCPの可能性を体現するものです。AIを通じてツールへの標準化されたセキュアなアクセスを提供し、ガバナンスやセキュリティを損なうことなく、デベロッパーがより効率的に作業できる環境を実現します。\n\n\n## 関連リソース\n\n* [Model Context Protocol統合](https://about.gitlab.com/ja-jp/blog/duo-agent-platform-with-mcp/)\n\n* [Model Context Protocolとは](https://about.gitlab.com/topics/ai/model-context-protocol/)\n\n* [エージェント型AIに関するガイドとリソース](https://about.gitlab.com/ja-jp/blog/agentic-ai-guides-and-resources/)\n\n* [GitLab MCPクライアントのドキュメント](https://docs.gitlab.com/ja-jp/user/gitlab_duo/model_context_protocol/mcp_clients/)\n\n* [GitLab Duo Agent Platformを始める：完全ガイド](https://about.gitlab.com/ja-jp/blog/gitlab-duo-agent-platform-complete-getting-started-guide/)",[745],"Albert Rabassa","2026-03-30","2026-03-05","MCPであらゆるツールを接続してGitLab Duo Agent Platformを拡張",[722,23],"MCPを使用して外部ツールをGitLab Duo Agent Platformに接続する方法を解説します。3つの実践的なワークフローデモを含むステップバイステップのセットアップガイドです。",{"featured":14,"template":15,"slug":752},"extend-gitlab-duo-agent-platform-connect-any-tool-with-mcp",{"promotions":754},[755,768,779,791],{"id":756,"categories":757,"header":758,"text":759,"button":760,"image":765},"ai-modernization",[11],"Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":761,"config":762},"Get your AI maturity score",{"href":763,"dataGaName":764,"dataGaLocation":248},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":766},{"src":767},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":769,"categories":770,"header":771,"text":759,"button":772,"image":776},"devops-modernization",[722,39],"Are you just managing tools or shipping innovation?",{"text":773,"config":774},"Get your DevOps maturity score",{"href":775,"dataGaName":764,"dataGaLocation":248},"/assessments/devops-modernization-assessment/",{"config":777},{"src":778},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":780,"categories":781,"header":783,"text":759,"button":784,"image":788},"security-modernization",[782],"security","Are you trading speed for security?",{"text":785,"config":786},"Get your security maturity score",{"href":787,"dataGaName":764,"dataGaLocation":248},"/assessments/security-modernization-assessment/",{"config":789},{"src":790},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":792,"paths":793,"header":796,"text":797,"button":798,"image":803},"github-azure-migration",[794,795],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":799,"config":800},"See how GitLab compares to GitHub",{"href":801,"dataGaName":802,"dataGaLocation":248},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":804},{"src":778},{"header":806,"blurb":807,"button":808,"secondaryButton":812},"今すぐ開発をスピードアップ","DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。\n",{"text":50,"config":809},{"href":810,"dataGaName":53,"dataGaLocation":811},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/ja-jp/","feature",{"text":55,"config":813},{"href":57,"dataGaName":58,"dataGaLocation":811},1777493681754]