{"id":6995,"date":"2023-11-10T16:48:55","date_gmt":"2023-11-10T07:48:55","guid":{"rendered":"https:\/\/engineering.webstudio168.jp\/?p=6995"},"modified":"2023-11-13T01:22:53","modified_gmt":"2023-11-12T16:22:53","slug":"diff-tool","status":"publish","type":"post","link":"https:\/\/engineering.webstudio168.jp\/blog\/diff-tool\/","title":{"rendered":"\u3010\u7c21\u6613\u753b\u50cf\u30ad\u30e3\u30d7\u30c1\u30e3\u6a5f\u80fd\u4ed8\u304d\u3011\u30c6\u30ad\u30b9\u30c8\u3092\u6bd4\u8f03\u3057\u3066\u5dee\u5206\u3092\u8868\u793a\u3059\u308bdiff\u30c4\u30fc\u30eb\u3010JavaScript\u3067Web\u30c4\u30fc\u30eb\u3011"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_88 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u76ee\u6b21<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/engineering.webstudio168.jp\/blog\/diff-tool\/#%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E6%AF%94%E8%BC%83%EF%BC%88Diff%EF%BC%89%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\" >\u30c6\u30ad\u30b9\u30c8\u6bd4\u8f03\uff08Diff\uff09\u306b\u3064\u3044\u3066<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/engineering.webstudio168.jp\/blog\/diff-tool\/#%E7%B0%A1%E6%98%93%E7%94%BB%E5%83%8F%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3%E6%A9%9F%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\" >\u7c21\u6613\u753b\u50cf\u30ad\u30e3\u30d7\u30c1\u30e3\u6a5f\u80fd\u306b\u3064\u3044\u3066<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/engineering.webstudio168.jp\/blog\/diff-tool\/#%E7%89%B9%E9%95%B7\" >\u7279\u9577<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/engineering.webstudio168.jp\/blog\/diff-tool\/#%E6%9B%B4%E6%96%B0%E5%B1%A5%E6%AD%B4\" >\u66f4\u65b0\u5c65\u6b74<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/engineering.webstudio168.jp\/blog\/diff-tool\/#%E3%83%90%E3%82%B0%E5%A0%B1%E5%91%8A%E3%83%BB%E6%A9%9F%E8%83%BD%E3%81%AE%E8%BF%BD%E5%8A%A0%E4%BE%9D%E9%A0%BC%E3%81%AA%E3%81%A9%E3%81%AF%E6%98%AF%E9%9D%9E%E3%81%8A%E5%95%8F%E5%90%88%E3%81%9B%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84\" >\u30d0\u30b0\u5831\u544a\u30fb\u6a5f\u80fd\u306e\u8ffd\u52a0\u4f9d\u983c\u306a\u3069\u306f\u662f\u975e\u304a\u554f\u5408\u305b\u304f\u3060\u3055\u3044<\/a><\/li><\/ul><\/nav><\/div>\n\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/diff_match_patch\/20121119\/diff_match_patch.js\"\n    integrity=\"sha512-5YZxUisfaneUbwv58nPp10qwt6DefHuJ+iAfvPoABZAYwLg4WGJHITaLpyyxJdrljfc0ggUoWc87Z0lfoDS84Q==\"\n    crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"><\/script>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/html2canvas\/1.4.1\/html2canvas.min.js\"\n    integrity=\"sha512-BNaRQnYJYiPSqHHDb58B0yaPfCu+Wgds8Gp\/gU33kqBtgNS4tSPHuGibyoeqMV\/TJlSKda6FXzoEyYGjTe+vXA==\"\n    crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"><\/script>\n<style>\n    #text-container {\n        display: flex;\n        justify-content: space-between;\n    }\n\n    #text-container span {\n        background-color: #ccc;\n    }\n\n    .input-container {\n        display: flex;\n        justify-content: space-between;\n    }\n\n    .input-container textarea {\n        width: 45%;\n        height: 50vh;\n        margin: 0 2%;\n        padding: 5px;\n        border: 1px solid #ccc;\n        white-space: pre-wrap;\n    }\n\n    .text-output {\n        width: 45%;\n        margin: 0 2%;\n        padding: 5px;\n        border: 1px solid #ccc;\n        white-space: pre-wrap;\n    }\n\n    .highlight {\n        background-color: #ffff99;\n    }\n\n    .compute-button {\n        text-align: center;\n    }\n\n    .compute-button button {\n        padding: 0.5rem;\n        cursor: pointer;\n    }\n\n    #captureDiffButton {\n        text-align: center;\n        display: none;\n        position: relative;\n    }\n\n    #captureDiffButton button {\n        padding: 0.5rem;\n        cursor: pointer;\n    }\n\n    @media screen and (max-width: 800px) {\n\n        .compute-button button,\n        #captureDiffButton button {\n            font-size: 100%;\n        }\n    }\n\n    #okCapture {\n        display: none;\n        position: absolute;\n        background-color: #d90368;\n        color: #FFF;\n        bottom: 1rem;\n        right: 50%;\n        padding: 0.5em;\n        border-radius: 0.5rem;\n        transform: translateX(50%);\n        width: max-content;\n    }\n\n    #okCapture.show {\n        display: block;\n    }\n<\/style>\n\n<div class=\"input-container\">\n    <textarea id=\"text1\" placeholder=\"Original text\"><\/textarea>\n    <textarea id=\"text2\" placeholder=\"Changed text\"><\/textarea>\n<\/div>\n<div class=\"compute-button\">\n    <button onclick=\"computeDiff()\">\u6bd4\u8f03\u3092\u5b9f\u884c<\/button>\n<\/div>\n<div id=\"text-container\">\n    <p id=\"originalText\" class=\"text-output\"><\/p>\n    <p id=\"changedText\" class=\"text-output\"><\/p>\n<\/div>\n<div id=\"captureDiffButton\">\n    <p id=\"okCapture\">\u6bd4\u8f03\u7d50\u679c\u3092\u753b\u50cf\u3068\u3057\u3066\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f<\/p>\n    <button onclick=\"captureDiff()\">\u30ad\u30e3\u30d7\u30c1\u30e3\u3092\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc<\/button>\n<\/div>\n<div id=\"diffSummary\"><\/div>\n\n<script>\n    function escapeHtml(text) {\n        return text.replace(\/&\/g, \"&amp;\")\n            .replace(\/<\/g, \"&lt;\")\n            .replace(\/>\/g, \"&gt;\");\n    }\n\n    function computeDiff() {\n        var text1 = document.getElementById('text1').value;\n        var text2 = document.getElementById('text2').value;\n\n        var dmp = new diff_match_patch();\n        var diffs = dmp.diff_main(text1, text2);\n        dmp.diff_cleanupSemantic(diffs);\n\n        var originalTextHtml = '';\n        var changedTextHtml = '';\n        var diffSummary = [];\n        diffs.forEach(function (part) {\n            var text = part[1];\n            var escapedText = escapeHtml(text);\n            if (part[0] === -1) {\n                originalTextHtml += '<span>' + escapedText + '<\/span>';\n                diffSummary.push('- ' + escapedText);\n            } else if (part[0] === 1) {\n                changedTextHtml += '<span>' + escapedText + '<\/span>';\n                diffSummary.push('+ ' + escapedText);\n            } else {\n                originalTextHtml += escapedText;\n                changedTextHtml += escapedText;\n            }\n        });\n\n        document.getElementById('originalText').innerHTML = originalTextHtml;\n        document.getElementById('changedText').innerHTML = changedTextHtml;\n\n        var summaryHtml = '<ul>';\n        diffSummary.forEach(function (diff) {\n            summaryHtml += '<li>' + diff + '<\/li>';\n        });\n        summaryHtml += '<\/ul>';\n\n        document.getElementById('diffSummary').innerHTML = summaryHtml;\n        document.getElementById('captureDiffButton').style.display = 'block';\n    }\n    document.addEventListener('DOMContentLoaded', (event) => {\n        if (isMobileDevice()) {\n            document.getElementById('captureDiffButton').querySelector('button').textContent = '\u30ad\u30e3\u30d7\u30c1\u30e3\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9';\n        } else {\n            document.getElementById('captureDiffButton').querySelector('button').textContent = '\u30ad\u30e3\u30d7\u30c1\u30e3\u3092\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc';\n        }\n    });\n    function captureDiff() {\n        const viewportMeta = document.querySelector('meta[name=\"viewport\"]');\n        const originalViewportContent = viewportMeta.getAttribute('content');\n\n        if (viewportMeta) {\n            console.log(originalViewportContent);\n        } else {\n            console.log('no viewport');\n        }\n\n        function isMobileDevice() {\n            return (typeof window.orientation !== \"undefined\") || (navigator.userAgent.indexOf('IEMobile') !== -1);\n        };\n\n        \/\/ \u30e2\u30d0\u30a4\u30eb\u30c7\u30d0\u30a4\u30b9\u306e\u5834\u5408\u3001viewport\u3092\u8abf\u6574\n        if (isMobileDevice()) {\n            viewportMeta.setAttribute(\"content\", \"width=800\");\n        }\n\n        html2canvas(document.getElementById('text-container')).then(canvas => {\n            \/\/ viewport\u3092\u5143\u306b\u623b\u3059\n            viewportMeta.setAttribute(\"content\", originalViewportContent);\n\n            if (isMobileDevice()) {\n                \/\/ \u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30f3\u306e\u5834\u5408\u3001\u753b\u50cf\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\n                var link = document.createElement('a');\n                link.download = 'diff-capture.png';\n                link.href = canvas.toDataURL(\"image\/png\").replace(\"image\/png\", \"image\/octet-stream\");\n                link.click();\n            } else {\n                \/\/ PC\u306e\u5834\u5408\u3001\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\n                canvas.toBlob(blob => {\n                    navigator.clipboard.write([new ClipboardItem({ 'image\/png': blob })])\n                        .then(() => {\n                            var okCapture = document.getElementById('okCapture');\n                            okCapture.classList.add('show');\n                            setTimeout(() => {\n                                okCapture.classList.remove('show');\n                            }, 2000);\n                        });\n                });\n            }\n        });\n    }\n\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E6%AF%94%E8%BC%83%EF%BC%88Diff%EF%BC%89%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\"><\/span>\u30c6\u30ad\u30b9\u30c8\u6bd4\u8f03\uff08Diff\uff09\u306b\u3064\u3044\u3066<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u306e\u30c4\u30fc\u30eb\u3067\u306f\u3001<a href=\"https:\/\/github.com\/google\/diff-match-patch\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">diff-match-patch<\/a>\u3068\u3044\u3046Google\u304c\u63d0\u4f9b\u3059\u308bJavaScript\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u4f7f\u7528\u3057\u3066\u3044\u307e\u3059\u3002\u5dee\u5206\u306e\u5224\u5b9a\u306e\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u306fdiff-match-path\u306b\u57fa\u3065\u3044\u3066\u3044\u307e\u3059\u3002\u6570\u4ef6\u30c6\u30b9\u30c8\u3057\u307e\u3057\u305f\u304c\u7279\u306b\u554f\u984c\u306f\u306a\u304f\u3001\u7cbe\u5ea6\u306f\u975e\u5e38\u306b\u826f\u3055\u305d\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u753b\u9762\u9077\u79fb\u306f\u3057\u306a\u3044\u306e\u3067\u3001\u30b9\u30c8\u30ec\u30b9\u30d5\u30ea\u30fc\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5de6\u30a8\u30ea\u30a2\u3001\u53f3\u30a8\u30ea\u30a2\u306b\u305d\u308c\u305e\u308c\u6bd4\u8f03\u3057\u305f\u3044\u6587\u7ae0\u3092\u5165\u529b\u3057\u3001\u300c\u6bd4\u8f03\u3092\u5b9f\u884c\u300d\u30dc\u30bf\u30f3\u3092\u62bc\u3059\u3068\u5dee\u5206\u306e\u3042\u308b\u7b87\u6240\u304c\u30ab\u30e9\u30fc\u30ea\u30f3\u30b0\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E7%B0%A1%E6%98%93%E7%94%BB%E5%83%8F%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3%E6%A9%9F%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\"><\/span>\u7c21\u6613\u753b\u50cf\u30ad\u30e3\u30d7\u30c1\u30e3\u6a5f\u80fd\u306b\u3064\u3044\u3066<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span class=\"red\">\u203biPhone, Android\u7b49\u306e\u30b9\u30de\u30db\u306e\u5834\u5408\u306f\u4ed6\u4eba\u3068\u5171\u6709\u3057\u3084\u3059\u3044\u3088\u3046\u306b\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u306b\u3057\u3066\u3044\u307e\u3059<\/span><br>\u5dee\u5206\u306e\u7d50\u679c\u3092\u753b\u50cf\u3068\u3057\u3066\u30ad\u30e3\u30d7\u30c1\u30e3\u3059\u308b\u3053\u3068\u304c\u51fa\u6765\u307e\u3059\u3002\u3053\u3061\u3089\u306f<a href=\"https:\/\/html2canvas.hertzen.com\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">html2canvas<\/a>\u3068\u3044\u3046JavaScript\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u4f7f\u7528\u3057\u307e\u3057\u305f\u3002\u300c\u30ad\u30e3\u30d7\u30c1\u30e3\u3092\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u300d\u30dc\u30bf\u30f3\u3092\u62bc\u3059\u3068\u3001\u753b\u50cf\u304c\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3055\u308c\u307e\u3059\u3002\u30da\u30a4\u30f3\u30c8\u30c4\u30fc\u30eb\u3084Photoshop\u3001Powepoint\u306a\u3069\u306b\u8cbc\u308a\u4ed8\u3051\u3089\u308c\u307e\u3059\u3002\uff08\u3042\u307e\u308a\u77e5\u3089\u308c\u3066\u306a\u3044\u3067\u3059\u304c\u3001Chatwork\u3084Slack\u306a\u3069\u306e\u30c1\u30e3\u30c3\u30c8\u30c4\u30fc\u30eb\u306b\u3082Ctrl + V\u3067\u6dfb\u4ed8\u3067\u304d\u305f\u308a\u3057\u307e\u3059\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f53\u30da\u30fc\u30b8\u304c\u53ef\u5909\u5bfe\u5fdc\u3057\u3066\u3044\u308b\uff08\u30ec\u30b9\u30dd\u30f3\u30b7\u30d6\uff09\u306e\u3067\u3001\u6570\u5024\u304c\u76f8\u5bfe\u8868\u73fe\u306b\u306a\u3063\u3066\u3044\u308b\u305b\u3044\u304b\u3001\u6642\u3005\u30ad\u30e3\u30d7\u30c1\u30e3\u3055\u308c\u305f\u753b\u50cf\u304c\u304a\u304b\u3057\u3044\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002\u3054\u5bb9\u8d66\u9802\u3051\u308c\u3070\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u305f\u3060\u3001\u5358\u7d14\u306a\u6587\u5b57\u5217\u3084\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u5229\u7528\u3059\u308b\u6587\u5b57\u306e\u7f85\u5217\u306a\u3069\u3067\u3042\u308c\u3070\u30d0\u30c3\u30c1\u30ea\u30ad\u30e3\u30d7\u30c1\u30e3\u51fa\u6765\u308b\u306e\u3067\u662f\u975e\u3054\u5229\u7528\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E7%89%B9%E9%95%B7\"><\/span>\u7279\u9577<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uff12\u3064\u306e\u6587\u7ae0\u306e\u5dee\u5206\u3092\u30cf\u30a4\u30e9\u30a4\u30c8\u3057\u307e\u3059\uff08\u76ee\u304c\u75db\u304f\u306a\u3044\u3088\u3046\u306b\u30b0\u30ec\u30fc\u306b\u3057\u307e\u3057\u305f\uff09<\/li>\n\n\n\n<li>\u5dee\u5206\u3092\u5358\u8a9e\u30ec\u30d9\u30eb\u3067\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059<\/li>\n\n\n\n<li>\u5dee\u5206\u8868\u793a\u30a8\u30ea\u30a2\u3092\u753b\u50cf\u3068\u3057\u3066\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u51fa\u6765\u307e\u3059<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%9B%B4%E6%96%B0%E5%B1%A5%E6%AD%B4\"><\/span>\u66f4\u65b0\u5c65\u6b74<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">2023-11-10 ver.1.0.0<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%83%90%E3%82%B0%E5%A0%B1%E5%91%8A%E3%83%BB%E6%A9%9F%E8%83%BD%E3%81%AE%E8%BF%BD%E5%8A%A0%E4%BE%9D%E9%A0%BC%E3%81%AA%E3%81%A9%E3%81%AF%E6%98%AF%E9%9D%9E%E3%81%8A%E5%95%8F%E5%90%88%E3%81%9B%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84\"><\/span>\u30d0\u30b0\u5831\u544a\u30fb\u6a5f\u80fd\u306e\u8ffd\u52a0\u4f9d\u983c\u306a\u3069\u306f\u662f\u975e\u304a\u554f\u5408\u305b\u304f\u3060\u3055\u3044<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Diff\u30c4\u30fc\u30eb\u306f\u7d50\u69cb\u3042\u308a\u307e\u3059\u304c\u3001\u753b\u50cf\u306e\u30ad\u30e3\u30d7\u30c1\u30e3\u306f\u306a\u304b\u306a\u304b\u7121\u3044\u306e\u3067\u306f\u3068\u601d\u3044\u307e\u3059\u3002\u3053\u306e\u30c4\u30fc\u30eb\u306f\u7d50\u69cb\u5b9f\u7528\u7684\u306b\u306a\u308b\u3068\u8003\u3048\u3066\u3044\u307e\u3059\u306e\u3067\u3069\u3093\u3069\u3093\u4f7f\u3063\u3066\u3001\u3044\u308d\u3093\u306a\u4eba\u306b\u5e83\u3081\u3066\u304f\u3060\u3055\u3044\u306d\uff01<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0d\u5177\u5408\u3084\u6a5f\u80fd\u306e\u62e1\u5f35\u4f9d\u983c\u306a\u3069\u3054\u63d0\u6848\u3054\u3056\u3044\u307e\u3057\u305f\u3089\u3001<a href=\"https:\/\/engineering.webstudio168.jp\/contact\/\">\u304a\u554f\u3044\u5408\u308f\u305b<\/a>\u304b\u3089\u304a\u9858\u3044\u3057\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6bd4\u8f03\u3092\u5b9f\u884c \u6bd4\u8f03\u7d50\u679c\u3092\u753b\u50cf\u3068\u3057\u3066\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f \u30ad\u30e3\u30d7\u30c1\u30e3\u3092\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc \u30c6\u30ad\u30b9\u30c8\u6bd4\u8f03\uff08Diff\uff09\u306b\u3064\u3044\u3066 \u3053\u306e\u30c4\u30fc\u30eb\u3067\u306f\u3001diff-match-patch\u3068\u3044\u3046Google\u304c\u63d0\u4f9b\u3059\u308bJavaS [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":7022,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[55,43],"tags":[8,39],"class_list":["post-6995","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","category-43","tag-javascript","tag-39"],"_links":{"self":[{"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/posts\/6995","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/comments?post=6995"}],"version-history":[{"count":57,"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/posts\/6995\/revisions"}],"predecessor-version":[{"id":7068,"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/posts\/6995\/revisions\/7068"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/media\/7022"}],"wp:attachment":[{"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/media?parent=6995"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/categories?post=6995"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/tags?post=6995"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}