naya_hira’s diary

三日坊主の備忘録

Uncaught TypeError: Cannot read property 'onCommand' of undefined【Chrome Extensions】

はじめに

Chrome拡張機能を作っているときに

Uncaught TypeError: Cannot read property 【any function】 of undefined

でエラーをたくさん出したので原因と自分の解決法を書いておく。

目次

エラー内容

Uncaught TypeError: Cannot read property 'onCommand' of undefined

以上のエラーコードは、表示されている関数内で取得できていない(undefined)ものがありました的なエラーだと思います。
以下発生したソースコード

$("#menu-container").before('<div><button id="stamp-button">TEST BUTTON</button></div>');

chrome.commands.onCommand.addListener(function(command) {
    if (command === "Ctrl+Q") { 
        document.getElementById("stamp-button").click();
    }
}); 

このコードでは、『TEST BUTTON』を作成する。その後に、「manifest.json」で設定したショートカットが入力されると3行目の関数が実行されるというコードです。

原因

chrome.commands.onCommand.addListener』を実行しているURLが『TEST BUTTON』を作成してURLと異なることが原因でした。

$("#menu-container").before('<div><button id="stamp-button">TEST BUTTON</button></div>');
 var url = location.href ;
alert("I watch this url :\n"+url);

chrome.commands.onCommand.addListener(function(command) {
    if (command === "Ctrl+Q") { 
         var url = location.href ;
        alert("addListener execute this url :\n"+url);
    }
}); 

以上のコードに変更して、実行してみると

Output : 出力
I watch this url :
http:www.website~/~

addListener execute this url :
chrome-extension://hkedmcfecnafcmlhhokljjlmjbfnebjd/_generated_background_page.html

以上から実行しているURLがことなるため、エラーが発生していた。

自分なりの解決策

私が作ろうとしている拡張機能は、『特定のwebページ上でショートカットを入力すると決まった処理を行う』というものでした。 そのため、以下のurl の answer を改変して使用した。 stackoverflow.com

//17 == control, 81 == q
var map = {17: false, 81: false};
$(document).keydown(function(e) {
    if (e.keyCode in map) {
        map[e.keyCode] = true;
        if (map[17] && map[81]) {
            alert("shurtcut sucsess");

            //any process here(ここになんか書く)

            map[17] = false;
            map[81] = false;
        }
    }
}).keyup(function(e) {
    map[17] = false;
    map[81] = false;
});

また、「manifest.json」のcommands は削除しました。

さいごに

拡張機能完成できるといいな....

WSL 2 のバックアップ方法 とか 復元方法

はじめに

wsl 2 のバックアップ方法の書きなぐりです。

今回の環境

OS : windows10 pro insider preview
バージョン : 2004
OSビルド : 20161.1000
実行環境 : Powershell

バックアップ

Powershell で wsl の export を使ってバックアップを行います。

wsl --export ディストリビューション名 保存先フォルダ/ファイル名.tar

# Ubuntu-18.04 を『wslBackup』というフォルダにフォルダ名『Ubuntu-18.04』で保存する場合
 wsl --export Ubuntu-18.04 ./wslBackup/Ubuntu-18.04.tar

ディストリビューションの削除

最初に、不要となったディストリビューションがある場合、以下のコマンドで削除します。

wslconfig /unregister ディストリビューション名

#『Ubuntu-18.04』を削除する場合
wslconfig /unregister Ubuntu-18.04

バックアップからの復元

wsl --import ディストリビューション名 バックアップしたファイル --version wslバージョン

# Ubuntu-18.04 を『wslBackup』というフォルダのフォルダ名『Ubuntu-18.04』から復元する場合
wsl --import Ubuntu-18.04 .\wslBackup\Ubuntu-18.04.tar --version 2

デフォルトユーザーを変更したいとき

復元後、なぜか rootでのログインがデフォルトになっていたため、変更しました。 なぜなるかは、不明です。

ディストリビューション名 config --default-user ユーザー名

#Ubuntu18.04 でデフォルトユーザーを『hoge』に変更する場合
ubuntu1804 config --default-user hoge

参考にしたサイト

docs.microsoft.com

【未解決】タスクバーのアイコン表示が激遅になった話

はじめに

Windows10 を使っていて困ったので書きます。

概要

Windows10 を起動して、サインインをします。その後、通常なら数秒でデスクトップアイコンやタスクバーのアイコンが表示されます。 ですが、現在はデスクトップの背景画像が表示されてから約2分半、操作ができません。 この症状は、昨日の夕方ごろに発生しました。

現在(2020/6/21)の環境

OS : Windows10 Pro 2004
2004 インストール日 : 06/05
PC : 自作PC
スペック
CPU : Ryzen 7 3700x
GPU : Nvidia RTX 2070S
MB : MSI MPG X570 GAMING PRO CARBON WIFI RAM : 16GB

試したこと(無駄でした)

高負荷状態のせいで遅いのでは?
→ 電源オプションのパフォーマンスを Ryzen High Performance に変更

新規ユーザーの作成する → 若干の効果があり?

イベントビューアーで発生したエラーを確認
WIndowsログのApplication を確認すると

プログラム StartMenuExperienceHost.exe バージョン 0.0.0.0 は、Windows との対話を停止し、終了しました。問題に関する詳細な情報があるかどうかを確認するには、セキュリティとメンテナンス コントロール パネルで、問題の履歴を参照してください。   
ユーザー "SYSTEM" (実行中スレッドの GetUserName() の値) によるパフォーマンス データへのアクセスは、モジュール "C:\Program Files (x86)\MSI\One Dragon Center\CC_Engine_x64.exe" (クエリを発行したバイナリの GetModuleFileName() の値) からのものとして拒否されました。

→ よくわかんないです

最後に

進展があったり解決したら追記します。

2020/6/22 追記

なんか治りました。結局よくわかりませんでした。 思い当たることとしては、msiのユーティリティソフトの ドラゴンセンター? をアンインストールしたこと、Cドライブのクリーンアップをしたことですかね?
何はともあれやった~~~~~~(≧▽≦)

Docker で WordPress をテストする【WSL2】

はじめに

WSL2 で Docker を使って WordPress のテストをします。
私は、以下のエラーで詰んでこの方法でやり直しました。

System has not been booted with systemd as init system (PID 1). Can't operate.
docker System has not been booted with systemd as init system (PID 1). Can't operate.

目次

今回の環境

OS : Windows 10 pro 2004
WSL2 : Ubuntu18.04

2020/06/06 現在の情報

WSL 2 に変更するまで

WSL 2 インストール

私の場合、WSL1が事前に入っていたのでバージョンを更新します。 管理者権限を持った PowerShell より以下を実行します。

Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
wsl --set-version Ubuntu-18.04 2
# Ubuntu-18.04 の部分は、各自の WSL のOS によって異なります

『WSL 2 を実行するには、カーネル コンポーネントの更新が必要です。...』のようなメッセージが出た場合は、 aka.ms
f:id:naya_hira:20200606094247p:plain
以上のURLにアクセスしてインストーラーをダウンロードします。
ダウンロードしたインストーラーを実行して、再度上記のコマンドを実行します。

WSL バージョン確認

PowerShell で以下を実行します

wsl -l -v

f:id:naya_hira:20200606100057p:plain
私の場合は、すでに Docker が実行されています。

WSL2 準備

System has not been booted with systemd as init system (PID 1). Can't operate.
docker System has not been booted with systemd as init system (PID 1). Can't operate.

以上のようなエラーが出るため、一度すでに WSL2 に入っている docker を削除します。

WSL2 docker の削除

WSL2 上で以下を実行します。

sudo  apt remove docker-ce
sudo  apt remove docker-ce-cli
sudo  apt remove docker-engine
sudo  apt remove docker-engine-cs
sudo apt remove docker.io

Docker Desktop 側の設定

Docker Desktop を起動します。
f:id:naya_hira:20200606101909p:plain
右下のクジラを右クリックして設定を開きます。
f:id:naya_hira:20200606102313p:plain
General の以下の二つの設定に、チェックが無ければ、チェックします。
・Expose daemon on tcp://localhost:2375 without TLS
・Use the WSL 2 based engine
f:id:naya_hira:20200606102902p:plain
最後に、 Apply & Restart をクリックして適用します。

Wordpress を起動するまで

Wordpressmysql のdocker イメージを取得する

docker pull でイメージを引っ張ってきます。

docker pull mysql:5
docker pull wordpress:4.9.8
#docker pull ほしいdockerイメージ:(コロン)バージョン(任意)

今回は、古いバージョンが欲しいので、バージョンを指定してます。
指定がなければ、最新版になります。

docker ネットワークを作成する

今回は、テストなのでネットワークの名前は、test にしました。

docker network create test
#docker network create 作成するネットワーク名

docker コンテナ 作成

以下のコマンドを実行して、 mysqlwordpress のコンテナを作成します。

docker run --name mysql_docker --net test -e MYSQL_ROOT_PASSWORD=password -d mysql:5
docker run --name wordpress_docker --net test -e WORDPRESS_DB_HOST=mysql_docker -e WORDPRESS_DB_PASSWORD=password -p 8080:80 -d wordpress:4.9.8


## 解説
#docker run --name mysqlのdockerコンテナ名 --net ネットワーク名 -e MYSQL_ROOT_PASSWORD=mysqlのパスワード -d コンテナイメージ:バージョン(任意)
#docker run --name wordpressのdockerコンテナ名 --net ネットワーク名 -e WORDPRESS_DB_HOST=mysqlのdockerコンテナ名 -e WORDPRESS_DB_PASSWORD=mysqlのパスワード -p 8080:80 -d コンテナイメージ

docker コンテナが作成されたのか確認する。

docker ps

作成したコンテナがあれば、完了です。

IPアドレスの確認

Wordpress にアクセスするために WSL2 の IP アドレスを確認します。

iwconfig

実行結果の 192.168... ってやつです。

wordpress の初期設定

ChromeFireFox でアドレスバーに http://IPアドレス:8080(ポート番号) を打ってアクセスします。
初回は、/wp-admin/install.php に飛ばされます。
f:id:naya_hira:20200606115343p:plain
あとは、画面に従ってインストールします。 ログイン画面に、一度戻されますがログインすると管理画面を確認できます。 f:id:naya_hira:20200606115645p:plain

docker コンテナの停止と削除

最後に、いらなくなったコンテナを削除します。

docker ps -a

以上のコマンドでCONTAINER IDを確認します。

# コンテナの停止
# docker stop コンテナID
(例) docker stop d138aac4300c

# コンテナの削除
# docker rm コンテナID
(例)docker rm d138aac4300c

さいごに

docker イメージは、たくさん種類があるので以下から探してみてはいかがですか

hub.docker.com

Rust Hello World までやってみた

はじめに

よく聞くようになったので触ってみたくなった
以下を参考にして、進めていきます。
doc.rust-jp.rs

目次

Rust Hello World まで( Linux / macOS の場合)

インストールする

curl https://sh.rustup.rs -sSf | sh

以上を実行するとインストールオプションが表示されます。
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
今回は、デフォルトでインストールするため、1を選択します。

Rust is installed now. Great!

と表示されれば、インストール成功です。
次に、端末を再起動するか、以下を実行してシェルを更新します。

source $HOME/.cargo/env

ここまでできたかの確認として、version を表示させます。

rustc --version
#rustc 1.44.0 (49cae5576 2020-06-01)

プログラムを書く

mkdir ~/projects
cd ~/projects
mkdir hello_world
cd hello_world

以上のコマンドでディレクトリを作成しました。
次はHelloWorldを表示するためのプログラムを作成します。
vim main.rs

fn main() {
    println!("Hello, world!");
}

ソースコードは、これだけです。
Rust は、スクリプト言語ではないので、コンパイルが必要になります。

rustc main.rs
./main

これで、 Hello, world! と表示されれば、成功です。

Rust のポイント

今回は、別のプログラミング言語を触ったことがあるなら大抵わかると思うので、少しだけ解説します。

    println!("Hello, world!");

1.タブではなく4スペースでインデントする。
2.println!は、Rustの関数ではなく、マクロ*1を呼び出している。
3.行は、セミコロン(;)で終えて、式の終わりを示す。

おわりに

Rustをすこしだけ触ってみました。 ちゃんとした日本語ドキュメントがあるととてもありがたいですね