Map terms Azure to AWS

Display the corresponding AWS-related term near the Azure-related term on the Microsoft documentation site.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Map terms Azure to AWS
// @namespace    http://tampermonkey.net/
// @version      0.304
// @description  Display the corresponding AWS-related term near the Azure-related term on the Microsoft documentation site.
// @author       uemuram
// @match        https://docs.microsoft.com/*
// @match        https://qiita.com/*
// @grant        none
// ==/UserScript==

(function main(w) {
  'use strict';

  // マッピング
  const termMappings = [
    { 'azure': 'Application Insights', 'aws': 'CloudWatch' },
    { 'azure': 'Cost Management', 'aws': 'Cost Explorer' },
    { 'azure': 'File Sync', 'aws': 'DataSync' },
    { 'azure': 'Azure Marketplace', 'aws': 'AWS Marketplace' },
    { 'azure': 'CycleCloud', 'aws': 'Parallel Cluster' },
    { 'azure': 'Machine Learning', 'aws': 'SageMaker' },
    { 'azure': 'Machine Learning Studio', 'aws': 'SageMaker' },
    { 'azure': 'Bot Framework', 'aws': 'Alexa Skills Kit' },
    { 'azure': 'Speech Services', 'aws': 'Amazon Lex' },
    { 'azure': 'Language Understanding', 'aws': 'Amazon Lex' },
    { 'azure': 'Speech Services', 'aws': 'Amazon Polly、Amazon Transcribe' },
    { 'azure': 'Cognitive Services', 'aws': 'Amazon Rekognition' },
    { 'azure': 'Cognitive Search', 'aws': 'CloudSearch' },
    { 'azure': 'Azure 仮想アシスタント', 'aws': 'Alexa Skills Kit' },
    { 'azure': '仮想アシスタント', 'aws': 'Alexa Skills Kit' },
    { 'azure': 'Synapse Analytics', 'aws': 'Redshift' },
    { 'azure': 'Databricks', 'aws': 'EMR' },
    { 'azure': 'HDInsight', 'aws': 'EMR' },
    { 'azure': 'Data Lake Storage', 'aws': 'EMR' },
    { 'azure': 'Data Factory', 'aws': 'データ パイプライン、AWS Glue' },
    { 'azure': 'Data Catalog', 'aws': 'AWS Glue' },
    { 'azure': 'Stream Analytics', 'aws': 'Kinesis Analytics' },
    { 'azure': 'Data Lake Analytics', 'aws': 'Kinesis Analytics' },
    { 'azure': 'Data Lake Store', 'aws': 'Kinesis Analytics' },
    { 'azure': 'Data Share', 'aws': 'Lake Formation' },
    { 'azure': 'Power BI', 'aws': 'QuickSight' },
    { 'azure': 'Azure Search', 'aws': 'CloudSearch' },
    { 'azure': 'Azure Data Lake Analytics', 'aws': 'Amazon Athena' },
    { 'azure': 'Virtual Machine Scale Sets', 'aws': 'AWS Auto Scaling' },
    { 'azure': 'Virtual Machines', 'aws': 'Elastic Compute Cloud (EC2) インスタンス' },
    { 'azure': 'Azure Batch', 'aws': 'AWS Batch' },
    { 'azure': 'VMware by CloudSimple', 'aws': 'VMware Cloud on AWS' },
    { 'azure': 'Container Instances', 'aws': 'Elastic Container Service (ECS)' },
    { 'azure': 'Container Registry', 'aws': 'Elastic Container Registry' },
    { 'azure': 'Kubernetes Service', 'aws': 'Elastic Kubernetes Service (EKS)' },
    { 'azure': 'Service Fabric Mesh', 'aws': 'App Mesh' },
    { 'azure': 'Azure Functions', 'aws': 'Lambda' },
    { 'azure': 'SQL Database', 'aws': 'RDS' },
    { 'azure': 'Database for MySQL', 'aws': 'RDS' },
    { 'azure': 'Database for PostgreSQL', 'aws': 'RDS' },
    { 'azure': 'Cosmos DB', 'aws': 'DynamoDB、SimpleDB、Amazon DocumentDB' },
    { 'azure': 'CosmosDB', 'aws': 'DynamoDB、SimpleDB、Amazon DocumentDB' },
    { 'azure': 'Table Storage', 'aws': 'DynamoDB' },
    { 'azure': 'Cache for Redis', 'aws': 'ElastiCache' },
    { 'azure': 'Database Migration Service', 'aws': 'AWS Database Migration Service' },
    { 'azure': 'Azure Monitor', 'aws': 'CloudWatch、AWS X-Ray' },
    { 'azure': 'DevOps', 'aws': 'CodeDeploy、CodeCommit、CodePipeline' },
    { 'azure': '開発者ツール', 'aws': 'AWS 開発者ツール' },
    { 'azure': 'DevOps', 'aws': 'AWS CodeBuild' },
    { 'azure': 'CLI', 'aws': 'コマンド ライン インターフェイス' },
    { 'azure': 'PowerShell', 'aws': 'コマンド ライン インターフェイス' },
    { 'azure': 'Automation', 'aws': 'OpsWorks (Chef ベース)' },
    { 'azure': 'Resource Manager', 'aws': 'CloudFormation' },
    { 'azure': 'VM 拡張機能', 'aws': 'CloudFormation' },
    { 'azure': 'Azure Automation', 'aws': 'CloudFormation' },
    { 'azure': 'IoT Hub', 'aws': 'AWS IoT' },
    { 'azure': 'IoT Edge', 'aws': 'AWS Greengrass' },
    { 'azure': 'Event Hubs', 'aws': 'Kinesis Firehose、Kinesis Streams' },
    { 'azure': 'Digital Twins', 'aws': 'AWS IoT Things Graph' },
    { 'azure': 'Azure Advisor', 'aws': 'Trusted Advisor' },
    { 'azure': 'Billing API', 'aws': 'AWS Usage and Billing Report' },
    { 'azure': 'Azure Portal', 'aws': 'AWS Management Console' },
    { 'azure': 'Azure Migrate', 'aws': 'AWS Application Discovery Service' },
    { 'azure': 'Azure Monitor', 'aws': 'Amazon EC2 Systems Manager' },
    { 'azure': 'Resource Health', 'aws': 'AWS Personal Health Dashboard' },
    { 'azure': 'Queue Storage', 'aws': 'Simple Queue Service (SQS)' },
    { 'azure': 'Service Bus', 'aws': 'Simple Queue Service (SQS)' },
    { 'azure': 'Event Grid', 'aws': 'Simple Notification Service' },
    { 'azure': 'App Center', 'aws': 'Mobile Hub、Mobile SDK、Cognito、AWS Device Farm、Mobile Analytics' },
    { 'azure': 'Xamarin アプリ', 'aws': 'Mobile Hub' },
    { 'azure': 'Virtual Network', 'aws': 'Virtual Private Cloud (VPC)' },
    { 'azure': '仮想ネットワーク', 'aws': 'Virtual Private Cloud (VPC)' },
    { 'azure': 'VPN Gateway', 'aws': 'AWS VPN Gateway' },
    { 'azure': 'DNS', 'aws': 'Route 53' },
    { 'azure': 'Traffic Manager', 'aws': 'Route 53' },
    { 'azure': 'ExpressRoute', 'aws': 'Direct Connect' },
    { 'azure': 'Load Balancer', 'aws': 'Network Load Balancer' },
    { 'azure': 'Application Gateway', 'aws': 'Application Load Balancer' },
    { 'azure': 'PrivateLink', 'aws': 'ネットワークの分離' },
    { 'azure': 'Azure Active Directory', 'aws': 'Identity and Access Management (IAM)' },
    { 'azure': 'ロール ベースのアクセス制御', 'aws': 'Identity and Access Management (IAM)' },
    { 'azure': 'サブスクリプション管理 + Azure RBAC', 'aws': 'AWS Organizations' },
    { 'azure': 'Multi-Factor Authentication', 'aws': 'Multi-Factor Authentication' },
    { 'azure': 'Azure Active Directory Domain Services', 'aws': 'AWS Directory Service' },
    { 'azure': 'Azure Active Directory B2C', 'aws': 'Cognito' },
    { 'azure': 'Azure Policy', 'aws': 'AWS Organizations' },
    { 'azure': '管理グループ', 'aws': 'AWS Organizations' },
    { 'azure': 'Azure Storage Service Encryption', 'aws': 'Amazon S3 Key Management Service を使用したサーバー側の暗号化' },
    { 'azure': 'Key Vault', 'aws': 'キー管理サービス (KMS)、CloudHSM' },
    { 'azure': 'Application Gateway - Web アプリケーション ファイアウォール', 'aws': 'Web アプリケーション ファイアウォール' },
    { 'azure': 'Azure Firewall', 'aws': 'Web アプリケーション ファイアウォール' },
    { 'azure': 'セキュリティ センター', 'aws': 'Inspector' },
    { 'azure': 'ポータルで使用可能な App Service 証明書', 'aws': 'Certificate Manager' },
    { 'azure': 'Advanced Threat Protection', 'aws': 'GuardDuty' },
    { 'azure': 'Service Trust Portal', 'aws': 'AWS Artifact' },
    { 'azure': 'DDoS Protection サービス', 'aws': 'AWS Shield' },
    { 'azure': 'BLOB Storage', 'aws': 'Simple Storage Services (S3)' },
    { 'azure': 'マネージド ディスク', 'aws': 'Elastic Block Store (EBS)' },
    { 'azure': 'Azure Files', 'aws': 'Elastic File System' },
    { 'azure': 'Storage クール層', 'aws': 'S3 Infrequent Access (IA)' },
    { 'azure': 'Storage アーカイブ アクセス層', 'aws': 'S3 Glacier' },
    { 'azure': 'Azure Backup', 'aws': 'AWS Backup' },
    { 'azure': 'StorSimple', 'aws': 'Storage Gateway' },
    { 'azure': 'Import/Export', 'aws': 'AWS Import/Export ディスク' },
    { 'azure': 'Data Box', 'aws': 'AWS Import/Export Snowball、Snowball Edge、Snowmobile' },
    { 'azure': 'App Service', 'aws': 'Elastic Beanstalk' },
    { 'azure': 'API Management', 'aws': 'API Gateway' },
    { 'azure': 'Content Delivery Network', 'aws': 'CloudFront' },
    { 'azure': 'Front Door', 'aws': 'Global Accelerator' },
    { 'azure': 'Logic Apps', 'aws': 'AWS Step Functions' },
    { 'azure': 'Office 365', 'aws': 'Amazon WorkMail、Amazon WorkDocs' },
    { 'azure': 'PlayFab', 'aws': 'GameLift、GameSparks' },
    { 'azure': 'Media Services', 'aws': 'Elastic Transcoder' },
    { 'azure': 'Logic Apps', 'aws': 'Simple Workflow Service (SWF)' },
    { 'azure': 'Azure Stack', 'aws': 'Outposts' },
    { 'azure': 'Azure DDoS Protection', 'aws': 'AWS Shield' },
    { 'azure': 'Network Watcher', 'aws': 'AWS Transit Gateway Network Manager' },
    { 'azure': 'Notification Hubs', 'aws': 'Amazon Pinpoint' },
  ]

  // ヒットした部分を加工する
  let replaceTermString = function (str) {
    for (let i = 0; i < termMappings.length; i++) {
      let index = str.toLowerCase().indexOf(termMappings[i].azure.toLowerCase());
      if (index >= 0) {
        let beforeStr = str.substring(0, index);
        let targetTerm = str.substring(index, index + termMappings[i].azure.length);
        let afterStr = str.substring(index + termMappings[i].azure.length);
        return replaceTermString(beforeStr)
          + '<div class="tooltip">' + targetTerm + "<span>" + termMappings[i].aws + '</span></div>'
          + replaceTermString(afterStr);
      }
    }
    return str;
  }

  // 子要素を走査し、テキストノード(nodeType=3)であれば、書き換えを行う
  let replaceTerm = function (r) {
    let children = r.childNodes;
    let l = children.length;
    for (let i = 0; i < l; i++) {
      let child = (children[i]);
      if (child.nodeType == 3 && !/^[ \n\t]+$/.test(child.nodeValue) && child.nodeValue.length > 0) {
        let newStr = replaceTermString(child.nodeValue);
        // 書き換えが発生した場合はDOMを変更
        if (newStr !== child.nodeValue) {
          let newSpan = document.createElement("span");
          newSpan.innerHTML = newStr;
          r.insertBefore(newSpan, child);
          child.remove();
        }
      } else {
        replaceTerm(child);
      }
    }
  }

  // スタイル追加
  let style = document.createElement("style");
  document.head.appendChild(style);
  let sheet = style.sheet;
  sheet.insertRule("div.tooltip {display:inline; border-bottom:solid 1px #87CEFA}", 0);
  sheet.insertRule("div.tooltip span {display:none; padding:5px; margin:10px 0 0 0px;}", 1);
  sheet.insertRule("div.tooltip:hover span {display:inline;  position:absolute; border:1px solid #CCC; border-radius:5px; background:#F7F7F7; color:#666; font-size:12px; line-height:1.6em;}", 2);

  var o, i;
  //フレームが複数ある場合を考慮してmainを再帰的に実行
  while (o = w.frames[i++]) try { main(o) } catch (o) { }
  replaceTerm(w.document.body);
})(window);