スキップしてメイン コンテンツに移動

投稿

8月, 2022の投稿を表示しています

Windows側のMySQL Workbenchから、WSL2上のUbuntuにインストールしたMySQLへ接続する方法

Windows側のMySQL Workbenchから、WSL2上のUbuntuにインストールしたMySQLへ接続する方法をまとめました。 Ubuntu側 (WSL2) MySQLのインストール 普通にUbuntuへMySQLをインストールする手順に従う。 https://takake-blog.com/wsl2-ubuntu2004-mysql/ を参考に進めた。 MySQLの起動コマンドは sudo service mysql start MySQLの設定修正 ■ MySQLのユーザを作成 外部のホストからログインできるようにするために、ホスト部分は%指定 。ホストを固定したい場合はホスト名やIPアドレスを指定。 CREATE USER 'user' @ '%' IDENTIFIED BY 'password' ; FLUSH PRIVILEGES ; CREATE SCHEMA some_schema CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' ; GRANT ALL PRIVILEGES ON ` some_schema ` .* TO 'user' @ '%' ; ■ Listenするアドレスを0.0.0.0に修正 sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf #bind-address = 127.0.0.1 bind-address = 0.0.0.0 sudo service mysql restart を実行してMySQL再起動 ■ ifconfigコマンドを実行して接続先のIPアドレスを調べる user@host:~$ ifconfig Command 'ifconfig' not found, but can be installed with: sudo apt install net-tools 自分の環境では、上記のメッセージが出て、ifconfigがインストールされていなかったので、 sudo apt install ne

Windowsのユーザフォルダ名の変更方法

背景 日本語ユーザ名でWindowsのユーザを作成すると、ユーザフォルダ(C:\Users{ユーザ名})も日本語で作成されてしまいます。 日本語のフォルダ名だとアプリケーションによっては不具合が生じることもあったので、英語のフォルダ名に変更を実施しました。 注意点 色々と面倒で、レジストリを修正する必要がありリスクの高い方法なので、実施する場合は自己責任でお願いします。 特にユーザ名が固有名詞や日本語名でない場合は、レジストリエディタで文字列を一括置換する場合に、置換する必要のない文字列まで置換してしまう可能性が高いので、実施はお勧めしません。 ユーザ作成直後であれば、ユーザを作り直す方が楽ですかも知れません。 対応方法 下記の流れでのように実施しました。 How to Change User Folder Name in Windows 10 – 2 Ways (minitool.com) の記事を参考に コマンドプロンプトで net user Administrator /active:yes と打ってAdministratorユーザを一時的に作成 ログアウトして作成したAdministratorアカウントでログイン CドライブのUsersフォルダ配下にある対象のユーザ名のフォルダを、変更したい名前に修正 レジストリエディタを開いて HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\<User SID>\ を検索して、 ProfileImagePath に登録されているフォルダ名を修正。 netplwiz を実行してユーザ名を変更。Microsoftアカウントと紐づいている場合、表示されるユーザ名は変更できないのでスキップしてOK。 Administratorアカウントからログアウトして、ユーザ名を変更し終わったアカウントでログイン net user Administrator /active:no とコマンドプロンプトに入力して、Administratorアカウントを削除。 環境変数の修正 特に環境変数のPathにユーザフォルダが含まれている場合、ユーザ個人でインストールしたアプリケーションを実行

JOGLのプログラムが起動しない問題

JOGLのエラー JOGL - Java™ Binding for the OpenGL® API のプログラムを久しぶりに動かそうとしたところ、下記のエラーが出てしまい動きませんでした。 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 1 at jogamp.opengl.windows.wgl.awt.WindowsAWTWGLGraphicsConfigurationFactory.chooseGraphicsConfigurationImpl(WindowsAWTWGLGraphicsConfigurationFactory.java:171) at com.jogamp.nativewindow.GraphicsConfigurationFactory.chooseGraphicsConfiguration(GraphicsConfigurationFactory.java:424) at com.jogamp.opengl.awt.GLCanvas.chooseGraphicsConfiguration(GLCanvas.java:1560) at com.jogamp.opengl.awt.GLCanvas.addNotify(GLCanvas.java:611) at java.desktop/java.awt.Container.addNotify(Container.java:2804) at java.desktop/java.awt.Window.addNotify(Window.java:791) at java.desktop/java.awt.Frame.addNotify(Frame.java:495) at java.desktop/java.awt.Window.show(Window.java:1053) at java.desktop/java.awt.Component.show(Component.java:1728) at java.desktop/java.awt.Component.setVisible(Compon

EclipseのGoogle Cloud ToolsがインストールするGoogle Cloud SDKの場所

EclipseのGoogle Cloud ToolsからCloud SDKをインストールするように設定して(Window > Preferences > Google Cloud Toolsから設定できます)、Eclipse上でCloud SDKをアップデートしたところ下記のエラーメッセージが表示されました。 WARNING: There are other instances of Google Cloud tools on your system PATH. Please remove the following to avoid confusion or accidental invocation: C:\Users\ { user名 } \AppData\Local\Google\Cloud SDK\google-cloud-sdk\bin\java_dev_appserver.sh C:\Users\ { user名 } \AppData\Local\Google\Cloud SDK\google-cloud-sdk\bin\gsutil C:\Users\ { user名 } \AppData\Local\Google\Cloud SDK\google-cloud-sdk\bin\java_dev_appserver.cmd C:\Users\ { user名 } \AppData\Local\Google\Cloud SDK\google-cloud-sdk\bin\endpointscfg.py C:\Users\ { user名 } \AppData\Local\Google\Cloud SDK\google-cloud-sdk\bin\bq.cmd C:\Users\ { user名 } \AppData\Local\Google\Cloud SDK\google-cloud-sdk\bin\gcloud.ps1 C:\Users\ { user名 } \AppData\Local\Google\Cloud SDK\google-cloud-sdk\bin\docker-credential-gcloud.cmd C:\Users\ { user名 } \AppData\Local\Google\Cloud SDK\g

cloud storageのファイルをインターネット上に外部公開するときによく使うgsutilコマンド

リージョン指定してバケットを作成 # -b: バケットレベルのアクセス権限を設定する場合はon。onにすると、オブジェクト単位のACLの設定は無視される。 # -l: バケットのリージョン指定 gsutil mb -b on -l asia-northeast1 gs://{バケット名}/ バケットを外部から認証なしで読み取れるようにする。 gsutil defacl set public-read gs:// { バケット名 } http(s)アクセスされたときのhttpヘッダーの Cache-Control を変更。下記の例では、 max-age を1年(=31536000秒)に設定 # ワイルドカード(*)指定の場合 gsutil -h "Cache-Control:public, max-age=31536000" gs:// { バケット名 } / { ディレクトリ } /* # -rの再帰オプション指定の場合 gsutil -r -h "Cache-Control:public, max-age=31536000" gs:// { バケット名 } / { ディレクトリ } Cloud Storageのキャッシュ設定を こちらの記事 が参考になりました。

gsutilでローカルとCloud Storage上のファイルを同期

gsutilコマンドを使ってGoogle Cloud Storage上のファイルを同期するには、rsyncオプションをつけて、下記のコマンドを実行します。 # -m サポートされている操作(acl ch、acl set、cp、mv、rm、rsync、setmeta)を並行実行して実行時間を短くする # -d 同期先にあって同期元(ローカル)に存在しないファイルを同期先から削除する # -r 再帰的にディレクトリ内のファイルを対象にする gsutil -m rsync -d -r { 同期元のディレクトリ } gs:// { バケット名 } / { 同期先のパス }

Composer is operating significantly slower than normal because you do not have the PHP curl extension enabled.

composer install コマンドを実行したところ下記の警告メッセージが表示されました。 Composer is operating significantly slower than normal because you do not have the PHP curl extension enabled. PHPのcurl extensionが有効でないため、Composerが通常より遅くなると言われているので、PHPのcurl extensionをインストールします。 実際、curl extensionをインストールしないと遅くなりました。 Linuxのディストリビューションに応じて下記のコマンドを実行して、PHPのcurl extensionをインストールします。 apt install php-curl yum install php-curl Windowsの場合は、php.iniを編集してcurl extensionを有効化します。 php.iniの場所は php --ini をPoweerShellやコマンドプロンプトで実行すればわかります。 php.ini内の Loaded Configuration File: 付近で下記の行のコメントを削除して、有効化します。 extension=php_curl.dll

JetBrains社のIDE上のデータベースツールでSSLのエラーでデータベースに接続できない問題

JetBrainsのIDE内のツールを使ってデータベース(MySQL)に接続しようとしたところ、下記のエラーが出て接続に失敗しました。 Failed Cancel Copy Search Error Troubleshooting [08S01] Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate). 少し調べたところ、JetBrainsのIDE内のJavaを使っている部分のエラーであることがわかりました。根本の原因は、 こちらの記事 に書かれていました。 「接続先ホストからJavaが対応していないTLS(いわゆるSSL)のプロトコルバージョンを要求されたときに出る」ものとのことです。 サーバー側のTLSの設定を変えられない場合、Javaのクライアント側で対応していないTLSのプロトコルバージョンを許可することでこのエラーは回避できます(セキュリティレベルの低いプロトコルを許可することになるので、そのリスクを理解したうえで作業を実施してください)。 C:\Program Files\JetBrains\{JetBrainsのIDE}\jbr\conf\security\java.security 内の下記の記述の部分からTLSv1, TLSv1.1を削除します。 # Note: This property is currently used by the JDK Reference implementation. # It is not guaranteed to be examined and used by other implementations. # # Example: # jdk.tls.disabledAlgorithms=MD5, SSLv3

Symfony 5.xで不要なバンドルを削除する方法

Symfony 5.xで不要なバンドルを削除は下記の手順で実施できます。 config/bundles.phpからバンドルを削除 config/packageディレクトリ内の関連yamlファイルを削除(Kernel.php内で読み込まれている) composer remove vendor/package を実行。 ちなみにバンドルを削除ではなく、ロードしないようにする(無効化する)には、 config/bundles.php内でバンドルを読み込まないようにfalseに設定。 XXXBandle::class => ['all' => false], config/packages/内のyamlを削除 すればOKです。

Windows上でcomposer updateコマンドを実行した場合NoSslExceptionエラー

Windows上でcomposer updateを実行して、 [Composer\Exception\NoSslException] The openssl extension is required for SSL/TLS protection but is not available. If you can not enable the openssl extension, you can disable this error, at your own risk, by setting the 'disable-tls' option to true. というエラーが出た場合、下記の手順に従ってPHPのopenssl extesnionを有効にする必要があります。 PHPがインストールされたフォルダ内のphp.iniファイルを開きます。 extension=php_openssl.dll の含まれている行を探す 行の先頭にあるセミコロン(;)を削除してコメントイン

git rm --cached {ファイル名}:ファイルをGitの管理対象から除外する

Gitから 特定のファイルを管理対象から除外するには、 git rm --cached {ファイル名} とします。 ディレクトリを除外するには、 -r オプションを付けて git rm --cached -r {ディレクトリ名} とします。 --cached オプションを付けないとファイルごと削除されるので注意してください。

firebase emulatorへ他のコンピュータから接続させる方法

firebaseのエミュレーターのサービスをネットワーク上の他のコンピュータから接続させる方法を紹介します。 firebase.jsonに "host": "0.0.0.0" の設定を加えます。下記はfunctionsに設定を加えた例です。 "emulators" : { "functions" : { "port" : 5001 , "host" : "0.0.0.0" } , "firestore" : { "port" : 8080 } , "hosting" : { "port" : 5000 } } サーバでは、0.0.0.0は「ローカルマシン上の全てのIPv4アドレス」を意味するので、上記の設定で、firebaseのエミュレータを起動すると、同じネットワークの他のホストからもアクセスできるようになります。 WindowsのFirewallの設定で他のコンピュータから接続させたいポートを開けます。 タスクバーの検索メニューに「Windows Defender Firewall with Advanced Security」と入力してFirewallの設定を開く。 左側のメニューから「Inbound Rules」を選択して、右側のメニューから「New Rule…」を選択して「New Inbound Rule Wizard」を起動。 Rule Type: Portを選択。 Protocol and Ports: TCP, firebaseのエミュレータで開けたいポートを入力 Action: Allow the connectionを選択。 Profile: ネットワーク環境に応じて選択。家や社内のネットワークで利用するだけならば、Privateで十分なはず。 Name: 適当な名前を付ける。

C#でenumに定義された値の一覧を取得する方法

下記のコードでenumに定義された値の一覧を取得できます。 // MyEnumの部分を一覧を取得したいenumに書き換えてください。 var enums = Enum . GetValues ( typeof ( MyEnum ) ) . Cast < MyEnum > ( ) ; // ループしてプリントしてみる。 foreach ( var @ enum in enums ) { Console . WriteLine ( @ enum . ToString ( ) ) ; } ちなみにコード内の「@」はC#の予約語を変数名で使えるようにするためのものです。 さらに下記のようGenericsを使って一般化したメソッドを定義できます。 public static IEnumerable < T > IterateEnum < T > ( ) where T : Enum = > Enum . GetValues ( typeof ( T ) ) . Cast < T > ( ) ;

1つのサーバーからGitHubの複数のプロジェクトにSSHの公開鍵を登録

秘密鍵と公開鍵のペアをリポジトリの数だけ作成。 $ ssh-keygen -t rsa -C "repo1" $ ssh-keygen -t rsa -C "repo2" 作成中にファイル名を指定できるので、それぞれの鍵にユニークな名前で作成。例えば下記のようにリポジトリの名前と紐づくように作成。 $ ~/.ssh/repo1_rsa $ ~/.ssh/repo2_rsa ~/.ssh/repo1_rsa,pub , ~/.ssh/repo2_rsa,pub の公開鍵の内容をGitHubのそれぞれのリポジトリの https://github.com/ima-create/{repojitory}/settings/keys で公開鍵を登録。 ~/.ssh/config ファイルに下記のように設定を記述。大事なのはHostの部分で{サブドメイン}.github.comとすること。 Host repo1.github.com HostName github.com User git IdentityFile ~/.ssh/repo1_rsa Host repo2.github.com HostName github.com User git IdentityFile ~/.ssh/repo2_rsa cloneするGitHubのリポジトリのURLに ~/.ssh/config ファイルで設定したサブドメインを含んだを指定すればSSHの認証が通ってクローンできる。 git clone git@repo1.github.com:{name}/{repogitory1}.git git clone git@repo2.github.com:{name}/{repogitory2}.git

NetBeansがアンインストールできない問題

WindowsのコントロールパネルからNetBeans (バージョンは12)をアンインストールしようとしたところ、Javaが正しく設定されていないとかのエラーが出て、アンインストールできなくなってしまいました(画像のキャプチャをとり忘れてしまった)。 NetBeansインストール後に別バージョンのJDKをインストールし直したのが原因かも知れません。筆者の環境ではAdoptOpenJDKのjdk-8とjdk-16をインストールしてありました。 エラーメッセージのダイアログ内に「–javahome」でJDKを指定することができると書いてあったので、PowerShellを管理者モードで起動して、NetBeansのアンインストーラーに「–javahome」オプションを使ってJDKを指定したところ、無事アンインストールできました。 C:\Program Files\NetBeans-12.0> .\uninstall.exe --javahome "C:\Program Files\AdoptOpenJDK\jdk-16.0.1.9-hotspot" 補足 筆者の環境では、NetBeansのアンインストーラーは C:\Program Files\NetBeans-12.0\uninstall.exe にありました。 jdk-8ではunsupported javaバージョンというダイアログが出て、アンインストールが進みませんでした。 アンインストール後もC:\Program Files\NetBeans-12.0のディレクトリが残っていたので手動で削除しました。

Firebaseでエミュレータを設定(確認)する方法

サーバサイドのfirebase-adminの場合 Node.jsを利用したサーバー側では、 process.env を参照するとFirebase functionsの実行環境の情報を取得できます。 firebase-admin を利用したエミュレータ環境の設定も process.env から確認できます。index.jsに下記のログ出力を加えてみます。 console.log(JSON.stringify(process.env, null, 3)); firebase emulators:start を実行してエミュレータ環境でfirebaseを起動させると、エミュレータの設定状況に応じて、下記のようなエントリがログ出力されます。 "FIREBASE_AUTH_EMULATOR_HOST" : "localhost:9099" "FIREBASE_DATABASE_EMULATOR_HOST" : "localhost:9000" , "FIREBASE_STORAGE_EMULATOR_HOST" : "localhost:9199" , "FIRESTORE_EMULATOR_HOST" : "localhost:8080" , "FUNCTIONS_EMULATOR" : "true" index.js内で firebase-admin から作成されたサービスはすべてエミュレータに接続されます。 const admin = require ( 'firebase-admin' ) ; admin . initializeApp ( { credential : admin . credential . cert ( "XXXXXXXX.json" ) , storageBucket : "YYYYYYY.appspot.com" , } ) ; admin . firestore ( ) ; admin . storage (

Firebase functionでPromiseをreturnしないとPromise内の処理が不安定になる

Node.jsでfirebase functionsを開発していると、Promiseを使う場面が多いと思いますが、Promiseをfunctionでreturnしないと、functionの処理に非常に時間がかかったり、処理が非常に不安定になるようです。 const myPromise = new Promise ( ( resolve , reject ) => { // なんか処理 } ) ; // myProimise内での処理とは無関係にfunctionのレスポンスを返す。→ 不安定 exports . notReturnPromise = functions . https . onCall ( ( data , context ) => { myPromise . then ( ( ) => { } ) ; return { "code" : "success" } ; } ) ; // myProimise内での処理が終わったらfunctionのレスポンスを返す。→ レスポンスは遅くなるが安定 exports . returnPromise = functions . https . onCall ( ( data , context ) => { return myPromise . then ( ( ) => { return { "code" : "success" } ; } ) ; } ) ; 筆者の環境ではPromiseをreturnしなかった場合、下記のような不具合が多発しました。 Cloud Storageへのアップロードに時間がかかったり、SSLの認証で落ちる firestoreのtransaction処理でエラーが多発 timeout transaction missingなどなど functionでPromiseをreturnするようにしたところ、上記の問題は発生しなくなりました。 functionはPromiseがresolveされるまで、レスポンスを返さないので、Promiseのresol

Windowsで英語化したのに一部日本語が残ってしまった問題

Windowsの表示言語を英語化したにもかかわらず、一部、日本語が残ってしまうという問題に遭遇しました。具体的には、下記のキャプチャのように、Windowsの設定のサジェストで表示される部分に日本語が残ってしまいました。 Googleで調べて下記の方法を試してみましたが、いずれの方法でも解決しませんでした。 レジストリ確認 言語設定まわりの設定 Power Shellから日本語の言語パックをアンインストール うまく行った方法 表示言語を日本語に設定する ↓ パソコン再起動 ↓ 表示言語を英語に設定する ↓ 日本語の言語パックをアンインストール ↓ パソコン再起動 ↓ 完全に英語表示になった。 必要に応じて、日本語の言語パックを再度インストール。 最終手段 前述の方法でもうまく行かないパソコンもあったので、さらに調査したところ、言語パックを完全に再インストール(Windowsにキャッシュされていない状態)できれば、直ることがわかってきました。 ところが、言語パックを再インストールしても、Windowsに残っているキャッシュを再利用してしまうようで、何度やっても一部日本語が残ってしまうので悪戦苦闘していました。 結局、まだ初期にセットアップしたばかりのアカウントだったので、 ユーザを作り直して英語の言語パックを入れ直した ところ、完全に英語化されました。あまりスマートではないですが、結果オーライです。。。

Unity 2021.3.3f1でのAndroidビルド失敗

事象 下記のエラーが出てAndroidビルドに失敗。他にもエラー出ていたが下記のエラーが根本原因。 FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':launcher:mergeReleaseNativeLibs'. > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade > More than one file was found with OS independent path 'lib/arm64-v8a/libopenxr_loader.so'. If you are using jniLibs and CMake IMPORTED targets, see <https://developer.android.com/studio/preview/features#automatic_packaging_of_prebuilt_dependencies_used_by_cmake> * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at <https://help.gradle.org> BUILD FAILED in 24s 重要なのは、 「More than one file was found with OS independent path ‘lib/arm64-v8a/libopenxr_loader.so’」 の部分。 どうもlibopenxr_loader.soがビルド時に複数参照されていることが原因のよう。libopenxr_loader.soファイル自体はOpen XRプラグインに含まれている。

UnityプロジェクトでNuGetパッケージを入れる

(方法1) NuGetでDLLを落としてきてプロジェクトに含める UnityプロジェクトでNuGetパッケージを入れる方法は、こちらの動画が参考になります。 https://www.youtube.com/watch?v=GRn49ehm_pI CLIからNuGetパッケージをインストールする一般的な方法。 https://docs.microsoft.com/en-us/nuget/consume-packages/install-use-packages-powershell (方法2) NuGet for Unityを使う https://baba-s.hatenablog.com/entry/2018/01/25/095900 を参考。 https://github.com/GlitchEnzo/NuGetForUnity/releases/ から NuGetForUnity.X.X.X.unitypackageをダウンロード。 Unity プロジェクトにインポート。 インポートするとUnity内にNuGetのメニューが追加される。クリックするとウィンドウが開くのでそこから必要なNuGetパッケージをインストール。

C#のClassとStruct

C#のClassとStructの性能や使い分けについてメモ。 https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/struct https://medium.com/@mdfarragher/whats-faster-in-c-a-struct-or-a-class-99e4761a7b76 https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/choosing-between-class-and-struct?redirectedfrom=MSDN

Windowsで言語パックを強制的に削除

Windows PowerShellを管理者権限で起動。 まずは、インストールされている言語パックの一覧を取得 Get-WinUserLanguageList 下記のコマンドで{language tag}の部分に削除したい言語タグ(例: en-US)を当てはめて実行すればOKです。 $LangList = Get-WinUserLanguageList $MarkedLang = $LangList | where LanguageTag -eq "{language tag}" $LangList.Remove($MarkedLang) Set-WinUserLanguageList $LangList -Force

背景が透過pngの画像をPaint 3Dでつくる

Windowsに標準でインストールされているPaint 3Dを使うと背景が透過pngの画像を作成できます。 上部のメニューの「Canvas」→右のメニューの「Transparent canvas」をオンにすれば作成できます。

WindowsでドメインのIPアドレスを調べる

WindowsでドメインのIPアドレスを調べるには下記のコマンドを使います。 nslookup dig (こちらはLinxu系のOSで主流のコマンドなので こちらの記事 を参考に別途インストールが必要) nslookupコマンドでは、応答が加工されて一部情報が表示されていないため、digコマンドを使う方がより正確な情報を得られます。

自分のPCが所属しているActive DirectoryのWindows ドメインを調べる方法

Windows Power ShellかCommand Promptで下記のコマンドを実行すると自分のPCの所属しているActive DirectoryのWindowsドメインがわかります。 > systeminfo | findstr /B "Domain" Domain: WORKGROUP もしActive Directoryのドメインに参加していなければ、上記の例のように&quote;'Domain: WORKGROUP&quote;と表示されます。ドメインに参加していれば、&quote;WORKGROUP&quote;以外の文字列が表示されます。

Ubuntu 22.04 LTS起動時に表示されるエラー

こちらの記事 を参考にWSL2上のUbuntuをアップデートした後、Ubuntuの起動時に /etc/update-motd.d/50-landscape-sysinfo: 17: cannot create /var/lib/landscape/landscape-sysinfo.cache: Permission denied というエラーメッセージが表示されるようになりました。実害はないのですが、気持ち悪いので消す方法を調べたところ こちらの情報 を見つけました。 下記のコマンドを実行し、Ubuntuを再起動したところ無事、エラーメッセージが消えました。 sudo apt remove landscape-common sudo apt autoremove # Optionally, but recommended rm ~/.motd_shown ちなみにWSL2上のUbuntuは、Windows Power Shellかコマンドプロンプトで下記のコマンドを実行してシャットダウンできます。その後またUbuntuを起動すればOKです。 wsl.exe --shutdown