[{"data":1,"prerenderedAt":4644},["ShallowReactive",2],{"/ja-jp/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo":3,"navigation-ja-jp":3864,"banner-ja-jp":4294,"footer-ja-jp":4302,"blog-post-authors-ja-jp-Michael Friedrich":4543,"blog-related-posts-ja-jp-refactor-code-into-modern-languages-with-ai-powered-gitlab-duo":4558,"blog-promotions-ja-jp":4582,"next-steps-ja-jp":4635},{"id":4,"title":5,"authors":6,"body":8,"category":3842,"date":3843,"description":3844,"extension":3845,"externalUrl":3846,"faq":3846,"featured":3847,"heroImage":3848,"meta":3849,"navigation":183,"path":3850,"seo":3851,"slug":3855,"stem":3856,"tags":3857,"template":3861,"updatedDate":3862,"__hash__":3863},"blogPosts/ja-jp/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo.md","AI搭載のGitLab Duoでコードをモダンな言語にリファクタリング",[7],"Michael Friedrich",{"type":9,"value":10,"toc":3825},"minimark",[11,22,43,46,100,104,107,111,114,117,893,896,906,913,936,939,952,961,965,968,971,974,977,984,2212,2243,2263,2271,2274,2278,2287,2304,2307,2504,2510,2516,2519,2522,2530,2545,2548,2687,2693,2699,2706,2709,2718,2721,2764,2770,2776,2779,2789,2795,2810,2817,2860,2869,2875,2878,2881,2884,2893,2896,3307,3328,3339,3345,3356,3362,3365,3368,3371,3377,3641,3644,3660,3666,3686,3692,3695,3698,3701,3707,3710,3713,3719,3733,3739,3742,3764,3766,3792,3795,3804,3821],[12,13,14,15,21],"p",{},"コードベースやフレームワークのモダナイゼーションを行うために新しいプログラミング言語へ移行する必要があったり、同じ言語内の新しい機能の知識を深めたい場合は、AI搭載の",[16,17,20],"a",{"href":18,"rel":19},"https://about.gitlab.com/gitlab-duo-agent-platform/",[],"GitLab Duo","が有効です。ここでは、筆者が過去20年にわたるコーディングキャリアで培ったベストプラクティスをもとに、コードリファクタリングの際に直面する課題への効果的なアプローチ方法をご紹介します。",[12,23,24,25,30,31,36,37,42],{},"この記事では、VS CodeとJetBrains IDE（IntelliJ IDEA、PyCharm、CLion）を使用したプロンプトと例を紹介します。いずれのIDEにも",[16,26,29],{"href":27,"rel":28},"https://docs.gitlab.com/ja-jp/user/project/repository/code_suggestions/supported_extensions/",[],"GitLab Duo拡張機能やプラグイン","がインストールされています。開発環境としてはGitLab.comが使用されています。ここでは大規模言語モデル（LLM）がAnthropic Claude 3.5にアップデートされており、GitLab Duoの",[16,32,35],{"href":33,"rel":34},"https://docs.gitlab.com/ja-jp/user/gitlab_duo/#code-suggestions",[],"コード提案","と",[16,38,41],{"href":39,"rel":40},"https://docs.gitlab.com/ja-jp/user/gitlab_duo/#gitlab-duo-chat",[],"Duo Chat","に適用されています。これらの機能は卓越したパフォーマンスと効率性を発揮します。",[12,44,45],{},"この記事では必要なセクションだけを確認しても良いですし、上から順を追って読んでも構いません。また、自己学習に役立つソースコードや演習問題も用意しています。",[47,48,49,72,83,97],"ul",{},[50,51,52,53],"li",{},"モダンなプログラミング言語標準に合わせたコードのリファクタリング\n",[47,54,55,58,69],{},[50,56,57],{},"Java 7のコードを生成し、Java 8にリファクタリング",[50,59,60,61],{},"C++標準に基づいたリファクタリング\n",[47,62,63,66],{},[50,64,65],{},"移行：C++03をC++14にリファクタリング",[50,67,68],{},"ダウングレード：C++23をC++11にリファクタリング",[50,70,71],{},"COBOLの説明とリファクタリング",[50,73,74,75],{},"異なる言語間でのリファクタリング\n",[47,76,77,80],{},[50,78,79],{},"CをRustにリファクタリング",[50,81,82],{},"PerlをPythonにリファクタリング",[50,84,85,86],{},"その他のリファクタリング実践例\n",[47,87,88,91,94],{},[50,89,90],{},"JavaScriptのリファクタリング",[50,92,93],{},"BashをZSHやSHにリファクタリング",[50,95,96],{},"その他のユースケースやチュートリアル",[50,98,99],{},"重要なポイント",[101,102,103],"h2",{"id":103},"モダンなプログラミング言語標準に合わせたコードのリファクタリング",[12,105,106],{},"次のセクションでは、特定のプログラミング言語におけるリファクタリングの方法、言語固有の違いの説明、および理解の仕方について解説します。",[108,109,57],"h3",{"id":110},"java-7のコードを生成しjava-8にリファクタリング",[12,112,113],{},"あるお客様から、GitLab DuoがJava 7をサポートしているかどうかのご質問が寄せられました。Java 7固有のコードを生成するためのコード提案とGitLab Chatのプロンプトをテストしている際、移行支援についても考えました。Anthropic Claude 3.5と同様に、GitLab Duoも言語固有の違いを理解できます。",[12,115,116],{},"次の例では、コード提案を使用してJava 7のコードを生成するプロンプトを示しています。",[118,119,124],"pre",{"className":120,"code":121,"language":122,"meta":123,"style":123},"language-java shiki shiki-themes github-light","// 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","java","",[125,126,127,136,154,166,178,185,201,210,215,239,260,281,293,299,305,310,338,355,373,378,383,404,417,438,443,448,468,481,492,497,502,526,544,569,584,608,614,619,627,632,637,663,678,693,704,709,714,738,751,764,774,779,784,805,818,830,835,840,858,871,882,887],"code",{"__ignoreMap":123},[128,129,132],"span",{"class":130,"line":131},"line",1,[128,133,135],{"class":134},"sAwPA","// Generate a new class for a File Manager. Use Java 7 features only.\n",[128,137,139,143,147,151],{"class":130,"line":138},2,[128,140,142],{"class":141},"sD7c4","import",[128,144,146],{"class":145},"sgsFI"," java.io.",[128,148,150],{"class":149},"sYu0t","*",[128,152,153],{"class":145},";\n",[128,155,157,159,162,164],{"class":130,"line":156},3,[128,158,142],{"class":141},[128,160,161],{"class":145}," java.nio.file.",[128,163,150],{"class":149},[128,165,153],{"class":145},[128,167,169,171,174,176],{"class":130,"line":168},4,[128,170,142],{"class":141},[128,172,173],{"class":145}," java.util.",[128,175,150],{"class":149},[128,177,153],{"class":145},[128,179,181],{"class":130,"line":180},5,[128,182,184],{"emptyLinePlaceholder":183},true,"\n",[128,186,188,191,194,198],{"class":130,"line":187},6,[128,189,190],{"class":141},"public",[128,192,193],{"class":141}," class",[128,195,197],{"class":196},"s7eDp"," FileManager",[128,199,200],{"class":145}," {\n",[128,202,204,207],{"class":130,"line":203},7,[128,205,206],{"class":141},"    private",[128,208,209],{"class":145}," Path rootDirectory;\n",[128,211,213],{"class":130,"line":212},8,[128,214,184],{"emptyLinePlaceholder":183},[128,216,218,221,223,226,230,233,236],{"class":130,"line":217},9,[128,219,220],{"class":141},"    public",[128,222,197],{"class":196},[128,224,225],{"class":145},"(String ",[128,227,229],{"class":228},"sqxcx","rootPath",[128,231,232],{"class":145},") ",[128,234,235],{"class":141},"throws",[128,237,238],{"class":145}," IOException {\n",[128,240,242,245,248,251,254,257],{"class":130,"line":241},10,[128,243,244],{"class":149},"        this",[128,246,247],{"class":145},".rootDirectory ",[128,249,250],{"class":141},"=",[128,252,253],{"class":145}," Paths.",[128,255,256],{"class":196},"get",[128,258,259],{"class":145},"(rootPath);\n",[128,261,263,266,269,272,275,278],{"class":130,"line":262},11,[128,264,265],{"class":141},"        if",[128,267,268],{"class":145}," (",[128,270,271],{"class":141},"!",[128,273,274],{"class":145},"Files.",[128,276,277],{"class":196},"exists",[128,279,280],{"class":145},"(rootDirectory)) {\n",[128,282,284,287,290],{"class":130,"line":283},12,[128,285,286],{"class":145},"            Files.",[128,288,289],{"class":196},"createDirectories",[128,291,292],{"class":145},"(rootDirectory);\n",[128,294,296],{"class":130,"line":295},13,[128,297,298],{"class":145},"        }\n",[128,300,302],{"class":130,"line":301},14,[128,303,304],{"class":145},"    }\n",[128,306,308],{"class":130,"line":307},15,[128,309,184],{"emptyLinePlaceholder":183},[128,311,313,315,318,321,323,326,329,332,334,336],{"class":130,"line":312},16,[128,314,220],{"class":141},[128,316,317],{"class":141}," void",[128,319,320],{"class":196}," createFile",[128,322,225],{"class":145},[128,324,325],{"class":228},"fileName",[128,327,328],{"class":145},", String ",[128,330,331],{"class":228},"content",[128,333,232],{"class":145},[128,335,235],{"class":141},[128,337,238],{"class":145},[128,339,341,344,346,349,352],{"class":130,"line":340},17,[128,342,343],{"class":145},"        Path filePath ",[128,345,250],{"class":141},[128,347,348],{"class":145}," rootDirectory.",[128,350,351],{"class":196},"resolve",[128,353,354],{"class":145},"(fileName);\n",[128,356,358,361,364,367,370],{"class":130,"line":357},18,[128,359,360],{"class":145},"        Files.",[128,362,363],{"class":196},"write",[128,365,366],{"class":145},"(filePath, content.",[128,368,369],{"class":196},"getBytes",[128,371,372],{"class":145},"(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);\n",[128,374,376],{"class":130,"line":375},19,[128,377,304],{"class":145},[128,379,381],{"class":130,"line":380},20,[128,382,184],{"emptyLinePlaceholder":183},[128,384,386,388,391,394,396,398,400,402],{"class":130,"line":385},21,[128,387,220],{"class":141},[128,389,390],{"class":145}," String ",[128,392,393],{"class":196},"readFile",[128,395,225],{"class":145},[128,397,325],{"class":228},[128,399,232],{"class":145},[128,401,235],{"class":141},[128,403,238],{"class":145},[128,405,407,409,411,413,415],{"class":130,"line":406},22,[128,408,343],{"class":145},[128,410,250],{"class":141},[128,412,348],{"class":145},[128,414,351],{"class":196},[128,416,354],{"class":145},[128,418,420,423,426,429,432,435],{"class":130,"line":419},23,[128,421,422],{"class":141},"        return",[128,424,425],{"class":141}," new",[128,427,428],{"class":196}," String",[128,430,431],{"class":145},"(Files.",[128,433,434],{"class":196},"readAllBytes",[128,436,437],{"class":145},"(filePath));\n",[128,439,441],{"class":130,"line":440},24,[128,442,304],{"class":145},[128,444,446],{"class":130,"line":445},25,[128,447,184],{"emptyLinePlaceholder":183},[128,449,451,453,455,458,460,462,464,466],{"class":130,"line":450},26,[128,452,220],{"class":141},[128,454,317],{"class":141},[128,456,457],{"class":196}," deleteFile",[128,459,225],{"class":145},[128,461,325],{"class":228},[128,463,232],{"class":145},[128,465,235],{"class":141},[128,467,238],{"class":145},[128,469,471,473,475,477,479],{"class":130,"line":470},27,[128,472,343],{"class":145},[128,474,250],{"class":141},[128,476,348],{"class":145},[128,478,351],{"class":196},[128,480,354],{"class":145},[128,482,484,486,489],{"class":130,"line":483},28,[128,485,360],{"class":145},[128,487,488],{"class":196},"delete",[128,490,491],{"class":145},"(filePath);\n",[128,493,495],{"class":130,"line":494},29,[128,496,304],{"class":145},[128,498,500],{"class":130,"line":499},30,[128,501,184],{"emptyLinePlaceholder":183},[128,503,505,507,510,513,516,519,522,524],{"class":130,"line":504},31,[128,506,220],{"class":141},[128,508,509],{"class":145}," List\u003C",[128,511,512],{"class":141},"String",[128,514,515],{"class":145},"> ",[128,517,518],{"class":196},"listFiles",[128,520,521],{"class":145},"() ",[128,523,235],{"class":141},[128,525,238],{"class":145},[128,527,529,532,534,537,539,541],{"class":130,"line":528},32,[128,530,531],{"class":145},"        List\u003C",[128,533,512],{"class":141},[128,535,536],{"class":145},"> fileList ",[128,538,250],{"class":141},[128,540,425],{"class":141},[128,542,543],{"class":145}," ArrayList\u003C>();\n",[128,545,547,550,553,556,559,561,564,567],{"class":130,"line":546},33,[128,548,549],{"class":141},"        try",[128,551,552],{"class":145}," (DirectoryStream\u003C",[128,554,555],{"class":141},"Path",[128,557,558],{"class":145},"> stream ",[128,560,250],{"class":141},[128,562,563],{"class":145}," Files.",[128,565,566],{"class":196},"newDirectoryStream",[128,568,280],{"class":145},[128,570,572,575,578,581],{"class":130,"line":571},34,[128,573,574],{"class":141},"            for",[128,576,577],{"class":145}," (Path file ",[128,579,580],{"class":141},":",[128,582,583],{"class":145}," stream) {\n",[128,585,587,590,593,596,599,602,605],{"class":130,"line":586},35,[128,588,589],{"class":145},"                fileList.",[128,591,592],{"class":196},"add",[128,594,595],{"class":145},"(file.",[128,597,598],{"class":196},"getFileName",[128,600,601],{"class":145},"().",[128,603,604],{"class":196},"toString",[128,606,607],{"class":145},"());\n",[128,609,611],{"class":130,"line":610},36,[128,612,613],{"class":145},"            }\n",[128,615,617],{"class":130,"line":616},37,[128,618,298],{"class":145},[128,620,622,624],{"class":130,"line":621},38,[128,623,422],{"class":141},[128,625,626],{"class":145}," fileList;\n",[128,628,630],{"class":130,"line":629},39,[128,631,304],{"class":145},[128,633,635],{"class":130,"line":634},40,[128,636,184],{"emptyLinePlaceholder":183},[128,638,640,642,644,647,649,652,654,657,659,661],{"class":130,"line":639},41,[128,641,220],{"class":141},[128,643,317],{"class":141},[128,645,646],{"class":196}," copyFile",[128,648,225],{"class":145},[128,650,651],{"class":228},"sourceFileName",[128,653,328],{"class":145},[128,655,656],{"class":228},"destinationFileName",[128,658,232],{"class":145},[128,660,235],{"class":141},[128,662,238],{"class":145},[128,664,666,669,671,673,675],{"class":130,"line":665},42,[128,667,668],{"class":145},"        Path sourcePath ",[128,670,250],{"class":141},[128,672,348],{"class":145},[128,674,351],{"class":196},[128,676,677],{"class":145},"(sourceFileName);\n",[128,679,681,684,686,688,690],{"class":130,"line":680},43,[128,682,683],{"class":145},"        Path destinationPath ",[128,685,250],{"class":141},[128,687,348],{"class":145},[128,689,351],{"class":196},[128,691,692],{"class":145},"(destinationFileName);\n",[128,694,696,698,701],{"class":130,"line":695},44,[128,697,360],{"class":145},[128,699,700],{"class":196},"copy",[128,702,703],{"class":145},"(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);\n",[128,705,707],{"class":130,"line":706},45,[128,708,304],{"class":145},[128,710,712],{"class":130,"line":711},46,[128,713,184],{"emptyLinePlaceholder":183},[128,715,717,719,721,724,726,728,730,732,734,736],{"class":130,"line":716},47,[128,718,220],{"class":141},[128,720,317],{"class":141},[128,722,723],{"class":196}," moveFile",[128,725,225],{"class":145},[128,727,651],{"class":228},[128,729,328],{"class":145},[128,731,656],{"class":228},[128,733,232],{"class":145},[128,735,235],{"class":141},[128,737,238],{"class":145},[128,739,741,743,745,747,749],{"class":130,"line":740},48,[128,742,668],{"class":145},[128,744,250],{"class":141},[128,746,348],{"class":145},[128,748,351],{"class":196},[128,750,677],{"class":145},[128,752,754,756,758,760,762],{"class":130,"line":753},49,[128,755,683],{"class":145},[128,757,250],{"class":141},[128,759,348],{"class":145},[128,761,351],{"class":196},[128,763,692],{"class":145},[128,765,767,769,772],{"class":130,"line":766},50,[128,768,360],{"class":145},[128,770,771],{"class":196},"move",[128,773,703],{"class":145},[128,775,777],{"class":130,"line":776},51,[128,778,304],{"class":145},[128,780,782],{"class":130,"line":781},52,[128,783,184],{"emptyLinePlaceholder":183},[128,785,787,789,792,795,797,799,801,803],{"class":130,"line":786},53,[128,788,220],{"class":141},[128,790,791],{"class":141}," long",[128,793,794],{"class":196}," getFileSize",[128,796,225],{"class":145},[128,798,325],{"class":228},[128,800,232],{"class":145},[128,802,235],{"class":141},[128,804,238],{"class":145},[128,806,808,810,812,814,816],{"class":130,"line":807},54,[128,809,343],{"class":145},[128,811,250],{"class":141},[128,813,348],{"class":145},[128,815,351],{"class":196},[128,817,354],{"class":145},[128,819,821,823,825,828],{"class":130,"line":820},55,[128,822,422],{"class":141},[128,824,563],{"class":145},[128,826,827],{"class":196},"size",[128,829,491],{"class":145},[128,831,833],{"class":130,"line":832},56,[128,834,304],{"class":145},[128,836,838],{"class":130,"line":837},57,[128,839,184],{"emptyLinePlaceholder":183},[128,841,843,845,848,851,853,855],{"class":130,"line":842},58,[128,844,220],{"class":141},[128,846,847],{"class":141}," boolean",[128,849,850],{"class":196}," fileExists",[128,852,225],{"class":145},[128,854,325],{"class":228},[128,856,857],{"class":145},") {\n",[128,859,861,863,865,867,869],{"class":130,"line":860},59,[128,862,343],{"class":145},[128,864,250],{"class":141},[128,866,348],{"class":145},[128,868,351],{"class":196},[128,870,354],{"class":145},[128,872,874,876,878,880],{"class":130,"line":873},60,[128,875,422],{"class":141},[128,877,563],{"class":145},[128,879,277],{"class":196},[128,881,491],{"class":145},[128,883,885],{"class":130,"line":884},61,[128,886,304],{"class":145},[128,888,890],{"class":130,"line":889},62,[128,891,892],{"class":145},"}\n",[12,894,895],{},"ご自身のIDEで次の手順を進めてください。",[897,898,899],"ol",{},[50,900,901,902,905],{},"生成されたコードを理解する：エディタでコード部分を選択（スクリーンショットの青色部分）し、GitLab Duo Chatに切り替えて、",[125,903,904],{},"/explain"," スラッシュ(/) コマンドをプロンプトとして送信します。",[12,907,908],{},[909,910],"img",{"alt":911,"src":912},"GitLab Duo Chatで /explain スラッシュ(/) コマンドを使用して生成したコードを検証する","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/intellij_java7_generate_refactor.png",[897,914,915,922,933],{"start":138},[50,916,917,918,921],{},"Java 7のコードをJava 8にリファクタリングする：エディタでコードを選択し、Chatに切り替えて、プロンプトを ",[125,919,920],{},"/refactor using Java 8 features"," に変更して送信します。",[50,923,924,925,928,929,932],{},"リファクタリングの代替方法を練習する：新しいファイル ",[125,926,927],{},"java8.java"," を作成し、コード提案を使って ",[125,930,931],{},"// Generate a new class for a File Manager. Use Java 8 features only."," というプロンプトでJava 8固有のコードを生成します。",[50,934,935],{},"AI搭載のコード補完機能を使って、同じコンテキストでJava 8のコードの続きを記述します。",[12,937,938],{},"次の録画ですべての手順をご覧になれます。",[940,941,944,945],"figure",{"className":942},[943],"video_container","\n  ",[946,947,951],"iframe",{"src":948,"frameBorder":949,"allowFullScreen":950},"https://www.youtube.com/embed/XKRv6uBkD2I","0","true"," ",[12,953,954,955,960],{},"ソースコードは",[16,956,959],{"href":957,"rel":958},"https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-generate-refactor-java-7-to-8",[],"GitLab Duo Challenge - Generate and refactor Java 7 to 8 project ","で取得できます。",[108,962,964],{"id":963},"c標準に基づいたリファクタリング","C++標準に基づいたリファクタリング",[12,966,967],{},"C++の標準には長い歴史があり、安定性と成熟度には信頼があります。ターゲットとなるアーキテクチャやプラットフォームに応じて、サポートされる標準はホストのオペレーティングシステム上のコンパイラに依存します。",[12,969,970],{},"筆者は自身のキャリアを通して、25種類の異なるLinuxおよびWindowsディストリビューションをサポートするオープンソースプロジェクトに関わり、新しい言語機能やC++標準に対するコンパイラのサポートが多様であることを実感してきました。2015年にはC++11の機能を採用し、それ以降C++14やC++17に触れることはありませんでした。",[12,972,973],{},"関数やアルゴリズムを新しいC++標準にリファクタリングするのには多大な労力がかかり、その違いを説明する支援が必要でした。当時は、リファクタリングの調べものを、書籍やオンライン検索、Stack Overflow、そして時にはツールの助けを借りて行っていました。",[12,975,976],{},"しかし、AI搭載のアシストやGitLab Duoの登場で状況は変わりました。コード提案やDuo Chatに、特定のC++標準に準拠したソースコードを提示するよう指示したり、異なる出力を比較したりできるようになったのです。\nしかし、AI搭載のアシストやGitLab Duoの登場で状況は変わりました。コード提案やDuo Chatに、特定のC++標準に準拠したソースコードを提示するよう指示したり、異なる出力を比較したりできるようになったのです。",[12,978,979,980,983],{},"次の例では、C++03標準に特化したプロンプトを使用してソースコードを生成しています。これは、",[125,981,982],{},".ini"," 構成フォーマット用のシンプルなコンフィグパーサー（configparser）を実装しています。",[118,985,989],{"className":986,"code":987,"language":988,"meta":123,"style":123},"language-c++ shiki shiki-themes github-light","/* 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","c++",[125,990,991,996,1001,1006,1010,1019,1026,1033,1040,1047,1051,1061,1066,1107,1111,1116,1124,1128,1159,1178,1195,1205,1209,1213,1220,1227,1231,1248,1253,1283,1307,1336,1365,1369,1410,1415,1445,1455,1460,1482,1502,1523,1545,1555,1560,1564,1568,1572,1583,1592,1596,1600,1648,1702,1718,1756,1771,1779,1783,1787,1796,1800,1804,1819,1863,1896,1928,1956,1985,2014,2019,2032,2037,2042,2048,2053,2065,2071,2091,2109,2120,2125,2163,2173,2191,2196,2207],{"__ignoreMap":123},[128,992,993],{"class":130,"line":131},[128,994,995],{"class":134},"/* iniフォーマットを解析できるconfigparserを作成\n",[128,997,998],{"class":130,"line":138},[128,999,1000],{"class":134},"C++03標準のみを使用\n",[128,1002,1003],{"class":130,"line":156},[128,1004,1005],{"class":134}," */\n",[128,1007,1008],{"class":130,"line":168},[128,1009,184],{"emptyLinePlaceholder":183},[128,1011,1012,1015],{"class":130,"line":180},[128,1013,1014],{"class":141},"#include",[128,1016,1018],{"class":1017},"sYBdl"," \u003Ciostream>\n",[128,1020,1021,1023],{"class":130,"line":187},[128,1022,1014],{"class":141},[128,1024,1025],{"class":1017}," \u003Cfstream>\n",[128,1027,1028,1030],{"class":130,"line":203},[128,1029,1014],{"class":141},[128,1031,1032],{"class":1017}," \u003Cstring>\n",[128,1034,1035,1037],{"class":130,"line":212},[128,1036,1014],{"class":141},[128,1038,1039],{"class":1017}," \u003Cmap>\n",[128,1041,1042,1044],{"class":130,"line":217},[128,1043,1014],{"class":141},[128,1045,1046],{"class":1017}," \u003Csstream>\n",[128,1048,1049],{"class":130,"line":241},[128,1050,184],{"emptyLinePlaceholder":183},[128,1052,1053,1056,1059],{"class":130,"line":262},[128,1054,1055],{"class":141},"class",[128,1057,1058],{"class":196}," ConfigParser",[128,1060,200],{"class":145},[128,1062,1063],{"class":130,"line":283},[128,1064,1065],{"class":141},"private:\n",[128,1067,1068,1071,1074,1077,1080,1083,1085,1087,1089,1091,1093,1095,1098,1101,1104],{"class":130,"line":295},[128,1069,1070],{"class":196},"    std",[128,1072,1073],{"class":145},"::map",[128,1075,1076],{"class":141},"\u003C",[128,1078,1079],{"class":196},"std",[128,1081,1082],{"class":145},"::string, ",[128,1084,1079],{"class":196},[128,1086,1073],{"class":145},[128,1088,1076],{"class":141},[128,1090,1079],{"class":196},[128,1092,1082],{"class":145},[128,1094,1079],{"class":196},[128,1096,1097],{"class":145},"::string",[128,1099,1100],{"class":141},">",[128,1102,1103],{"class":141}," >",[128,1105,1106],{"class":145}," config;\n",[128,1108,1109],{"class":130,"line":301},[128,1110,184],{"emptyLinePlaceholder":183},[128,1112,1113],{"class":130,"line":307},[128,1114,1115],{"class":141},"public:\n",[128,1117,1118,1121],{"class":130,"line":312},[128,1119,1120],{"class":196},"    ConfigParser",[128,1122,1123],{"class":145},"() {}\n",[128,1125,1126],{"class":130,"line":340},[128,1127,184],{"emptyLinePlaceholder":183},[128,1129,1130,1133,1136,1139,1142,1145,1148,1151,1154,1157],{"class":130,"line":357},[128,1131,1132],{"class":141},"    bool",[128,1134,1135],{"class":196}," parse",[128,1137,1138],{"class":145},"(",[128,1140,1141],{"class":141},"const",[128,1143,1144],{"class":196}," std",[128,1146,1147],{"class":145},"::",[128,1149,1150],{"class":196},"string",[128,1152,1153],{"class":141},"&",[128,1155,1156],{"class":228}," filename",[128,1158,857],{"class":145},[128,1160,1161,1164,1167,1170,1173,1176],{"class":130,"line":375},[128,1162,1163],{"class":196},"        std",[128,1165,1166],{"class":145},"::ifstream ",[128,1168,1169],{"class":196},"file",[128,1171,1172],{"class":145},"(filename.",[128,1174,1175],{"class":196},"c_str",[128,1177,607],{"class":145},[128,1179,1180,1182,1184,1186,1189,1192],{"class":130,"line":380},[128,1181,265],{"class":141},[128,1183,268],{"class":145},[128,1185,271],{"class":141},[128,1187,1188],{"class":145},"file.",[128,1190,1191],{"class":196},"is_open",[128,1193,1194],{"class":145},"()) {\n",[128,1196,1197,1200,1203],{"class":130,"line":385},[128,1198,1199],{"class":141},"            return",[128,1201,1202],{"class":149}," false",[128,1204,153],{"class":145},[128,1206,1207],{"class":130,"line":406},[128,1208,298],{"class":145},[128,1210,1211],{"class":130,"line":419},[128,1212,184],{"emptyLinePlaceholder":183},[128,1214,1215,1217],{"class":130,"line":440},[128,1216,1163],{"class":196},[128,1218,1219],{"class":145},"::string line;\n",[128,1221,1222,1224],{"class":130,"line":445},[128,1223,1163],{"class":196},[128,1225,1226],{"class":145},"::string currentSection;\n",[128,1228,1229],{"class":130,"line":450},[128,1230,184],{"emptyLinePlaceholder":183},[128,1232,1233,1236,1238,1240,1242,1245],{"class":130,"line":470},[128,1234,1235],{"class":141},"        while",[128,1237,268],{"class":145},[128,1239,1079],{"class":196},[128,1241,1147],{"class":145},[128,1243,1244],{"class":196},"getline",[128,1246,1247],{"class":145},"(file, line)) {\n",[128,1249,1250],{"class":130,"line":483},[128,1251,1252],{"class":134},"            // Trim whitespace\n",[128,1254,1255,1258,1261,1263,1266,1269,1271,1274,1277,1280],{"class":130,"line":494},[128,1256,1257],{"class":141},"            size_t",[128,1259,1260],{"class":145}," first ",[128,1262,250],{"class":141},[128,1264,1265],{"class":145}," line.",[128,1267,1268],{"class":196},"find_first_not_of",[128,1270,1138],{"class":145},[128,1272,1273],{"class":1017},"\" ",[128,1275,1276],{"class":149},"\\t",[128,1278,1279],{"class":1017},"\"",[128,1281,1282],{"class":145},");\n",[128,1284,1285,1287,1290,1292,1294,1297,1299,1301,1303,1305],{"class":130,"line":499},[128,1286,1257],{"class":141},[128,1288,1289],{"class":145}," last ",[128,1291,250],{"class":141},[128,1293,1265],{"class":145},[128,1295,1296],{"class":196},"find_last_not_of",[128,1298,1138],{"class":145},[128,1300,1273],{"class":1017},[128,1302,1276],{"class":149},[128,1304,1279],{"class":1017},[128,1306,1282],{"class":145},[128,1308,1309,1312,1315,1318,1320,1322,1324,1327,1330,1333],{"class":130,"line":504},[128,1310,1311],{"class":141},"            if",[128,1313,1314],{"class":145}," (first ",[128,1316,1317],{"class":141},"==",[128,1319,1144],{"class":196},[128,1321,1147],{"class":145},[128,1323,1150],{"class":196},[128,1325,1326],{"class":145},"::npos) ",[128,1328,1329],{"class":141},"continue",[128,1331,1332],{"class":145},";",[128,1334,1335],{"class":134}," // Skip empty lines\n",[128,1337,1338,1341,1343,1345,1348,1351,1354,1356,1359,1362],{"class":130,"line":528},[128,1339,1340],{"class":145},"            line ",[128,1342,250],{"class":141},[128,1344,1265],{"class":145},[128,1346,1347],{"class":196},"substr",[128,1349,1350],{"class":145},"(first, (last ",[128,1352,1353],{"class":141},"-",[128,1355,1260],{"class":145},[128,1357,1358],{"class":141},"+",[128,1360,1361],{"class":149}," 1",[128,1363,1364],{"class":145},"));\n",[128,1366,1367],{"class":130,"line":546},[128,1368,184],{"emptyLinePlaceholder":183},[128,1370,1371,1373,1376,1378,1381,1383,1386,1389,1392,1395,1397,1399,1401,1403,1405,1408],{"class":130,"line":571},[128,1372,1311],{"class":141},[128,1374,1375],{"class":145}," (line[",[128,1377,949],{"class":149},[128,1379,1380],{"class":145},"] ",[128,1382,1317],{"class":141},[128,1384,1385],{"class":1017}," '['",[128,1387,1388],{"class":141}," &&",[128,1390,1391],{"class":145}," line[line.",[128,1393,1394],{"class":196},"length",[128,1396,521],{"class":145},[128,1398,1353],{"class":141},[128,1400,1361],{"class":149},[128,1402,1380],{"class":145},[128,1404,1317],{"class":141},[128,1406,1407],{"class":1017}," ']'",[128,1409,857],{"class":145},[128,1411,1412],{"class":130,"line":586},[128,1413,1414],{"class":134},"                // This is a section\n",[128,1416,1417,1420,1422,1424,1426,1428,1431,1434,1436,1438,1440,1443],{"class":130,"line":610},[128,1418,1419],{"class":145},"                currentSection ",[128,1421,250],{"class":141},[128,1423,1265],{"class":145},[128,1425,1347],{"class":196},[128,1427,1138],{"class":145},[128,1429,1430],{"class":149},"1",[128,1432,1433],{"class":145},", line.",[128,1435,1394],{"class":196},[128,1437,521],{"class":145},[128,1439,1353],{"class":141},[128,1441,1442],{"class":149}," 2",[128,1444,1282],{"class":145},[128,1446,1447,1450,1453],{"class":130,"line":616},[128,1448,1449],{"class":145},"            } ",[128,1451,1452],{"class":141},"else",[128,1454,200],{"class":145},[128,1456,1457],{"class":130,"line":621},[128,1458,1459],{"class":134},"                // This is a key-value pair\n",[128,1461,1462,1465,1468,1470,1472,1475,1477,1480],{"class":130,"line":629},[128,1463,1464],{"class":141},"                size_t",[128,1466,1467],{"class":145}," delimiterPos ",[128,1469,250],{"class":141},[128,1471,1265],{"class":145},[128,1473,1474],{"class":196},"find",[128,1476,1138],{"class":145},[128,1478,1479],{"class":1017},"'='",[128,1481,1282],{"class":145},[128,1483,1484,1487,1490,1493,1495,1497,1499],{"class":130,"line":634},[128,1485,1486],{"class":141},"                if",[128,1488,1489],{"class":145}," (delimiterPos ",[128,1491,1492],{"class":141},"!=",[128,1494,1144],{"class":196},[128,1496,1147],{"class":145},[128,1498,1150],{"class":196},[128,1500,1501],{"class":145},"::npos) {\n",[128,1503,1504,1507,1510,1512,1514,1516,1518,1520],{"class":130,"line":639},[128,1505,1506],{"class":196},"                    std",[128,1508,1509],{"class":145},"::string key ",[128,1511,250],{"class":141},[128,1513,1265],{"class":145},[128,1515,1347],{"class":196},[128,1517,1138],{"class":145},[128,1519,949],{"class":149},[128,1521,1522],{"class":145},", delimiterPos);\n",[128,1524,1525,1527,1530,1532,1534,1536,1539,1541,1543],{"class":130,"line":665},[128,1526,1506],{"class":196},[128,1528,1529],{"class":145},"::string value ",[128,1531,250],{"class":141},[128,1533,1265],{"class":145},[128,1535,1347],{"class":196},[128,1537,1538],{"class":145},"(delimiterPos ",[128,1540,1358],{"class":141},[128,1542,1361],{"class":149},[128,1544,1282],{"class":145},[128,1546,1547,1550,1552],{"class":130,"line":680},[128,1548,1549],{"class":145},"                    config[currentSection][key] ",[128,1551,250],{"class":141},[128,1553,1554],{"class":145}," value;\n",[128,1556,1557],{"class":130,"line":695},[128,1558,1559],{"class":145},"                }\n",[128,1561,1562],{"class":130,"line":706},[128,1563,613],{"class":145},[128,1565,1566],{"class":130,"line":711},[128,1567,298],{"class":145},[128,1569,1570],{"class":130,"line":716},[128,1571,184],{"emptyLinePlaceholder":183},[128,1573,1574,1577,1580],{"class":130,"line":740},[128,1575,1576],{"class":145},"        file.",[128,1578,1579],{"class":196},"close",[128,1581,1582],{"class":145},"();\n",[128,1584,1585,1587,1590],{"class":130,"line":753},[128,1586,422],{"class":141},[128,1588,1589],{"class":149}," true",[128,1591,153],{"class":145},[128,1593,1594],{"class":130,"line":766},[128,1595,304],{"class":145},[128,1597,1598],{"class":130,"line":776},[128,1599,184],{"emptyLinePlaceholder":183},[128,1601,1602,1604,1606,1608,1611,1613,1615,1617,1619,1621,1623,1626,1629,1631,1633,1635,1637,1639,1642,1644,1646],{"class":130,"line":781},[128,1603,1070],{"class":196},[128,1605,1147],{"class":145},[128,1607,1150],{"class":196},[128,1609,1610],{"class":196}," getValue",[128,1612,1138],{"class":145},[128,1614,1141],{"class":141},[128,1616,1144],{"class":196},[128,1618,1147],{"class":145},[128,1620,1150],{"class":196},[128,1622,1153],{"class":141},[128,1624,1625],{"class":228}," section",[128,1627,1628],{"class":145},", ",[128,1630,1141],{"class":141},[128,1632,1144],{"class":196},[128,1634,1147],{"class":145},[128,1636,1150],{"class":196},[128,1638,1153],{"class":141},[128,1640,1641],{"class":228}," key",[128,1643,232],{"class":145},[128,1645,1141],{"class":141},[128,1647,200],{"class":145},[128,1649,1650,1652,1654,1657,1659,1661,1663,1665,1667,1669,1671,1673,1675,1677,1679,1681,1683,1685,1687,1689,1692,1694,1697,1699],{"class":130,"line":786},[128,1651,1163],{"class":196},[128,1653,1147],{"class":145},[128,1655,1656],{"class":196},"map",[128,1658,1076],{"class":145},[128,1660,1079],{"class":196},[128,1662,1147],{"class":145},[128,1664,1150],{"class":196},[128,1666,1628],{"class":145},[128,1668,1079],{"class":196},[128,1670,1147],{"class":145},[128,1672,1656],{"class":196},[128,1674,1076],{"class":145},[128,1676,1079],{"class":196},[128,1678,1147],{"class":145},[128,1680,1150],{"class":196},[128,1682,1628],{"class":145},[128,1684,1079],{"class":196},[128,1686,1147],{"class":145},[128,1688,1150],{"class":196},[128,1690,1691],{"class":145},"> >::const_iterator sectionIt ",[128,1693,250],{"class":141},[128,1695,1696],{"class":145}," config.",[128,1698,1474],{"class":196},[128,1700,1701],{"class":145},"(section);\n",[128,1703,1704,1706,1709,1711,1713,1716],{"class":130,"line":807},[128,1705,265],{"class":141},[128,1707,1708],{"class":145}," (sectionIt ",[128,1710,1492],{"class":141},[128,1712,1696],{"class":145},[128,1714,1715],{"class":196},"end",[128,1717,1194],{"class":145},[128,1719,1720,1723,1725,1727,1729,1731,1733,1735,1737,1739,1741,1743,1746,1748,1751,1753],{"class":130,"line":820},[128,1721,1722],{"class":196},"            std",[128,1724,1147],{"class":145},[128,1726,1656],{"class":196},[128,1728,1076],{"class":145},[128,1730,1079],{"class":196},[128,1732,1147],{"class":145},[128,1734,1150],{"class":196},[128,1736,1628],{"class":145},[128,1738,1079],{"class":196},[128,1740,1147],{"class":145},[128,1742,1150],{"class":196},[128,1744,1745],{"class":145},">::const_iterator keyIt ",[128,1747,250],{"class":141},[128,1749,1750],{"class":145}," sectionIt->second.",[128,1752,1474],{"class":196},[128,1754,1755],{"class":145},"(key);\n",[128,1757,1758,1760,1763,1765,1767,1769],{"class":130,"line":832},[128,1759,1311],{"class":141},[128,1761,1762],{"class":145}," (keyIt ",[128,1764,1492],{"class":141},[128,1766,1750],{"class":145},[128,1768,1715],{"class":196},[128,1770,1194],{"class":145},[128,1772,1773,1776],{"class":130,"line":837},[128,1774,1775],{"class":141},"                return",[128,1777,1778],{"class":145}," keyIt->second;\n",[128,1780,1781],{"class":130,"line":842},[128,1782,613],{"class":145},[128,1784,1785],{"class":130,"line":860},[128,1786,298],{"class":145},[128,1788,1789,1791,1794],{"class":130,"line":873},[128,1790,422],{"class":141},[128,1792,1793],{"class":1017}," \"\"",[128,1795,153],{"class":145},[128,1797,1798],{"class":130,"line":884},[128,1799,304],{"class":145},[128,1801,1802],{"class":130,"line":889},[128,1803,184],{"emptyLinePlaceholder":183},[128,1805,1807,1810,1813,1815,1817],{"class":130,"line":1806},63,[128,1808,1809],{"class":141},"    void",[128,1811,1812],{"class":196}," printConfig",[128,1814,521],{"class":145},[128,1816,1141],{"class":141},[128,1818,200],{"class":145},[128,1820,1822,1824,1826,1828,1830,1832,1834,1836,1838,1840,1842,1844,1846,1848,1850,1852,1854,1856,1858,1860],{"class":130,"line":1821},64,[128,1823,1163],{"class":196},[128,1825,1147],{"class":145},[128,1827,1656],{"class":196},[128,1829,1076],{"class":145},[128,1831,1079],{"class":196},[128,1833,1147],{"class":145},[128,1835,1150],{"class":196},[128,1837,1628],{"class":145},[128,1839,1079],{"class":196},[128,1841,1147],{"class":145},[128,1843,1656],{"class":196},[128,1845,1076],{"class":145},[128,1847,1079],{"class":196},[128,1849,1147],{"class":145},[128,1851,1150],{"class":196},[128,1853,1628],{"class":145},[128,1855,1079],{"class":196},[128,1857,1147],{"class":145},[128,1859,1150],{"class":196},[128,1861,1862],{"class":145},"> >::const_iterator sectionIt;\n",[128,1864,1866,1869,1871,1873,1875,1878,1881,1883,1885,1887,1890,1893],{"class":130,"line":1865},65,[128,1867,1868],{"class":141},"        for",[128,1870,1708],{"class":145},[128,1872,250],{"class":141},[128,1874,1696],{"class":145},[128,1876,1877],{"class":196},"begin",[128,1879,1880],{"class":145},"(); sectionIt ",[128,1882,1492],{"class":141},[128,1884,1696],{"class":145},[128,1886,1715],{"class":196},[128,1888,1889],{"class":145},"(); ",[128,1891,1892],{"class":141},"++",[128,1894,1895],{"class":145},"sectionIt) {\n",[128,1897,1899,1901,1904,1907,1910,1913,1916,1918,1921,1923,1925],{"class":130,"line":1898},66,[128,1900,1722],{"class":196},[128,1902,1903],{"class":145},"::cout ",[128,1905,1906],{"class":141},"\u003C\u003C",[128,1908,1909],{"class":1017}," \"[\"",[128,1911,1912],{"class":141}," \u003C\u003C",[128,1914,1915],{"class":145}," sectionIt->first ",[128,1917,1906],{"class":141},[128,1919,1920],{"class":1017}," \"]\"",[128,1922,1912],{"class":141},[128,1924,1144],{"class":196},[128,1926,1927],{"class":145},"::endl;\n",[128,1929,1931,1933,1935,1937,1939,1941,1943,1945,1947,1949,1951,1953],{"class":130,"line":1930},67,[128,1932,1722],{"class":196},[128,1934,1147],{"class":145},[128,1936,1656],{"class":196},[128,1938,1076],{"class":145},[128,1940,1079],{"class":196},[128,1942,1147],{"class":145},[128,1944,1150],{"class":196},[128,1946,1628],{"class":145},[128,1948,1079],{"class":196},[128,1950,1147],{"class":145},[128,1952,1150],{"class":196},[128,1954,1955],{"class":145},">::const_iterator keyIt;\n",[128,1957,1959,1961,1963,1965,1967,1969,1972,1974,1976,1978,1980,1982],{"class":130,"line":1958},68,[128,1960,574],{"class":141},[128,1962,1762],{"class":145},[128,1964,250],{"class":141},[128,1966,1750],{"class":145},[128,1968,1877],{"class":196},[128,1970,1971],{"class":145},"(); keyIt ",[128,1973,1492],{"class":141},[128,1975,1750],{"class":145},[128,1977,1715],{"class":196},[128,1979,1889],{"class":145},[128,1981,1892],{"class":141},[128,1983,1984],{"class":145},"keyIt) {\n",[128,1986,1988,1991,1993,1995,1998,2000,2003,2005,2008,2010,2012],{"class":130,"line":1987},69,[128,1989,1990],{"class":196},"                std",[128,1992,1903],{"class":145},[128,1994,1906],{"class":141},[128,1996,1997],{"class":145}," keyIt->first ",[128,1999,1906],{"class":141},[128,2001,2002],{"class":1017}," \" = \"",[128,2004,1912],{"class":141},[128,2006,2007],{"class":145}," keyIt->second ",[128,2009,1906],{"class":141},[128,2011,1144],{"class":196},[128,2013,1927],{"class":145},[128,2015,2017],{"class":130,"line":2016},70,[128,2018,613],{"class":145},[128,2020,2022,2024,2026,2028,2030],{"class":130,"line":2021},71,[128,2023,1722],{"class":196},[128,2025,1903],{"class":145},[128,2027,1906],{"class":141},[128,2029,1144],{"class":196},[128,2031,1927],{"class":145},[128,2033,2035],{"class":130,"line":2034},72,[128,2036,298],{"class":145},[128,2038,2040],{"class":130,"line":2039},73,[128,2041,304],{"class":145},[128,2043,2045],{"class":130,"line":2044},74,[128,2046,2047],{"class":145},"};\n",[128,2049,2051],{"class":130,"line":2050},75,[128,2052,184],{"emptyLinePlaceholder":183},[128,2054,2056,2059,2062],{"class":130,"line":2055},76,[128,2057,2058],{"class":141},"int",[128,2060,2061],{"class":196}," main",[128,2063,2064],{"class":145},"() {\n",[128,2066,2068],{"class":130,"line":2067},77,[128,2069,2070],{"class":145},"    ConfigParser parser;\n",[128,2072,2074,2077,2080,2083,2085,2088],{"class":130,"line":2073},78,[128,2075,2076],{"class":141},"    if",[128,2078,2079],{"class":145}," (parser.",[128,2081,2082],{"class":196},"parse",[128,2084,1138],{"class":145},[128,2086,2087],{"class":1017},"\"config.ini\"",[128,2089,2090],{"class":145},")) {\n",[128,2092,2094,2096,2098,2100,2103,2105,2107],{"class":130,"line":2093},79,[128,2095,1163],{"class":196},[128,2097,1903],{"class":145},[128,2099,1906],{"class":141},[128,2101,2102],{"class":1017}," \"Config file parsed successfully.\"",[128,2104,1912],{"class":141},[128,2106,1144],{"class":196},[128,2108,1927],{"class":145},[128,2110,2112,2115,2118],{"class":130,"line":2111},80,[128,2113,2114],{"class":145},"        parser.",[128,2116,2117],{"class":196},"printConfig",[128,2119,1582],{"class":145},[128,2121,2123],{"class":130,"line":2122},81,[128,2124,184],{"emptyLinePlaceholder":183},[128,2126,2128,2130,2132,2134,2137,2139,2142,2145,2147,2150,2152,2155,2157,2159,2161],{"class":130,"line":2127},82,[128,2129,1163],{"class":196},[128,2131,1903],{"class":145},[128,2133,1906],{"class":141},[128,2135,2136],{"class":1017}," \"Value of 'key1' in 'section1': \"",[128,2138,1912],{"class":141},[128,2140,2141],{"class":145}," parser.",[128,2143,2144],{"class":196},"getValue",[128,2146,1138],{"class":145},[128,2148,2149],{"class":1017},"\"section1\"",[128,2151,1628],{"class":145},[128,2153,2154],{"class":1017},"\"key1\"",[128,2156,232],{"class":145},[128,2158,1906],{"class":141},[128,2160,1144],{"class":196},[128,2162,1927],{"class":145},[128,2164,2166,2169,2171],{"class":130,"line":2165},83,[128,2167,2168],{"class":145},"    } ",[128,2170,1452],{"class":141},[128,2172,200],{"class":145},[128,2174,2176,2178,2180,2182,2185,2187,2189],{"class":130,"line":2175},84,[128,2177,1163],{"class":196},[128,2179,1903],{"class":145},[128,2181,1906],{"class":141},[128,2183,2184],{"class":1017}," \"Failed to parse config file.\"",[128,2186,1912],{"class":141},[128,2188,1144],{"class":196},[128,2190,1927],{"class":145},[128,2192,2194],{"class":130,"line":2193},85,[128,2195,304],{"class":145},[128,2197,2199,2202,2205],{"class":130,"line":2198},86,[128,2200,2201],{"class":141},"    return",[128,2203,2204],{"class":149}," 0",[128,2206,153],{"class":145},[128,2208,2210],{"class":130,"line":2209},87,[128,2211,892],{"class":145},[12,2213,2214,2215,2220,2221,2226,2227,2232,2233,2220,2236,2220,2239,2242],{},"同じプロンプトを、",[16,2216,2219],{"href":2217,"rel":2218},"https://docs.gitlab.com/ja-jp/user/gitlab_duo_chat/examples/#explain-code-in-the-ide",[],"コードの説明","、",[16,2222,2225],{"href":2223,"rel":2224},"https://docs.gitlab.com/ja-jp/user/gitlab_duo_chat/examples/#write-tests-in-the-ide",[],"テスト生成","、さらには",[16,2228,2231],{"href":2229,"rel":2230},"https://docs.gitlab.com/ja-jp/user/gitlab_duo_chat/examples/#refactor-code-in-the-ide",[],"コードのリファクタリング","にも適用できます。たとえば、",[125,2234,2235],{},"/explain focus on C++03 features",[125,2237,2238],{},"/tests for C++03 features",[125,2240,2241],{},"/refactor into C++03"," などです。\n次のC++標準は、GitLab Duoのコード提案を使用して動作を確認済みです。",[47,2244,2245,2248,2251,2254,2257,2260],{},[50,2246,2247],{},"C++03",[50,2249,2250],{},"C++11",[50,2252,2253],{},"C++14",[50,2255,2256],{},"C++17",[50,2258,2259],{},"C++20",[50,2261,2262],{},"C++23",[12,2264,2265,2266,960],{},"ソースコードは、",[16,2267,2270],{"href":2268,"rel":2269},"https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-cpp-standards-config-parser",[],"Challenge - Refactor Cpp Standards Config Parser project",[12,2272,2273],{},"C++標準間でソースコードをリファクタリングする組み合わせは数多く存在します。次の例では、C++コードを最新バージョンにアップグレードするケースに焦点を当てています。一方、熱心なデベロッパーがC++20を使用したいものの、エンタープライズな顧客環境をサポートするためにC++11にダウングレードしなければならなかったというシナリオもテストしています。",[2275,2276,65],"h4",{"id":2277},"移行c03をc14にリファクタリング",[12,2279,2280,2281,2286],{},"ここでは、コードのモダナイゼーションを行い、C++03からC++14への変更点を理解することを目標とします。IDEで",[16,2282,2285],{"href":2283,"rel":2284},"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",[],"03.cpp","のソースコードを開き、選択した後、次のChatプロンプトを使用します。",[118,2288,2292],{"className":2289,"code":2290,"language":2291,"meta":123,"style":123},"language-markdown shiki shiki-themes github-light","/refactor into C++14 and explain the changes\n（日本語訳：/C++14にリファクタリングし、変更を説明してください）\n","markdown",[125,2293,2294,2299],{"__ignoreMap":123},[128,2295,2296],{"class":130,"line":131},[128,2297,2298],{"class":145},"/refactor into C++14 and explain the changes\n",[128,2300,2301],{"class":130,"line":138},[128,2302,2303],{"class":145},"（日本語訳：/C++14にリファクタリングし、変更を説明してください）\n",[12,2305,2306],{},"Chatの回答例：",[118,2308,2310],{"className":2289,"code":2309,"language":2291,"meta":123,"style":123},"…\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",[125,2311,2312,2317,2321,2326,2330,2350,2370,2378,2392,2406,2414,2428,2448,2468,2495,2499],{"__ignoreMap":123},[128,2313,2314],{"class":130,"line":131},[128,2315,2316],{"class":145},"…\n",[128,2318,2319],{"class":130,"line":138},[128,2320,184],{"emptyLinePlaceholder":183},[128,2322,2323],{"class":130,"line":156},[128,2324,2325],{"class":145},"変更点の説明：\n",[128,2327,2328],{"class":130,"line":168},[128,2329,184],{"emptyLinePlaceholder":183},[128,2331,2332,2335,2338,2341,2344,2347],{"class":130,"line":180},[128,2333,2334],{"class":228},"1.",[128,2336,2337],{"class":145}," デフォルトコンストラクタ: ",[128,2339,2340],{"class":149},"`ConfigParser() {}`",[128,2342,2343],{"class":145}," を ",[128,2345,2346],{"class":149},"`ConfigParser() = default;`",[128,2348,2349],{"class":145}," に変更し、デフォルトコンストラクタを使用しました。\n",[128,2351,2352,2355,2358,2361,2364,2367],{"class":130,"line":187},[128,2353,2354],{"class":228},"2.",[128,2356,2357],{"class":145}," ファイルオープン: ファイルを開く際、",[128,2359,2360],{"class":149},"`.c_str()`",[128,2362,2363],{"class":145}," を削除しました。C++11以降では、",[128,2365,2366],{"class":149},"`std::string`",[128,2368,2369],{"class":145}," が直接サポートされています。\n",[128,2371,2372,2375],{"class":130,"line":203},[128,2373,2374],{"class":228},"3.",[128,2376,2377],{"class":145}," ラムダ関数: 文字列のトリミング処理を行うラムダ関数trimを導入し、コードの可読性と再利用性を向上させました。\n",[128,2379,2380,2383,2386,2389],{"class":130,"line":212},[128,2381,2382],{"class":228},"4.",[128,2384,2385],{"class":145}," 自動キーワード: 型推論のために様々な箇所で ",[128,2387,2388],{"class":149},"`auto`",[128,2390,2391],{"class":145}," を使用し、コードの可読性を改善しました。\n",[128,2393,2394,2397,2400,2403],{"class":130,"line":217},[128,2395,2396],{"class":228},"5.",[128,2398,2399],{"class":145}," 範囲ベースのforループ:  ",[128,2401,2402],{"class":149},"`printConfig`",[128,2404,2405],{"class":145}," メソッド内で従来のforループを範囲ベースのforループに置き換え、より簡潔でエラーが少ない構造にしました。\n",[128,2407,2408,2411],{"class":130,"line":241},[128,2409,2410],{"class":228},"6.",[128,2412,2413],{"class":145}," 構造化束縛: 範囲ベースのforループで構造化束縛を使用し、キーと値のペアに直接アクセスできるようにしました。\n",[128,2415,2416,2419,2422,2425],{"class":130,"line":262},[128,2417,2418],{"class":228},"7.",[128,2420,2421],{"class":145}," 初期化付きif文: ",[128,2423,2424],{"class":149},"`getValue`",[128,2426,2427],{"class":145}," メソッド内で、検索操作と条件チェックを1行で行える初期化付きif文を使用しました。\n",[128,2429,2430,2433,2436,2439,2442,2445],{"class":130,"line":283},[128,2431,2432],{"class":228},"8.",[128,2434,2435],{"class":145}," 文字列メンバー関数: 文字列の最初と最後の文字を取得する際に、配列風のアクセスではなく ",[128,2437,2438],{"class":149},"`front()`",[128,2440,2441],{"class":145}," と ",[128,2443,2444],{"class":149},"`back()`",[128,2446,2447],{"class":145}," を使用しました。\n",[128,2449,2450,2453,2456,2459,2462,2465],{"class":130,"line":295},[128,2451,2452],{"class":228},"9.",[128,2454,2455],{"class":145}," 初期化の統一: オブジェクトの生成時に ",[128,2457,2458],{"class":149},"`()`",[128,2460,2461],{"class":145}," ではなく ",[128,2463,2464],{"class":149},"`{}`",[128,2466,2467],{"class":145}," を使用する統一された初期化を採用しました。\n",[128,2469,2470,2473,2476,2479,2482,2484,2487,2490,2492],{"class":130,"line":301},[128,2471,2472],{"class":228},"10.",[128,2474,2475],{"class":149}," `std::endl`",[128,2477,2478],{"class":145}," の削除： ",[128,2480,2481],{"class":149},"`std::endl`",[128,2483,2343],{"class":145},[128,2485,2486],{"class":149},"`'\\n'`",[128,2488,2489],{"class":145}," に置き換え、パフォーマンスを向上させました。",[128,2491,2481],{"class":149},[128,2493,2494],{"class":145}," は出力バッファーを強制的にフラッシュするためです。\n",[128,2496,2497],{"class":130,"line":307},[128,2498,184],{"emptyLinePlaceholder":183},[128,2500,2501],{"class":130,"line":312},[128,2502,2503],{"class":145},"これらの変更により、コードはよりモダンで簡潔になり、同じ機能を維持しつつ効率性が向上しています。\n",[12,2505,2506],{},[909,2507],{"alt":2508,"src":2509},"コードに反映された変更","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp03_to_14_01.png",[12,2511,2512],{},[909,2513],{"alt":2514,"src":2515},"コードに反映された変更2","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675060/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp03_to_14_02.png",[2275,2517,68],{"id":2518},"ダウングレードc23をc11にリファクタリング",[12,2520,2521],{},"時に、デベロッパーはC++20のようなモダンなC++標準で新しい機能の概念実証を開始しますが、エンタープライズな顧客環境で実際にサポートされているバージョンでは、C++11をサポートする古いコンパイラが必要になる場合があります。バージョンをダウングレードするにはコストがかかるほか、どの言語機能がまだサポートされているかを確認し、潜在的なデメリットを検討する必要があります。",[12,2523,2524,2525,2286],{},"IDEで",[16,2526,2529],{"href":2527,"rel":2528},"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",[],"23.cpp",[118,2531,2533],{"className":2289,"code":2532,"language":2291,"meta":123,"style":123},"/refactor into C++11, explain the necessary changes and potential problems\n（日本語訳：/C++14にリファクタリングし、必要な変更点と潜在的な問題点を説明してください）\n",[125,2534,2535,2540],{"__ignoreMap":123},[128,2536,2537],{"class":130,"line":131},[128,2538,2539],{"class":145},"/refactor into C++11, explain the necessary changes and potential problems\n",[128,2541,2542],{"class":130,"line":138},[128,2543,2544],{"class":145},"（日本語訳：/C++14にリファクタリングし、必要な変更点と潜在的な問題点を説明してください）\n",[12,2546,2547],{},"Duo Chatの回答例：",[118,2549,2551],{"className":2289,"code":2550,"language":2291,"meta":123,"style":123},"このコードを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",[125,2552,2553,2558,2562,2569,2588,2606,2610,2615,2619,2626,2645,2661,2665],{"__ignoreMap":123},[128,2554,2555],{"class":130,"line":131},[128,2556,2557],{"class":145},"このコードをC++11に対応させるために必要な主な変更点は次の通りです：\n",[128,2559,2560],{"class":130,"line":138},[128,2561,184],{"emptyLinePlaceholder":183},[128,2563,2564,2566],{"class":130,"line":156},[128,2565,2334],{"class":228},[128,2567,2568],{"class":145}," C++23標準のコメントを削除しました。これはもう適用されないためです。\n",[128,2570,2571,2573,2576,2579,2582,2585],{"class":130,"line":168},[128,2572,2354],{"class":228},[128,2574,2575],{"class":145}," trim関数内で ",[128,2577,2578],{"class":149},"`std::string::find_first_not_of`",[128,2580,2581],{"class":145}," と  ",[128,2583,2584],{"class":149},"`std::string::find_last_not_of`",[128,2586,2587],{"class":145}," をC++11対応の代替方法に置き換えました。\n",[128,2589,2590,2592,2595,2597,2600,2603],{"class":130,"line":180},[128,2591,2374],{"class":228},[128,2593,2594],{"class":145}," ループ変数には ",[128,2596,2388],{"class":149},[128,2598,2599],{"class":145}," の代わりに ",[128,2601,2602],{"class":149},"`const auto&`",[128,2604,2605],{"class":145}," を使用し、不要なコピーを避けました。\n",[128,2607,2608],{"class":130,"line":187},[128,2609,184],{"emptyLinePlaceholder":183},[128,2611,2612],{"class":130,"line":203},[128,2613,2614],{"class":145},"オリジナルのコードにおける潜在的な問題点は次の通りです：\n",[128,2616,2617],{"class":130,"line":212},[128,2618,184],{"emptyLinePlaceholder":183},[128,2620,2621,2623],{"class":130,"line":217},[128,2622,2334],{"class":228},[128,2624,2625],{"class":145}," オリジナルのコードはC++23の機能を使用しており、まだ広くサポートされていない可能性があります。\n",[128,2627,2628,2630,2633,2636,2638,2640,2642],{"class":130,"line":241},[128,2629,2354],{"class":228},[128,2631,2632],{"class":149}," `trim`",[128,2634,2635],{"class":145}," 関数では ",[128,2637,2578],{"class":149},[128,2639,2441],{"class":145},[128,2641,2584],{"class":149},[128,2643,2644],{"class":145}," を使用しており、これらはC++11には存在しません。\n",[128,2646,2647,2649,2652,2654,2656,2658],{"class":130,"line":262},[128,2648,2374],{"class":228},[128,2650,2651],{"class":145}," 一部のループで ",[128,2653,2602],{"class":149},[128,2655,2599],{"class":145},[128,2657,2388],{"class":149},[128,2659,2660],{"class":145}," を使用していないと、複雑なオブジェクトが不必要にコピーされる可能性があります。\n",[128,2662,2663],{"class":130,"line":283},[128,2664,184],{"emptyLinePlaceholder":183},[128,2666,2667,2670,2673,2676,2679,2682,2684],{"class":130,"line":295},[128,2668,2669],{"class":145},"これらの問題はリファクタリング版で解決されています。",[128,2671,2672],{"class":149},"`trim`",[128,2674,2675],{"class":145}," 関数は、C++11対応の場合と同じ結果を得るために、ラムダ関数を使った ",[128,2677,2678],{"class":149},"`std::find_if_not`",[128,2680,2681],{"class":145}," を利用するように変更されました。また、 ",[128,2683,2602],{"class":149},[128,2685,2686],{"class":145}," を使用することで、設定マップを反復処理する際に不要なコピーが行われないようにしました。\n",[12,2688,2689],{},[909,2690],{"alt":2691,"src":2692},"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",[12,2694,2695],{},[909,2696],{"alt":2697,"src":2698},"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",[12,2700,2701,2705],{},[2702,2703,2704],"strong",{},"非同期練習","：他のバージョンのリファクタリングシナリオをテストしてみましょう。",[108,2707,71],{"id":2708},"cobolの説明とリファクタリング",[12,2710,2711,2712,2717],{},"GitLab Duoを使用して、COBOLプログラムのソースコードを説明させたり、解析、修正、リファクタリングを実行してもらえます。筆者はCOBOLを書いたことも学んだこともありませんでしたが、この",[16,2713,2716],{"href":2714,"rel":2715},"https://github.com/openmainframeproject/cobol-programming-course",[],"COBOL Programming Course","では豊富な例が紹介されていて有用だと感じました。",[12,2719,2720],{},"その後、次のように、Chatに「COBOLの始め方」「COBOLプログラムの作成方法」「macOSでのCOBOLプログラムのコンパイル方法」について質問しました。",[118,2722,2724],{"className":2289,"code":2723,"language":2291,"meta":123,"style":123},"Please 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",[125,2725,2726,2731,2736,2740,2745,2750,2754,2759],{"__ignoreMap":123},[128,2727,2728],{"class":130,"line":131},[128,2729,2730],{"class":145},"Please explain what COBOL is and its syntax\n",[128,2732,2733],{"class":130,"line":138},[128,2734,2735],{"class":145},"（日本語訳：COBOLとは何か、その構文について説明してください。）\n",[128,2737,2738],{"class":130,"line":156},[128,2739,184],{"emptyLinePlaceholder":183},[128,2741,2742],{"class":130,"line":168},[128,2743,2744],{"class":145},"Please create a COBOL program that shows the first steps\n",[128,2746,2747],{"class":130,"line":180},[128,2748,2749],{"class":145},"（日本語訳：COBOLプログラムを作成し、最初のステップを示してください。）\n",[128,2751,2752],{"class":130,"line":187},[128,2753,184],{"emptyLinePlaceholder":183},[128,2755,2756],{"class":130,"line":203},[128,2757,2758],{"class":145},"Tell me more about the COBOL compiler. Which system do I need? Can I do it on my macOS?\n",[128,2760,2761],{"class":130,"line":212},[128,2762,2763],{"class":145},"（日本語訳：COBOLコンパイラについて教えてください。どのようなシステムが必要ですか？ macOSで実行できますか？）\n",[12,2765,2766],{},[909,2767],{"alt":2768,"src":2769},"GitLab Duo Chatに説明とその構文を求める","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/vscode_chat_cobol_generate_example.png",[12,2771,2772,2773,2775],{},"COBOLプログラムを開き、ソースコードを選択したら、Duo Chatに切り替えて、",[125,2774,904],{}," プロンプトを送信し、目的や機能を説明してもらいましょう。",[12,2777,2778],{},"また、プロンプトをさらに洗練して、全体像をより反映したサマリーを取得することもできます。",[118,2780,2783],{"className":2289,"code":2781,"language":2291,"meta":2782,"style":123},"（日本語訳：/explain ５歳児にもわかるように説明してください。）\n","/explain like I am five",[125,2784,2785],{"__ignoreMap":123},[128,2786,2787],{"class":130,"line":131},[128,2788,2781],{"class":145},[2790,2791,2792],"blockquote",{},[12,2793,2794],{},"ヒント：プログラミング言語は、類似したアルゴリズムや機能を共有しています。COBOLについては、ChatによるPythonを介した説明が提供されたため、以降のプロンプトではPythonでの説明を求めるように調整しました。",[118,2796,2798],{"className":2289,"code":2797,"language":2291,"meta":123,"style":123},"/explain in a different programming language\n（日本語訳：/explain 異なるプログラミング言語で説明してください。）\n",[125,2799,2800,2805],{"__ignoreMap":123},[128,2801,2802],{"class":130,"line":131},[128,2803,2804],{"class":145},"/explain in a different programming language\n",[128,2806,2807],{"class":130,"line":138},[128,2808,2809],{"class":145},"（日本語訳：/explain 異なるプログラミング言語で説明してください。）\n",[12,2811,2812,2813,2816],{},"Chatでは、",[125,2814,2815],{},"/refactor"," スラッシュ（/）コマンドを使用して、コード品質の改善、潜在的な問題の修正、およびCOBOLのPythonへのリファクタリングを実行できます。",[118,2818,2820],{"className":2289,"code":2819,"language":2291,"meta":123,"style":123},"/refactor fix the environment error\n（日本語訳：/refactor 環境上のエラーを修正してください。）\n\n/refactor fix potential problems\n（日本語訳：/refactor 潜在的な問題を修正してください。）\n\n/refactor into Python\n（日本語訳：/refactor Pythonにリファクタリングしてください。）\n",[125,2821,2822,2827,2832,2836,2841,2846,2850,2855],{"__ignoreMap":123},[128,2823,2824],{"class":130,"line":131},[128,2825,2826],{"class":145},"/refactor fix the environment error\n",[128,2828,2829],{"class":130,"line":138},[128,2830,2831],{"class":145},"（日本語訳：/refactor 環境上のエラーを修正してください。）\n",[128,2833,2834],{"class":130,"line":156},[128,2835,184],{"emptyLinePlaceholder":183},[128,2837,2838],{"class":130,"line":168},[128,2839,2840],{"class":145},"/refactor fix potential problems\n",[128,2842,2843],{"class":130,"line":180},[128,2844,2845],{"class":145},"（日本語訳：/refactor 潜在的な問題を修正してください。）\n",[128,2847,2848],{"class":130,"line":187},[128,2849,184],{"emptyLinePlaceholder":183},[128,2851,2852],{"class":130,"line":203},[128,2853,2854],{"class":145},"/refactor into Python\n",[128,2856,2857],{"class":130,"line":212},[128,2858,2859],{"class":145},"（日本語訳：/refactor Pythonにリファクタリングしてください。）\n",[12,2861,2862,2863,2868],{},"次の",[16,2864,2867],{"href":2865,"rel":2866},"https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-explain-refactor-cobol-program",[],"GitLab Duo Coffee Chat - Challenge: Explain and Refactor COBOL programs","の録画では、欠落しているピリオドの見つけ方など、すべての手順が実際のユースケースをもとに説明されています。",[940,2870,944,2872],{"className":2871},[943],[946,2873,951],{"src":2874,"frameBorder":949,"allowFullScreen":950},"https://www.youtube.com/embed/pwlDmLQMMPo",[101,2876,2877],{"id":2877},"異なる言語間でのリファクタリング",[12,2879,2880],{},"モダナイゼーションとコード品質の改善には、プログラミング言語の変更が必要になる場合があります。GitLab Duoのリファクタリングプロンプトを使用して、移行プロセスを迅速に進められますCOBOLとPythonの例は、エンタープライズ環境において一般的な要件のひとつに過ぎません。その他のユースケースを詳しく見ていきましょう。",[108,2882,79],{"id":2883},"cをrustにリファクタリング",[12,2885,2886,2887,2892],{},"2024年初頭に、Cを始めとするいくつかのプログラミング言語は、メモリの安全性に問題があると指摘されました。今後のプロジェクトでは、Rustのような",[16,2888,2891],{"href":2889,"rel":2890},"https://about.gitlab.com/blog/memory-safe-vs-unsafe/",[],"メモリ安全な言語","（英語）が推奨されています。ここでは、移行へのアプローチや、想定すべき課題について理解しましょう。",[12,2894,2895],{},"簡単なCの例で試してみましょう。このコードはコード提案を使用して生成されており、オペレーティングシステムの基本情報（名前、バージョン、プラットフォームなど）を表示します。このCコードは、Windows、Linux、macOSでクロスプラットフォームにコンパイルできます。",[118,2897,2901],{"className":2898,"code":2899,"language":2900,"meta":123,"style":123},"language-c shiki shiki-themes github-light","// 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","c",[125,2902,2903,2908,2913,2920,2927,2934,2938,2946,2954,2962,2969,2974,2980,2985,2989,2999,3006,3011,3029,3042,3060,3064,3081,3104,3120,3127,3135,3147,3151,3166,3183,3198,3203,3209,3219,3223,3238,3253,3267,3272,3276,3280,3288,3295,3303],{"__ignoreMap":123},[128,2904,2905],{"class":130,"line":131},[128,2906,2907],{"class":134},"// OSファイルを読み込み、プラットフォーム、名前、バージョンを特定する\n",[128,2909,2910],{"class":130,"line":138},[128,2911,2912],{"class":134},"// ターミナルに出力する\n",[128,2914,2915,2917],{"class":130,"line":156},[128,2916,1014],{"class":141},[128,2918,2919],{"class":1017}," \u003Cstdio.h>\n",[128,2921,2922,2924],{"class":130,"line":168},[128,2923,1014],{"class":141},[128,2925,2926],{"class":1017}," \u003Cstdlib.h>\n",[128,2928,2929,2931],{"class":130,"line":180},[128,2930,1014],{"class":141},[128,2932,2933],{"class":1017}," \u003Cstring.h>\n",[128,2935,2936],{"class":130,"line":187},[128,2937,184],{"emptyLinePlaceholder":183},[128,2939,2940,2943],{"class":130,"line":203},[128,2941,2942],{"class":141},"#ifdef",[128,2944,2945],{"class":196}," _WIN32\n",[128,2947,2948,2951],{"class":130,"line":212},[128,2949,2950],{"class":141},"    #include",[128,2952,2953],{"class":1017}," \u003Cwindows.h>\n",[128,2955,2956,2959],{"class":130,"line":217},[128,2957,2958],{"class":141},"#elif",[128,2960,2961],{"class":196}," __APPLE__\n",[128,2963,2964,2966],{"class":130,"line":241},[128,2965,2950],{"class":141},[128,2967,2968],{"class":1017}," \u003Csys/utsname.h>\n",[128,2970,2971],{"class":130,"line":262},[128,2972,2973],{"class":141},"#else\n",[128,2975,2976,2978],{"class":130,"line":283},[128,2977,2950],{"class":141},[128,2979,2968],{"class":1017},[128,2981,2982],{"class":130,"line":295},[128,2983,2984],{"class":141},"#endif\n",[128,2986,2987],{"class":130,"line":301},[128,2988,184],{"emptyLinePlaceholder":183},[128,2990,2991,2994,2997],{"class":130,"line":307},[128,2992,2993],{"class":141},"void",[128,2995,2996],{"class":196}," get_os_info",[128,2998,2064],{"class":145},[128,3000,3001,3004],{"class":130,"line":312},[128,3002,3003],{"class":141},"    #ifdef",[128,3005,2945],{"class":196},[128,3007,3008],{"class":130,"line":340},[128,3009,3010],{"class":145},"        OSVERSIONINFOEX info;\n",[128,3012,3013,3016,3018,3020,3023,3026],{"class":130,"line":357},[128,3014,3015],{"class":196},"        ZeroMemory",[128,3017,1138],{"class":145},[128,3019,1153],{"class":141},[128,3021,3022],{"class":145},"info, ",[128,3024,3025],{"class":141},"sizeof",[128,3027,3028],{"class":145},"(OSVERSIONINFOEX));\n",[128,3030,3031,3034,3036,3039],{"class":130,"line":375},[128,3032,3033],{"class":145},"        info.dwOSVersionInfoSize ",[128,3035,250],{"class":141},[128,3037,3038],{"class":141}," sizeof",[128,3040,3041],{"class":145},"(OSVERSIONINFOEX);\n",[128,3043,3044,3047,3050,3052,3055,3057],{"class":130,"line":380},[128,3045,3046],{"class":196},"        GetVersionEx",[128,3048,3049],{"class":145},"((OSVERSIONINFO",[128,3051,150],{"class":141},[128,3053,3054],{"class":145},")",[128,3056,1153],{"class":141},[128,3058,3059],{"class":145},"info);\n",[128,3061,3062],{"class":130,"line":385},[128,3063,184],{"emptyLinePlaceholder":183},[128,3065,3066,3069,3071,3074,3077,3079],{"class":130,"line":406},[128,3067,3068],{"class":196},"        printf",[128,3070,1138],{"class":145},[128,3072,3073],{"class":1017},"\"Platform: Windows",[128,3075,3076],{"class":149},"\\n",[128,3078,1279],{"class":1017},[128,3080,1282],{"class":145},[128,3082,3083,3085,3087,3090,3093,3096,3099,3101],{"class":130,"line":419},[128,3084,3068],{"class":196},[128,3086,1138],{"class":145},[128,3088,3089],{"class":1017},"\"Version: ",[128,3091,3092],{"class":149},"%d",[128,3094,3095],{"class":1017},".",[128,3097,3098],{"class":149},"%d\\n",[128,3100,1279],{"class":1017},[128,3102,3103],{"class":145},", info.dwMajorVersion, info.dwMinorVersion);\n",[128,3105,3106,3108,3110,3113,3115,3117],{"class":130,"line":440},[128,3107,3068],{"class":196},[128,3109,1138],{"class":145},[128,3111,3112],{"class":1017},"\"Build: ",[128,3114,3098],{"class":149},[128,3116,1279],{"class":1017},[128,3118,3119],{"class":145},", info.dwBuildNumber);\n",[128,3121,3122,3125],{"class":130,"line":445},[128,3123,3124],{"class":141},"    #elif",[128,3126,2961],{"class":196},[128,3128,3129,3132],{"class":130,"line":450},[128,3130,3131],{"class":141},"        struct",[128,3133,3134],{"class":145}," utsname sys_info;\n",[128,3136,3137,3140,3142,3144],{"class":130,"line":470},[128,3138,3139],{"class":196},"        uname",[128,3141,1138],{"class":145},[128,3143,1153],{"class":141},[128,3145,3146],{"class":145},"sys_info);\n",[128,3148,3149],{"class":130,"line":483},[128,3150,184],{"emptyLinePlaceholder":183},[128,3152,3153,3155,3157,3160,3162,3164],{"class":130,"line":494},[128,3154,3068],{"class":196},[128,3156,1138],{"class":145},[128,3158,3159],{"class":1017},"\"Platform: macOS",[128,3161,3076],{"class":149},[128,3163,1279],{"class":1017},[128,3165,1282],{"class":145},[128,3167,3168,3170,3172,3175,3178,3180],{"class":130,"line":499},[128,3169,3068],{"class":196},[128,3171,1138],{"class":145},[128,3173,3174],{"class":1017},"\"Name: ",[128,3176,3177],{"class":149},"%s\\n",[128,3179,1279],{"class":1017},[128,3181,3182],{"class":145},", sys_info.sysname);\n",[128,3184,3185,3187,3189,3191,3193,3195],{"class":130,"line":504},[128,3186,3068],{"class":196},[128,3188,1138],{"class":145},[128,3190,3089],{"class":1017},[128,3192,3177],{"class":149},[128,3194,1279],{"class":1017},[128,3196,3197],{"class":145},", sys_info.release);\n",[128,3199,3200],{"class":130,"line":528},[128,3201,3202],{"class":141},"    #else\n",[128,3204,3205,3207],{"class":130,"line":546},[128,3206,3131],{"class":141},[128,3208,3134],{"class":145},[128,3210,3211,3213,3215,3217],{"class":130,"line":571},[128,3212,3139],{"class":196},[128,3214,1138],{"class":145},[128,3216,1153],{"class":141},[128,3218,3146],{"class":145},[128,3220,3221],{"class":130,"line":586},[128,3222,184],{"emptyLinePlaceholder":183},[128,3224,3225,3227,3229,3232,3234,3236],{"class":130,"line":610},[128,3226,3068],{"class":196},[128,3228,1138],{"class":145},[128,3230,3231],{"class":1017},"\"Platform: ",[128,3233,3177],{"class":149},[128,3235,1279],{"class":1017},[128,3237,3182],{"class":145},[128,3239,3240,3242,3244,3246,3248,3250],{"class":130,"line":616},[128,3241,3068],{"class":196},[128,3243,1138],{"class":145},[128,3245,3174],{"class":1017},[128,3247,3177],{"class":149},[128,3249,1279],{"class":1017},[128,3251,3252],{"class":145},", sys_info.nodename);\n",[128,3254,3255,3257,3259,3261,3263,3265],{"class":130,"line":621},[128,3256,3068],{"class":196},[128,3258,1138],{"class":145},[128,3260,3089],{"class":1017},[128,3262,3177],{"class":149},[128,3264,1279],{"class":1017},[128,3266,3197],{"class":145},[128,3268,3269],{"class":130,"line":629},[128,3270,3271],{"class":141},"    #endif\n",[128,3273,3274],{"class":130,"line":634},[128,3275,892],{"class":145},[128,3277,3278],{"class":130,"line":639},[128,3279,184],{"emptyLinePlaceholder":183},[128,3281,3282,3284,3286],{"class":130,"line":665},[128,3283,2058],{"class":141},[128,3285,2061],{"class":196},[128,3287,2064],{"class":145},[128,3289,3290,3293],{"class":130,"line":680},[128,3291,3292],{"class":196},"    get_os_info",[128,3294,1582],{"class":145},[128,3296,3297,3299,3301],{"class":130,"line":695},[128,3298,2201],{"class":141},[128,3300,2204],{"class":149},[128,3302,153],{"class":145},[128,3304,3305],{"class":130,"line":706},[128,3306,892],{"class":145},[12,3308,3309,3310,3317,3318,3320,3321,3323,3324,3327],{},"ここでは、JetBrains CLionなどを使用して ",[16,3311,3314],{"href":3312,"rel":3313},"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",[],[125,3315,3316],{},"os.c"," のソースコードを開きます。 ソースコードを選択し、Chatプロンプトで ",[125,3319,904],{}," を使用して目的や機能を説明します。次に、Chatプロンプトで ",[125,3322,2815],{}," を使用してCコードをリファクタリングし、さらに ",[125,3325,3326],{},"/refactor into Rust"," を使用してRustにリファクタリングします。",[12,3329,3330,3331,3334,3335,3338],{},"新しいRustプロジェクトを初期化（ヒント：Duo Chatに質問してみましょう）し、生成されたソースコードを ",[125,3332,3333],{},"src/main.rs"," ファイルにコピーします。",[125,3336,3337],{},"cargo build"," を実行してコードをコンパイルします。",[12,3340,3341],{},[909,3342],{"alt":3343,"src":3344},"新しいRustプロジェクトを初期化し、生成されたソースコードを src/main.rs ファイルにコピーします。cargo build を実行してコードをコンパイルします。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/jetbrains_clion_c_rust.png",[12,3346,3347,3352,3353,3355],{},[16,3348,3351],{"href":3349,"rel":3350},"https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-c-to-rust",[],"GitLab Duo Coffee Chat: Challenge - Refactor C into Rust ","の録画では、の録画では、すべての手順を確認できるほか、コンパイルエラーが発生し、それがChatと ",[125,3354,2815],{}," スラッシュ(/) コマンドによって修正される様子もご覧になれます。また、このセッションでは、新しいRustコードのメンテナンス性を向上させるために、エラーハンドリングを追加する方法も紹介されています。",[940,3357,944,3359],{"className":3358},[943],[946,3360,951],{"src":3361,"frameBorder":949,"allowFullScreen":950},"https://www.youtube.com/embed/nf8g2ucqvkI",[108,3363,82],{"id":3364},"perlをpythonにリファクタリング",[12,3366,3367],{},"本番環境サーバーでジョブを実行するスクリプトがありますが、作成者は10年前に退社しており、誰もそのスクリプトに手を付けたがりません。この問題は、複数のスクリプトや、さらにはアプリケーション全体にも影響している可能性があります。そこで、すべてをモダンなPython 3に移行する決定が下されました。ここでは、コードのモダナイゼーションを行い、PerlからPythonへの変更点を理解することを目標とします。",[12,3369,3370],{},"最近、GitLab Duoのワークショップに参加したお客様から、GitLab Duoを使って直接移行が可能かどうかという質問がありました。一言でお答えすれば、「可能」です。これを詳しく説明するならば、この記事にある他の例と同様に、洗練されたChatプロンプトを使用することで、PerlコードをPythonにリファクタリングすることができます。",[12,3372,3373,3376],{},[125,3374,3375],{},"script.pl"," ソースコードをIDEで開き、選択して、Chatを開きます。",[118,3378,3382],{"className":3379,"code":3380,"language":3381,"meta":123,"style":123},"language-perl shiki shiki-themes github-light","#!/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","perl",[125,3383,3384,3389,3397,3404,3408,3443,3447,3455,3462,3469,3473,3485,3490,3515,3520,3527,3532,3548,3565,3570,3574,3578,3611],{"__ignoreMap":123},[128,3385,3386],{"class":130,"line":131},[128,3387,3388],{"class":134},"#!/usr/bin/perl\n",[128,3390,3391,3394],{"class":130,"line":138},[128,3392,3393],{"class":141},"use",[128,3395,3396],{"class":145}," strict;\n",[128,3398,3399,3401],{"class":130,"line":156},[128,3400,3393],{"class":141},[128,3402,3403],{"class":145}," warnings;\n",[128,3405,3406],{"class":130,"line":168},[128,3407,184],{"emptyLinePlaceholder":183},[128,3409,3410,3413,3416,3419,3422,3424,3427,3430,3433,3436,3439,3441],{"class":130,"line":180},[128,3411,3412],{"class":149},"open",[128,3414,3415],{"class":141}," my",[128,3417,3418],{"class":145}," $md_fh, ",[128,3420,3421],{"class":1017},"'\u003C'",[128,3423,1628],{"class":145},[128,3425,3426],{"class":1017},"'file.md'",[128,3428,3429],{"class":141}," or",[128,3431,3432],{"class":141}," die",[128,3434,3435],{"class":1017}," \"Could not open file.md: ",[128,3437,3438],{"class":145},"$!",[128,3440,1279],{"class":1017},[128,3442,153],{"class":145},[128,3444,3445],{"class":130,"line":187},[128,3446,184],{"emptyLinePlaceholder":183},[128,3448,3449,3452],{"class":130,"line":203},[128,3450,3451],{"class":141},"my",[128,3453,3454],{"class":145}," $l = 0;\n",[128,3456,3457,3459],{"class":130,"line":212},[128,3458,3451],{"class":141},[128,3460,3461],{"class":145}," $e = 0;\n",[128,3463,3464,3466],{"class":130,"line":217},[128,3465,3451],{"class":141},[128,3467,3468],{"class":145}," $h = 0;\n",[128,3470,3471],{"class":130,"line":241},[128,3472,184],{"emptyLinePlaceholder":183},[128,3474,3475,3478,3480,3482],{"class":130,"line":262},[128,3476,3477],{"class":141},"while",[128,3479,268],{"class":145},[128,3481,3451],{"class":141},[128,3483,3484],{"class":145}," $line = \u003C$md_fh>) {\n",[128,3486,3487],{"class":130,"line":283},[128,3488,3489],{"class":145},"  $l++;\n",[128,3491,3492,3495,3498,3501,3505,3507,3510,3513],{"class":130,"line":295},[128,3493,3494],{"class":141},"  if",[128,3496,3497],{"class":145}," ($line =~ ",[128,3499,3500],{"class":1017},"/^",[128,3502,3504],{"class":3503},"s691h","\\s",[128,3506,150],{"class":1017},[128,3508,3509],{"class":141},"$",[128,3511,3512],{"class":1017},"/",[128,3514,857],{"class":145},[128,3516,3517],{"class":130,"line":301},[128,3518,3519],{"class":145},"    $e++;\n",[128,3521,3522,3525],{"class":130,"line":307},[128,3523,3524],{"class":141},"    next",[128,3526,153],{"class":145},[128,3528,3529],{"class":130,"line":312},[128,3530,3531],{"class":145},"  }\n",[128,3533,3534,3536,3538,3541,3543,3546],{"class":130,"line":340},[128,3535,3494],{"class":141},[128,3537,3497],{"class":145},[128,3539,3540],{"class":1017},"/^#+",[128,3542,3504],{"class":3503},[128,3544,3545],{"class":1017},"*(.+)/",[128,3547,857],{"class":145},[128,3549,3550,3553,3556,3559,3561,3563],{"class":130,"line":357},[128,3551,3552],{"class":149},"    print",[128,3554,3555],{"class":1017}," \"",[128,3557,3558],{"class":145},"$1",[128,3560,3076],{"class":149},[128,3562,1279],{"class":1017},[128,3564,153],{"class":145},[128,3566,3567],{"class":130,"line":375},[128,3568,3569],{"class":145},"    $h++;   }\n",[128,3571,3572],{"class":130,"line":380},[128,3573,892],{"class":145},[128,3575,3576],{"class":130,"line":385},[128,3577,184],{"emptyLinePlaceholder":183},[128,3579,3580,3583,3585,3587,3590,3592,3594,3597,3599,3602,3605,3607,3609],{"class":130,"line":406},[128,3581,3582],{"class":149},"print",[128,3584,3555],{"class":1017},[128,3586,3076],{"class":149},[128,3588,3589],{"class":1017},"S:",[128,3591,3076],{"class":149},[128,3593,1279],{"class":1017},[128,3595,3596],{"class":145},"; ",[128,3598,3582],{"class":149},[128,3600,3601],{"class":1017}," \"L: ",[128,3603,3604],{"class":145},"$l",[128,3606,3076],{"class":149},[128,3608,1279],{"class":1017},[128,3610,153],{"class":145},[128,3612,3613,3615,3618,3621,3623,3625,3627,3629,3632,3635,3637,3639],{"class":130,"line":419},[128,3614,3582],{"class":149},[128,3616,3617],{"class":1017}," \"E: ",[128,3619,3620],{"class":145},"$e",[128,3622,3076],{"class":149},[128,3624,1279],{"class":1017},[128,3626,3596],{"class":145},[128,3628,3582],{"class":149},[128,3630,3631],{"class":1017}," \"H: ",[128,3633,3634],{"class":145},"$h",[128,3636,3076],{"class":149},[128,3638,1279],{"class":1017},[128,3640,153],{"class":145},[12,3642,3643],{},"次のプロンプトを使用できます：",[897,3645,3646,3654],{},[50,3647,3648,3650,3651,3653],{},[125,3649,904],{}," でその目的を説明させ、 ",[125,3652,2815],{}," でコードを改善させます。",[50,3655,3656,3659],{},[125,3657,3658],{},"/refactor into Python","：実行可能なPythonスクリプトを取得します。",[12,3661,3662],{},[909,3663],{"alt":3664,"src":3665},"Pythonへのリファクタリング","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/pycharm_duo_refactor_perl_python.png",[2790,3667,3668,3677],{},[12,3669,3670,3671,3676],{},"ヒント：Perlコードは、より多くのターゲット言語にリファクタリングできます。",[16,3672,3675],{"href":3673,"rel":3674},"https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-perl-python",[],"GitLab Duo Coffee Chat：チャレンジ - PerlからPythonへのリファクタリング","の録画では、PHP、Ruby、Rust、Go、Java、VB.NET、C#などの言語も取り上げています。",[12,3678,3679,3680,3685],{},"Perlスクリプトの使用を継続するには、Duoのコード提案で",[16,3681,3684],{"href":3682,"rel":3683},"https://docs.gitlab.com/ja-jp/user/project/repository/code_suggestions/supported_extensions/#add-support-for-more-languages",[],"Perlを追加言語として","設定できます。ChatはすでにPerlを理解しており、質問やスラッシュ（/） コマンドのプロンプトにも対応できます。次の録画でこれについて確認できます。",[940,3687,944,3689],{"className":3688},[943],[946,3690,951],{"src":3691,"frameBorder":949,"allowFullScreen":950},"https://www.youtube.com/embed/03HGhxXg9lw",[101,3693,3694],{"id":3694},"その他のリファクタリング実践例",[108,3696,90],{"id":3697},"javascriptのリファクタリング",[12,3699,3700],{},"JavaScriptをリファクタリングしてコード品質を向上させたり、機能を追加したりする方法について、Eddie Jaoudeが実用的な例を交えて紹介しています。",[940,3702,944,3704],{"className":3703},[943],[946,3705,951],{"src":3706,"frameBorder":949,"allowFullScreen":950},"https://www.youtube.com/embed/mHn8KOzpPNY",[108,3708,93],{"id":3709},"bashをzshやshにリファクタリング",[12,3711,3712],{},"筆者はBashをShellとして20年間使用していましたが、最近になってmacOSのZSHに移行しました。この移行に伴い、スクリプトが機能しなくなったり、端末に不明なエラーが発生したりしました。リファクタリングの別のユースケースとして、Shellの制約があります。たとえば、一部のオペレーティングシステムやLinux/Unixディストリビューション（Alpineなど）では、Bashが提供されておらず、SHしか使用できません。",[12,3714,3715],{},[909,3716],{"alt":3717,"src":3718},"シェルスクリプトのリファクタリング","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/intellj_refactor_shell_scripts.png",[12,3720,3721,3726,3727,3729,3730,3732],{},[16,3722,3725],{"href":3723,"rel":3724},"https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-shell-scripts",[],"GitLab Duo Coffee Chat: Challenge - Refactor Shell Scripts ","では、syslogファイルを追跡するCプログラムと、Bashで記述されたビルドスクリプトの例が紹介されています。このチャレンジの中では、コードの改善を目的として、Chatに対して ",[125,3728,904],{}," や ",[125,3731,2815],{}," のプロンプトが使用されます。また、BashをPOSIX準拠のSHやZSHにリファクタリングすることもできます。セッションの最後では、Chatに5つの異なるShellスクリプトの実装を提供させ、そのサマリーについて説明するようリクエストしています。",[940,3734,944,3736],{"className":3735},[943],[946,3737,951],{"src":3738,"frameBorder":949,"allowFullScreen":950},"https://www.youtube.com/embed/mssqYjlKGzU",[108,3740,3741],{"id":3741},"その他のユースケースとチュートリアル",[47,3743,3744,3751,3758],{},[50,3745,3746],{},[16,3747,3750],{"href":3748,"rel":3749},"https://docs.gitlab.com/ja-jp/user/gitlab_duo/use_cases/",[],"ドキュメント：GitLab Duoのユースケース",[50,3752,3753],{},[16,3754,3757],{"href":3755,"rel":3756},"https://about.gitlab.com/blog/top-tips-for-efficient-ai-powered-code-suggestions-with-gitlab-duo/",[],"チュートリアル：AI搭載のGitLab Duoチャットを使用するためのベストプラクティス【10選】",[50,3759,3760],{},[16,3761,3757],{"href":3762,"rel":3763},"https://about.gitlab.com/ja-jp/blog/10-best-practices-for-using-ai-powered-gitlab-duo-chat/",[],[101,3765,99],{"id":99},[897,3767,3768,3771,3774,3777,3780,3783,3786,3789],{},[50,3769,3770],{},"GitLab Duoは、コードの説明やリファクタリングにおいて効率的なサポートを提供します。",[50,3772,3773],{},"言語標準間でコードをリファクタリングしたり、Chatで追加の質問をしたりできます。",[50,3775,3776],{},"コード提案のプロンプトは、特定の言語標準に基づいたコードを生成できます。また、コード補完は現行のコードのコンテキストを尊重します。",[50,3778,3779],{},"新しいプログラミング言語へのリファクタリングは、長期的な移行プロセスやモダナイゼーションの計画に有効です。",[50,3781,3782],{},"コードは、古いシステムがサポートする言語標準に「ダウングレード」することもできます。",[50,3784,3785],{},"GitLab Duoは、複雑なコードやプログラミング言語について、異なるプログラミング言語の例を用いて説明できます。",[50,3787,3788],{},"GitLab.comにおけるAnthropic Claude 3.5へのアップデートにより、コード提案およびChatの質と速度がさらに向上しました（Self-Managed版では17.3へのアップグレードを推奨しています）。",[50,3790,3791],{},"本番環境における問題がある場合を除き、ユースケースはアイデア次第で無限に広がります。",[12,3793,3794],{},"コード提案とChatを活用した効率的なワークフローについて理解を深めましょう。GitLab DuoのAI搭載コードリファクタリングを、今すぐお試しいただけます。",[2790,3796,3797],{},[12,3798,3799],{},[16,3800,3803],{"href":3801,"rel":3802},"https://about.gitlab.com/ja-jp/sales/?type=free-trial&toggle=gitlab-duo-pro_",[],"GitLab Duoのの無料トライアルを開始しましょう！",[12,3805,3806,951,3815,3818],{},[3807,3808,3809,3810],"em",{},"監修：知念 梨果 ",[16,3811,3814],{"href":3812,"rel":3813},"https://gitlab.com/rikachinen",[],"@rikachinen",[3816,3817],"br",{},[3807,3819,3820],{},"（GitLab合同会社 カスタマーサクセス本部 カスタマーサクセスエンジニア）",[3822,3823,3824],"style",{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .s691h, html code.shiki .s691h{--shiki-default:#22863A;--shiki-default-font-weight:bold}",{"title":123,"searchDepth":138,"depth":138,"links":3826},[3827,3832,3836,3841],{"id":103,"depth":138,"text":103,"children":3828},[3829,3830,3831],{"id":110,"depth":156,"text":57},{"id":963,"depth":156,"text":964},{"id":2708,"depth":156,"text":71},{"id":2877,"depth":138,"text":2877,"children":3833},[3834,3835],{"id":2883,"depth":156,"text":79},{"id":3364,"depth":156,"text":82},{"id":3694,"depth":138,"text":3694,"children":3837},[3838,3839,3840],{"id":3697,"depth":156,"text":90},{"id":3709,"depth":156,"text":93},{"id":3741,"depth":156,"text":3741},{"id":99,"depth":138,"text":99},"ai","2024-08-26","この詳細なチュートリアルでは、デベロッパーがAIを活用し、コードを新しいプログラミング言語に移行してモダナイゼーションを進めるプロセスや、同じ言語における新機能についても学べる内容を紹介しています。","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662465/Blog/Hero%20Images/GitLab_Duo_Workflow_Unified_Data_Store__1_.png",{},"/ja-jp/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo",{"title":5,"description":3844,"ogTitle":5,"ogDescription":3844,"noIndex":3847,"ogImage":3848,"ogUrl":3852,"ogSiteName":3853,"ogType":3854,"canonicalUrls":3852},"https://about.gitlab.com/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo","https://about.gitlab.com","article","refactor-code-into-modern-languages-with-ai-powered-gitlab-duo","ja-jp/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo",[3858,3859,3860],"AI","tutorial","DevSecOps","BlogPost","2025-02-10","yG5FQr5zVtPd_6tUobqDarklaL1a8RSqW7w0IlE6RXc",{"logo":3865,"freeTrial":3870,"sales":3875,"login":3880,"items":3885,"search":4214,"minimal":4247,"duo":4264,"switchNav":4273,"pricingDeployment":4284},{"config":3866},{"href":3867,"dataGaName":3868,"dataGaLocation":3869},"/ja-jp/","gitlab logo","header",{"text":3871,"config":3872},"無料トライアルを開始",{"href":3873,"dataGaName":3874,"dataGaLocation":3869},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp&glm_content=default-saas-trial/","free trial",{"text":3876,"config":3877},"デモをリクエスト",{"href":3878,"dataGaName":3879,"dataGaLocation":3869},"/ja-jp/sales/?contact-topic=request-demo","sales",{"text":3881,"config":3882},"サインイン",{"href":3883,"dataGaName":3884,"dataGaLocation":3869},"https://gitlab.com/users/sign_in/","sign in",[3886,3915,4017,4022,4136,4192],{"text":3887,"config":3888,"menu":3890},"プラットフォーム",{"dataNavLevelOne":3889},"platform",{"type":3891,"columns":3892},"cards",[3893,3899,3907],{"title":3887,"description":3894,"link":3895},"DevSecOpsに特化したインテリジェントオーケストレーションプラットフォーム",{"text":3896,"config":3897},"プラットフォームの詳細はこちら",{"href":3898,"dataGaName":3889,"dataGaLocation":3869},"/ja-jp/platform/",{"title":3900,"description":3901,"link":3902},"GitLab Duo Agent Platform","ソフトウェアライフサイクル全体を支えるエージェント型AI",{"text":3903,"config":3904},"GitLab Duoのご紹介",{"href":3905,"dataGaName":3906,"dataGaLocation":3869},"/ja-jp/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":3908,"description":3909,"link":3910},"GitLabが選ばれる理由","エンタープライズがGitLabを選ぶ主な理由をご覧ください",{"text":3911,"config":3912},"詳細はこちら",{"href":3913,"dataGaName":3914,"dataGaLocation":3869},"/ja-jp/why-gitlab/","why gitlab",{"text":3916,"left":183,"config":3917,"menu":3919},"製品",{"dataNavLevelOne":3918},"solutions",{"type":3920,"link":3921,"columns":3925,"feature":3996},"lists",{"text":3922,"config":3923},"すべてのソリューションを表示",{"href":3924,"dataGaName":3918,"dataGaLocation":3869},"/ja-jp/solutions/",[3926,3951,3974],{"title":3927,"description":3928,"link":3929,"items":3934},"自動化","CI/CDと自動化でデプロイを加速",{"config":3930},{"icon":3931,"href":3932,"dataGaName":3933,"dataGaLocation":3869},"AutomatedCodeAlt","/ja-jp/solutions/delivery-automation/","automated software delivery",[3935,3939,3942,3947],{"text":3936,"config":3937},"CI/CD",{"href":3938,"dataGaLocation":3869,"dataGaName":3936},"/ja-jp/solutions/continuous-integration/",{"text":3900,"config":3940},{"href":3905,"dataGaLocation":3869,"dataGaName":3941},"gitlab duo agent platform - product menu",{"text":3943,"config":3944},"ソースコード管理",{"href":3945,"dataGaLocation":3869,"dataGaName":3946},"/ja-jp/solutions/source-code-management/","Source Code Management",{"text":3948,"config":3949},"自動化されたソフトウェアデリバリー",{"href":3932,"dataGaLocation":3869,"dataGaName":3950},"Automated software delivery",{"title":3952,"description":3953,"link":3954,"items":3959},"セキュリティ","セキュリティを犠牲にすることなくコード作成を高速化",{"config":3955},{"href":3956,"dataGaName":3957,"dataGaLocation":3869,"icon":3958},"/ja-jp/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[3960,3964,3969],{"text":3961,"config":3962},"アプリケーションセキュリティテスト",{"href":3956,"dataGaName":3963,"dataGaLocation":3869},"Application security testing",{"text":3965,"config":3966},"ソフトウェアサプライチェーンセキュリティ",{"href":3967,"dataGaLocation":3869,"dataGaName":3968},"/ja-jp/solutions/supply-chain/","Software supply chain security",{"text":3970,"config":3971},"ソフトウェアコンプライアンス",{"href":3972,"dataGaName":3973,"dataGaLocation":3869},"/ja-jp/solutions/software-compliance/","software compliance",{"title":3975,"link":3976,"items":3981},"測定",{"config":3977},{"icon":3978,"href":3979,"dataGaName":3980,"dataGaLocation":3869},"DigitalTransformation","/ja-jp/solutions/visibility-measurement/","visibility and measurement",[3982,3986,3991],{"text":3983,"config":3984},"可視性と測定",{"href":3979,"dataGaLocation":3869,"dataGaName":3985},"Visibility and Measurement",{"text":3987,"config":3988},"バリューストリーム管理",{"href":3989,"dataGaLocation":3869,"dataGaName":3990},"/ja-jp/solutions/value-stream-management/","Value Stream Management",{"text":3992,"config":3993},"分析とインサイト",{"href":3994,"dataGaLocation":3869,"dataGaName":3995},"/ja-jp/solutions/analytics-and-insights/","Analytics and insights",{"title":3997,"type":3920,"items":3998},"GitLabが活躍する場所",[3999,4005,4011],{"text":4000,"config":4001},"大企業",{"icon":4002,"href":4003,"dataGaLocation":3869,"dataGaName":4004},"Building","/ja-jp/enterprise/","enterprise",{"text":4006,"config":4007},"スモールビジネス",{"icon":4008,"href":4009,"dataGaLocation":3869,"dataGaName":4010},"Work","/ja-jp/small-business/","small business",{"text":4012,"config":4013},"公共部門",{"icon":4014,"href":4015,"dataGaLocation":3869,"dataGaName":4016},"Organization","/ja-jp/solutions/public-sector/","public sector",{"text":4018,"config":4019},"価格",{"href":4020,"dataGaName":4021,"dataGaLocation":3869,"dataNavLevelOne":4021},"/ja-jp/pricing/","pricing",{"text":4023,"config":4024,"menu":4026},"関連リソース",{"dataNavLevelOne":4025},"resources",{"type":3920,"link":4027,"columns":4031,"feature":4125},{"text":4028,"config":4029},"すべてのリソースを表示",{"href":4030,"dataGaName":4025,"dataGaLocation":3869},"/ja-jp/resources/",[4032,4065,4092],{"title":4033,"items":4034},"はじめに",[4035,4040,4045,4050,4055,4060],{"text":4036,"config":4037},"インストール",{"href":4038,"dataGaName":4039,"dataGaLocation":3869},"/ja-jp/install/","install",{"text":4041,"config":4042},"クイックスタートガイド",{"href":4043,"dataGaName":4044,"dataGaLocation":3869},"/ja-jp/get-started/","quick setup checklists",{"text":4046,"config":4047},"学ぶ",{"href":4048,"dataGaLocation":3869,"dataGaName":4049},"https://university.gitlab.com/","learn",{"text":4051,"config":4052},"製品ドキュメント",{"href":4053,"dataGaName":4054,"dataGaLocation":3869},"https://docs.gitlab.com/ja-jp/","product documentation",{"text":4056,"config":4057},"ベストプラクティスビデオ",{"href":4058,"dataGaName":4059,"dataGaLocation":3869},"/ja-jp/getting-started-videos/","best practice videos",{"text":4061,"config":4062},"インテグレーション",{"href":4063,"dataGaName":4064,"dataGaLocation":3869},"/ja-jp/integrations/","integrations",{"title":4066,"items":4067},"検索する",[4068,4073,4078,4083,4087],{"text":4069,"config":4070},"お客様成功事例",{"href":4071,"dataGaName":4072,"dataGaLocation":3869},"/ja-jp/customers/","customer success stories",{"text":4074,"config":4075},"ブログ",{"href":4076,"dataGaName":4077,"dataGaLocation":3869},"/ja-jp/blog/","blog",{"text":4079,"config":4080},"Demo Hub",{"href":4081,"dataGaName":4082,"dataGaLocation":3869},"/ja-jp/demo-hub/","demo hub",{"text":4084,"config":4085},"The Source",{"href":4086,"dataGaName":4077,"dataGaLocation":3869},"/ja-jp/the-source/",{"text":4088,"config":4089},"リモート",{"href":4090,"dataGaName":4091,"dataGaLocation":3869},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":4093,"items":4094},"つなげる",[4095,4100,4105,4110,4115,4120],{"text":4096,"config":4097},"GitLabサービス",{"href":4098,"dataGaName":4099,"dataGaLocation":3869},"/ja-jp/services/","services",{"text":4101,"config":4102},"コントリビュート",{"href":4103,"dataGaName":4104,"dataGaLocation":3869},"https://contributors.gitlab.com","contribute",{"text":4106,"config":4107},"コミュニティ",{"href":4108,"dataGaName":4109,"dataGaLocation":3869},"/community/","community",{"text":4111,"config":4112},"フォーラム",{"href":4113,"dataGaName":4114,"dataGaLocation":3869},"https://forum.gitlab.com/","forum",{"text":4116,"config":4117},"イベント",{"href":4118,"dataGaName":4119,"dataGaLocation":3869},"/events/","events",{"text":4121,"config":4122},"パートナー",{"href":4123,"dataGaName":4124,"dataGaLocation":3869},"/ja-jp/partners/","partners",{"config":4126,"title":4129,"text":4130,"link":4131},{"background":4127,"textColor":4128},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","GitLabの最新情報","最新の機能と改善点に関する情報をお届けします。",{"text":4132,"config":4133},"最新情報を読む",{"href":4134,"dataGaName":4135,"dataGaLocation":3869},"/ja-jp/whats-new/","whats new",{"text":4137,"config":4138,"menu":4140},"企業情報",{"dataNavLevelOne":4139},"company",{"type":3920,"columns":4141},[4142],{"items":4143},[4144,4149,4155,4157,4162,4167,4172,4177,4182,4187],{"text":4145,"config":4146},"GitLabについて",{"href":4147,"dataGaName":4148,"dataGaLocation":3869},"/ja-jp/company/","about",{"text":4150,"config":4151,"footerGa":4154},"採用情報",{"href":4152,"dataGaName":4153,"dataGaLocation":3869},"/jobs/","jobs",{"dataGaName":4153},{"text":4116,"config":4156},{"href":4118,"dataGaName":4119,"dataGaLocation":3869},{"text":4158,"config":4159},"経営陣",{"href":4160,"dataGaName":4161,"dataGaLocation":3869},"/company/team/e-group/","leadership",{"text":4163,"config":4164},"ハンドブック",{"href":4165,"dataGaName":4166,"dataGaLocation":3869},"https://handbook.gitlab.com/","handbook",{"text":4168,"config":4169},"投資家向け情報",{"href":4170,"dataGaName":4171,"dataGaLocation":3869},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":4173,"config":4174},"トラストセンター",{"href":4175,"dataGaName":4176,"dataGaLocation":3869},"/ja-jp/security/","trust center",{"text":4178,"config":4179},"AI Transparency Center",{"href":4180,"dataGaName":4181,"dataGaLocation":3869},"/ja-jp/ai-transparency-center/","ai transparency center",{"text":4183,"config":4184},"ニュースレター",{"href":4185,"dataGaName":4186,"dataGaLocation":3869},"/company/contact/#contact-forms","newsletter",{"text":4188,"config":4189},"プレス",{"href":4190,"dataGaName":4191,"dataGaLocation":3869},"/press/","press",{"text":4193,"config":4194,"menu":4195},"お問い合わせ",{"dataNavLevelOne":4139},{"type":3920,"columns":4196},[4197],{"items":4198},[4199,4204,4209],{"text":4200,"config":4201},"お問い合わせはこちら",{"href":4202,"dataGaName":4203,"dataGaLocation":3869},"/ja-jp/sales/","talk to sales",{"text":4205,"config":4206},"サポートを受ける",{"href":4207,"dataGaName":4208,"dataGaLocation":3869},"https://support.gitlab.com/hc/en-us","support portal",{"text":4210,"config":4211},"カスタマーポータル",{"href":4212,"dataGaName":4213,"dataGaLocation":3869},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":4215,"login":4216,"suggestions":4223},"閉じる",{"text":4217,"link":4218},"リポジトリとプロジェクトを検索するには、次にログインします",{"text":4219,"config":4220},"GitLab.com",{"href":3883,"dataGaName":4221,"dataGaLocation":4222},"search login","search",{"text":4224,"default":4225},"提案",[4226,4228,4233,4235,4239,4243],{"text":3900,"config":4227},{"href":3905,"dataGaName":3900,"dataGaLocation":4222},{"text":4229,"config":4230},"コード提案（AI）",{"href":4231,"dataGaName":4232,"dataGaLocation":4222},"/ja-jp/solutions/code-suggestions/","Code Suggestions (AI)",{"text":3936,"config":4234},{"href":3938,"dataGaName":3936,"dataGaLocation":4222},{"text":4236,"config":4237},"GitLab on AWS",{"href":4238,"dataGaName":4236,"dataGaLocation":4222},"/ja-jp/partners/technology-partners/aws/",{"text":4240,"config":4241},"GitLab on Google Cloud",{"href":4242,"dataGaName":4240,"dataGaLocation":4222},"/ja-jp/partners/technology-partners/google-cloud-platform/",{"text":4244,"config":4245},"GitLabを選ぶ理由",{"href":3913,"dataGaName":4246,"dataGaLocation":4222},"Why GitLab?",{"freeTrial":4248,"mobileIcon":4252,"desktopIcon":4257,"secondaryButton":4260},{"text":3871,"config":4249},{"href":4250,"dataGaName":3874,"dataGaLocation":4251},"https://gitlab.com/-/trials/new/","nav",{"altText":4253,"config":4254},"GitLabアイコン",{"src":4255,"dataGaName":4256,"dataGaLocation":4251},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":4253,"config":4258},{"src":4259,"dataGaName":4256,"dataGaLocation":4251},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":4033,"config":4261},{"href":4262,"dataGaName":4263,"dataGaLocation":4251},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp/get-started/","get started",{"freeTrial":4265,"mobileIcon":4269,"desktopIcon":4271},{"text":4266,"config":4267},"GitLab Duoの詳細について",{"href":3905,"dataGaName":4268,"dataGaLocation":4251},"gitlab duo",{"altText":4253,"config":4270},{"src":4255,"dataGaName":4256,"dataGaLocation":4251},{"altText":4253,"config":4272},{"src":4259,"dataGaName":4256,"dataGaLocation":4251},{"button":4274,"mobileIcon":4279,"desktopIcon":4281},{"text":4275,"config":4276},"/switch",{"href":4277,"dataGaName":4278,"dataGaLocation":4251},"#contact","switch",{"altText":4253,"config":4280},{"src":4255,"dataGaName":4256,"dataGaLocation":4251},{"altText":4253,"config":4282},{"src":4283,"dataGaName":4256,"dataGaLocation":4251},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":4285,"mobileIcon":4290,"desktopIcon":4292},{"text":4286,"config":4287},"料金ページに戻る",{"href":4020,"dataGaName":4288,"dataGaLocation":4251,"icon":4289},"back to pricing","GoBack",{"altText":4253,"config":4291},{"src":4255,"dataGaName":4256,"dataGaLocation":4251},{"altText":4253,"config":4293},{"src":4259,"dataGaName":4256,"dataGaLocation":4251},{"title":4295,"button":4296,"config":4300},"GitLab Orbitが登場: AIエージェントのためのコンテキストレイヤー",{"text":3911,"config":4297},{"href":4298,"dataGaName":4299,"dataGaLocation":3869},"/ja-jp/gitlab-orbit/","orbit",{"layout":4301,"disabled":3847},"release",{"data":4303},{"text":4304,"source":4305,"edit":4311,"contribute":4316,"config":4321,"items":4326,"minimal":4534},"GitはSoftware Freedom Conservancyの商標です。当社は「GitLab」をライセンスに基づいて使用しています",{"text":4306,"config":4307},"ページのソースを表示",{"href":4308,"dataGaName":4309,"dataGaLocation":4310},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":4312,"config":4313},"このページを編集",{"href":4314,"dataGaName":4315,"dataGaLocation":4310},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":4317,"config":4318},"ご協力をお願いします",{"href":4319,"dataGaName":4320,"dataGaLocation":4310},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":4322,"facebook":4323,"youtube":4324,"linkedin":4325},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[4327,4372,4424,4467,4501],{"title":4018,"links":4328,"subMenu":4343},[4329,4333,4338],{"text":4330,"config":4331},"プランの表示",{"href":4020,"dataGaName":4332,"dataGaLocation":4310},"view plans",{"text":4334,"config":4335},"Premiumを選ぶ理由",{"href":4336,"dataGaName":4337,"dataGaLocation":4310},"/ja-jp/pricing/premium/","why premium",{"text":4339,"config":4340},"Ultimateを選ぶ理由",{"href":4341,"dataGaName":4342,"dataGaLocation":4310},"/ja-jp/pricing/ultimate/","why ultimate",[4344],{"title":4193,"links":4345},[4346,4348,4350,4352,4357,4362,4367],{"text":4193,"config":4347},{"href":4202,"dataGaName":3879,"dataGaLocation":4310},{"text":4205,"config":4349},{"href":4207,"dataGaName":4208,"dataGaLocation":4310},{"text":4210,"config":4351},{"href":4212,"dataGaName":4213,"dataGaLocation":4310},{"text":4353,"config":4354},"ステータス",{"href":4355,"dataGaName":4356,"dataGaLocation":4310},"https://status.gitlab.com/","status",{"text":4358,"config":4359},"利用規約",{"href":4360,"dataGaName":4361,"dataGaLocation":4310},"/terms/","terms of use",{"text":4363,"config":4364},"プライバシーに関する声明",{"href":4365,"dataGaName":4366,"dataGaLocation":4310},"/ja-jp/privacy/","privacy statement",{"text":4368,"config":4369},"Cookie 優先設定",{"dataGaName":4370,"dataGaLocation":4310,"id":4371,"isOneTrustButton":183},"cookie preferences","ot-sdk-btn",{"title":3916,"links":4373,"subMenu":4382},[4374,4378],{"text":4375,"config":4376},"DevSecOpsプラットフォーム",{"href":3898,"dataGaName":4377,"dataGaLocation":4310},"devsecops platform",{"text":4379,"config":4380},"AI支援開発",{"href":3905,"dataGaName":4381,"dataGaLocation":4310},"ai-assisted development",[4383],{"title":4384,"links":4385},"トピック",[4386,4390,4395,4400,4405,4409,4414,4419],{"text":3936,"config":4387},{"href":4388,"dataGaName":4389,"dataGaLocation":4310},"/ja-jp/topics/ci-cd/","cicd",{"text":4391,"config":4392},"GitOps",{"href":4393,"dataGaName":4394,"dataGaLocation":4310},"/ja-jp/topics/gitops/","gitops",{"text":4396,"config":4397},"DevOps",{"href":4398,"dataGaName":4399,"dataGaLocation":4310},"/ja-jp/topics/devops/","devops",{"text":4401,"config":4402},"バージョン管理",{"href":4403,"dataGaName":4404,"dataGaLocation":4310},"/ja-jp/topics/version-control/","version control",{"text":3860,"config":4406},{"href":4407,"dataGaName":4408,"dataGaLocation":4310},"/ja-jp/topics/devsecops/","devsecops",{"text":4410,"config":4411},"クラウドネイティブ",{"href":4412,"dataGaName":4413,"dataGaLocation":4310},"/ja-jp/topics/cloud-native/","cloud native",{"text":4415,"config":4416},"コーディングのためのAI",{"href":4417,"dataGaName":4418,"dataGaLocation":4310},"/ja-jp/topics/devops/ai-for-coding/","ai for coding",{"text":4420,"config":4421},"エージェント型AI",{"href":4422,"dataGaName":4423,"dataGaLocation":4310},"/ja-jp/topics/agentic-ai/","agentic ai",{"title":4425,"links":4426},"ソリューション",[4427,4430,4432,4437,4441,4444,4447,4450,4452,4454,4457,4462],{"text":3961,"config":4428},{"href":3956,"dataGaName":4429,"dataGaLocation":4310},"Application Security Testing",{"text":3948,"config":4431},{"href":3932,"dataGaName":3933,"dataGaLocation":4310},{"text":4433,"config":4434},"アジャイル開発",{"href":4435,"dataGaName":4436,"dataGaLocation":4310},"/ja-jp/solutions/agile-delivery/","agile delivery",{"text":4438,"config":4439},"SCM",{"href":3945,"dataGaName":4440,"dataGaLocation":4310},"source code management",{"text":3936,"config":4442},{"href":3938,"dataGaName":4443,"dataGaLocation":4310},"continuous integration & delivery",{"text":3987,"config":4445},{"href":3989,"dataGaName":4446,"dataGaLocation":4310},"value stream management",{"text":4391,"config":4448},{"href":4449,"dataGaName":4394,"dataGaLocation":4310},"/ja-jp/solutions/gitops/",{"text":4000,"config":4451},{"href":4003,"dataGaName":4004,"dataGaLocation":4310},{"text":4006,"config":4453},{"href":4009,"dataGaName":4010,"dataGaLocation":4310},{"text":4455,"config":4456},"公共機関",{"href":4015,"dataGaName":4016,"dataGaLocation":4310},{"text":4458,"config":4459},"教育",{"href":4460,"dataGaName":4461,"dataGaLocation":4310},"/ja-jp/solutions/education/","education",{"text":4463,"config":4464},"金融サービス",{"href":4465,"dataGaName":4466,"dataGaLocation":4310},"/ja-jp/solutions/finance/","financial services",{"title":4468,"links":4469},"リソース",[4470,4472,4474,4476,4480,4482,4485,4487,4489,4491,4493,4495,4497,4499],{"text":4036,"config":4471},{"href":4038,"dataGaName":4039,"dataGaLocation":4310},{"text":4041,"config":4473},{"href":4043,"dataGaName":4044,"dataGaLocation":4310},{"text":4046,"config":4475},{"href":4048,"dataGaName":4049,"dataGaLocation":4310},{"text":4051,"config":4477},{"href":4478,"dataGaName":4479,"dataGaLocation":4310},"https://docs.gitlab.com/ja-jp","docs",{"text":4074,"config":4481},{"href":4076,"dataGaName":4077,"dataGaLocation":4310},{"text":4483,"config":4484},"最新リリース",{"href":4134,"dataGaName":4135,"dataGaLocation":4310},{"text":4069,"config":4486},{"href":4071,"dataGaName":4072,"dataGaLocation":4310},{"text":4088,"config":4488},{"href":4090,"dataGaName":4091,"dataGaLocation":4310},{"text":4096,"config":4490},{"href":4098,"dataGaName":4099,"dataGaLocation":4310},{"text":4101,"config":4492},{"href":4103,"dataGaName":4104,"dataGaLocation":4310},{"text":4106,"config":4494},{"href":4108,"dataGaName":4109,"dataGaLocation":4310},{"text":4111,"config":4496},{"href":4113,"dataGaName":4114,"dataGaLocation":4310},{"text":4116,"config":4498},{"href":4118,"dataGaName":4119,"dataGaLocation":4310},{"text":4121,"config":4500},{"href":4123,"dataGaName":4124,"dataGaLocation":4310},{"title":4502,"links":4503},"会社情報",[4504,4506,4508,4510,4512,4514,4518,4523,4525,4527,4529],{"text":4145,"config":4505},{"href":4147,"dataGaName":4139,"dataGaLocation":4310},{"text":4150,"config":4507},{"href":4152,"dataGaName":4153,"dataGaLocation":4310},{"text":4158,"config":4509},{"href":4160,"dataGaName":4161,"dataGaLocation":4310},{"text":4163,"config":4511},{"href":4165,"dataGaName":4166,"dataGaLocation":4310},{"text":4168,"config":4513},{"href":4170,"dataGaName":4171,"dataGaLocation":4310},{"text":4515,"config":4516},"Sustainability",{"href":4517,"dataGaName":4515,"dataGaLocation":4310},"/sustainability/",{"text":4519,"config":4520},"ダイバーシティ、インクルージョン、ビロンギング（DIB）",{"href":4521,"dataGaName":4522,"dataGaLocation":4310},"/ja-jp/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":4173,"config":4524},{"href":4175,"dataGaName":4176,"dataGaLocation":4310},{"text":4183,"config":4526},{"href":4185,"dataGaName":4186,"dataGaLocation":4310},{"text":4188,"config":4528},{"href":4190,"dataGaName":4191,"dataGaLocation":4310},{"text":4530,"config":4531},"現代奴隷制の透明性に関する声明",{"href":4532,"dataGaName":4533,"dataGaLocation":4310},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":4535},[4536,4538,4541],{"text":4358,"config":4537},{"href":4360,"dataGaName":4361,"dataGaLocation":4310},{"text":4539,"config":4540},"Cookieの設定",{"dataGaName":4370,"dataGaLocation":4310,"id":4371,"isOneTrustButton":183},{"text":4363,"config":4542},{"href":4365,"dataGaName":4366,"dataGaLocation":4310},[4544],{"id":4545,"title":7,"body":3846,"config":4546,"content":4548,"description":3846,"extension":4552,"meta":4553,"navigation":183,"path":4554,"seo":4555,"stem":4556,"__hash__":4557},"blogAuthors/en-us/blog/authors/michael-friedrich.yml",{"template":4547},"BlogAuthor",{"name":7,"config":4549},{"headshot":4550,"ctfId":4551},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659879/Blog/Author%20Headshots/dnsmichi-headshot.jpg","dnsmichi","yml",{},"/en-us/blog/authors/michael-friedrich",{},"en-us/blog/authors/michael-friedrich","lJ-nfRIhdG49Arfrxdn1Vv4UppwD51BB13S3HwIswt4",[4559,4567,4574],{"title":4560,"description":4561,"heroImage":4562,"category":3842,"date":4563,"authors":4564,"slug":4566,"externalUrl":3846},"Loop Engineeringの実践方法：GitLab × Claude Codeでの実装例","GitLabとClaude Codeで実践するLoop Engineeringの実装例をご紹介。AIエージェントを自律稼働させるcron起動・Skills活用・ラベルベースのフローと、必須のガードレール設計を解説します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1785215335/oevhcbrbev1zyfubdfxz.jpg","2026-07-31",[4565],"Issei Hamada, Sony Biz Networks Corporation","loop-engineering-gitlab-claude-code",{"title":4568,"description":4569,"heroImage":4570,"category":3842,"date":4563,"authors":4571,"slug":4573,"externalUrl":3846},"エージェント型AI、MCP、AIコードアシスタントを統制する方法","AIエージェントは、各ステップで人によるレビューを介さずに、コードの記述、プッシュ、デプロイを行うことができます。アクセス、権限、監査証跡を統制する実践的なフレームワークを解説します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1785337625/ifzlc2hyzaxhzmjgyymh.png",[4572],"Julie Griffin","govern-agentic-ai-mcps-code-assistants",{"title":4575,"description":4576,"heroImage":4577,"category":3842,"date":4578,"authors":4579,"slug":4581,"externalUrl":3846},"Claude Opus 5、GitLabで最難関タスクに挑む","AnthropicのClaude Opus 5がGitLab Duo Agent Platformで利用可能になりました。速度を犠牲にすることなく、より深い推論力を提供します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099203/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%2820%29_2bJGC5ZP3WheoqzlLT05C5_1750099203484.png","2026-07-27",[4580],"Brittany Lutz","claude-opus-5-on-gitlab-duo-agent-platform",{"promotions":4583},[4584,4597,4609,4621],{"id":4585,"categories":4586,"header":4587,"text":4588,"button":4589,"image":4594},"ai-modernization",[3842],"AIの真価、組織全体で発揮できていますか？","所要時間は5分以内です",{"text":4590,"config":4591},"AI成熟度スコアを確認する",{"href":4592,"dataGaName":4593,"dataGaLocation":4077},"/ja-jp/assessments/ai-modernization-assessment/","modernization assessment",{"config":4595},{"src":4596},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":4598,"categories":4599,"header":4601,"text":4588,"button":4602,"image":4606},"devops-modernization",[4600,4408],"product","単にツールを管理するだけでなく、イノベーションを提供していますか？",{"text":4603,"config":4604},"DevOps成熟度スコアを確認しましょう",{"href":4605,"dataGaName":4593,"dataGaLocation":4077},"/ja-jp/assessments/devops-modernization-assessment/",{"config":4607},{"src":4608},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":4610,"categories":4611,"header":4613,"text":4588,"button":4614,"image":4618},"security-modernization",[4612],"security","スピードのためにセキュリティを犠牲にしていませんか？",{"text":4615,"config":4616},"セキュリティ成熟度スコアを確認しましょう",{"href":4617,"dataGaName":4593,"dataGaLocation":4077},"/ja-jp/assessments/security-modernization-assessment/",{"config":4619},{"src":4620},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":4622,"paths":4623,"header":4626,"text":4627,"button":4628,"image":4633},"github-azure-migration",[4624,4625],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","チームはGitHubのAzure移行に対応できていますか？","GitHubはすでにAzureを基盤として再構築を進めています。それがあなたのチームにとって何を意味するのか、ご確認ください。",{"text":4629,"config":4630},"GitLabとGitHubの比較を見る",{"href":4631,"dataGaName":4632,"dataGaLocation":4077},"/ja-jp/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":4634},{"src":4608},{"header":4636,"blurb":4637,"button":4638,"secondaryButton":4642},"今すぐ開発をスピードアップ","DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。\n",{"text":3871,"config":4639},{"href":4640,"dataGaName":3874,"dataGaLocation":4641},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/ja-jp/","feature",{"text":4193,"config":4643},{"href":4202,"dataGaName":3879,"dataGaLocation":4641},1786803771047]