VSCodeの背景を可愛くしたけど「Code インストールが壊れている可能性があります。」って言われる問題

## 読み飛ばしてください

ひとりアドカレ13日目遅刻しました。
限界派遣SESです。

なぜか私の周りの人が全員風邪をひいて私だけ風邪を引いていなかったんですが、先日風邪を引いて寝込んでいました。
だいぶ回復したので、今日からまた頑張ります。

## VSCode背景を可愛くする方法

まず、VSCodeの背景を可愛くする方法を紹介します。  
といっても以下の拡張機能をインストールしてちょこっと設定するだけです。

https://marketplace.visualstudio.com/items?itemName=Katsute.code-background

これをインストールすると、VSCodeの背景を自由に設定できるようになります。

まずは簡単に、VSCodeのコマンドパレットを開いて`background: Configuration`を実行します。
すると`Window`の背景などを選択できるようになります。私は`Window`と`Panel`のみ設定しています。

![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1239781/170ba45c-7639-647b-c20e-7127185f5493.png)

背景の画像を設定する際はCDNなどのURLを指定することをオススメします。
そうすることで、どの環境でも同じ背景が表示されるようになります。

![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1239781/8a5d5550-9923-e032-9f1a-efb120413a8d.png)

表示位置やサイズなども個別に設定できるので、自分好みにカスタマイズしてみてください。
これらの設定はCSSの`background-size`などのCSSのプロパティとして指定されるので、`80%`などのプロパティが利用できます。

![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1239781/3fbfd147-3a91-2d0f-bfeb-53a4ad09dac3.png)

設定が終わったら、コマンドパレットから`background: install`を実行して設定を反映させます。

![image-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1239781/4055cd90-f6fc-8aa7-aff3-6cd57221be84.png)

ね、かわいいでしょ？


### なぜか「Code インストールが壊れている可能性があります。」って言われる

さて、ここで問題が発生します。

VSCodeを再起動すると、以下のようなエラーが表示されます。

![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1239781/658f69c1-8a87-dc9a-144f-f1763815d5c9.png)


これは、VSCodeに対してパッチを当てているためです。
実際にVSCodeのインストールが壊れているわけではないので、安心してください。

ソースコードを確認すると`workbench.desktop.main.js`というファイルを書き換えていることがわかります。
これがVSCodeの内部ファイルで、これを書き換えているためエラーが発生しているのです。


実際に書き換えを行っているコードの中では、`inject`という関数でコードを挿入しています。
```ts
const identifier: string = "KatsuteDev/Background";

export const inject: (content: string) => string = (content: string) =>
    clean(content) + '\n' +
    `/* ${identifier}-start */` + '\n' +
    minifyJavaScript(getJavaScript()) + '\n' +
    `/* ${identifier}-end */`;
```

ここで生成されたコードは`KatsuteDev/Background`というコメントで囲まれています。
これを識別子として、VSCodeの内部ファイルに挿入しているのです。

Uninstallの際は`clean`という関数で識別子に囲まれた部分を削除しています。

```ts
const identifier: string = "KatsuteDev/Background";

const partition: RegExp = new RegExp(`^\\/\\* ${identifier}-start \\*\\/$` +
                                     `[\\s\\S]*?` +
                                     `^\\/\\* ${identifier}-end \\*\\/$`, "gmi");

export const clean: (content: string) => string = (s: string) =>
    s.replace(partition, "").trim();
```

### 似たような拡張機能ならエラーでないけど？

以下の拡張機能ではエラーが発生しません。

https://marketplace.visualstudio.com/items?itemName=shalldie.background

ではこっちのがいいのでは？と思うかもしれませんが、これもやっている事は同じです。

実際に変更されたファイルを確認すると、`workbench.desktop.main.js`にコードが挿入されています。
以下のパスにファイルが存在します。

`%appdata%/Local/Programs/Microsoft VS Code/resources/app/out/vs/workbench/workbench.desktop.main.js`

`vscode-background`というコメントで囲まれたコードが挿入されています。

```js
// vscode-background-start background.ver.2.0.3
(() => {
    var a;
    (a = document.createElement("style")).textContent = `
        .notification-toast-container:has([aria-label*='installation appears to be corrupt. Please reinstall.']) {
            display: none;
        }
        .notification-toast-container:has([aria-label*='je pravděpodobně poškozená. Proveďte prosím přeinstalaci.']) {
            display: none;
        }
        .notification-toast-container:has([aria-label*='Installation ist offenbar beschädigt. Führen Sie eine Neuinstallation durch.']) {
            display: none;
        }
        .notification-toast-container:has([aria-label*='parece estar dañada. Vuelva a instalar.']) {
            display: none;
        }
        .notification-toast-container:has([aria-label*='semble être endommagée. Effectuez une réinstallation.']) {
            display: none;
        }
        .notification-toast-container:has([aria-label*='sembra danneggiata. Reinstallare.']) {
            display: none;
        }
        .notification-toast-container:has([aria-label*='インストールが壊れている可能性があります。再インストールしてください。']) {
            display: none;
        }
        .notification-toast-container:has([aria-label*='설치가 손상된 것 같습니다. 다시 설치하세요.']) {
            display: none;
        }
        .notification-toast-container:has([aria-label*='prawdopodobnie jest uszkodzona. Spróbuj zainstalować ponownie.']) {
            display: none;
        }
        .notification-toast-container:has([aria-label*='parece estar corrompida. Reinstale-o.']) {
            display: none;
        }
        .notification-toast-container:has([aria-label*='ïñstællætïøñ æppëærs tø þë çørrµpt. Plëæsë rëïñstæll.']) {
            display: none;
        }
        .notification-toast-container:has([aria-label*='повреждена. Повторите установку.']) {
            display: none;
        }
        .notification-toast-container:has([aria-label*='yüklemeniz bozuk gibi görünüyor. Lütfen yeniden yükleyin.']) {
            display: none;
        }
        .notification-toast-container:has([aria-label*='安装似乎损坏。请重新安装。']) {
            display: none;
        }
        .notification-toast-container:has([aria-label*='安裝似乎已損毀。請重新安裝。']) {
            display: none;
        }
    `;
    document.head.appendChild(a);
})();
// vscode-background-end
```

実際にはフォーマットされていませんが、このようにVSCodeの内部ファイルにコードを挿入しています。
これはエラーメッセージを抑制するためのコードです。

そのため、VSCodeの内部ファイルを変更していても、エラーが発生していないように見えているのです。

### 使っても大丈夫？

以下のFAQによると、VSCodeの内部ファイルを変更することはサポートされていないとのことです。

https://code.visualstudio.com/docs/supporting/faq#_installation-appears-to-be-corrupt-unsupported

そのため、利用する際は自己責任でお願いします。

## まとめ

VSCodeの背景を可愛くする方法を紹介しました。

余談ですが、CloudflareのR2を使うと無償で10GB分のCDNを利用できるので、背景画像を設定する際には活用してみてください。

それでは。