同一PC内の複数WindowsアカウントでWSL2ディストリビューションを共有する
結論
wsl --import-in-placeを使用する- vhdxファイルのアクセス許可を設定する
経緯
| Windowsアカウント | 運用 | コーディング | WSL2 |
|---|---|---|---|
| アカウントA | メインで使用 | メインで使用 | メインで使用 |
| アカウントB | 特定用途で使用 | たまに使用 | たまに使用 |
同一PC内で上記のようなアカウント運用を行っていた。
アカウントBでの作業中にちょこちょこ待ち時間が発生するのでコーディングしたくなり...
やるならアカウントAでやっているコーディングの続きがしたい...となった。
環境コピーも考えたが、当然差分ができる上に容量も食うのでなんとか環境を共有できる方向で思案。
手順
- 【アカウントA】 対象ディストリビューションのexport
- 【アカウントA】 別名・別格納場所でimport
- 【アカウントB】 import-in-place
- 【アカウントB】 vhdxファイルのアクセス許可
- 【どちらでも】 ログインユーザー調整
- 【両アカウント】 調整&お掃除
【アカウントA】 対象ディストリビューションのexport
既定のvhdxファイル格納場所(C:\Users\***\AppData\Local\Packages\CanonicalGroupLimited.***\LocalState\ext4.vhdx)はアカウント固有の空間。
そのため、複数アカウントでの共有は控えたくそのまま利用は適わないので一旦使用している環境を出力する。
# 利用しているディストリビューションをシャットダウン wsl --shutdown # ディストリビューションの確認 wsl -l # 対象ディストリビューションを出力 wsl --export 【出力ディストリビューション】 【tar出力パス】 # 例) wsl --export Ubuntu-22.04 C:\wsl2\Ubuntu-2204.tar
【アカウントA】 別名・別格納場所でimport
出力したtarを使い、複数アカウントで共有できる場所をvhdxファイルパスとして指定することで別環境として作り直し。
これで指定したvhdxファイルパスにvhdxファイルが生成される。
# tarをimport wsl --import 【作成するディストリビューション名】 【vhdxファイルパス】 【tarのパス】 # 例) wsl --import Ubuntu-22.04-dev C:\wsl2\wsl2-vhdx C:\wsl2\Ubuntu-2204.tar
【アカウントB】 import-in-place
前手順で生成されたvhdxファイルパスを指定してディストリビューションの情報を登録。
# 利用しているディストリビューションをシャットダウン wsl --shutdown # ディストリビューションの確認 wsl -l # アカウントAと同じvhdxファイルパスでimport wsl --import-in-place 【作成するディストリビューション名】 【vhdxファイルパス】 # 例) wsl --import-in-place Ubuntu-22.04-dev C:\wsl2\wsl2-vhdx\ext4.vhdx
【アカウントB】 vhdxファイルのアクセス許可
ディストリビューションの登録はされたが、ログインを試みるとアクセスエラーでログインできないためWindows側のアクセス許可を調整。
ディスク ''をWSL2にアタッチできませんでした:アクセスが拒否されました。 エラーコード:Wsl/Service/CreateInstance/MountVhd/HCS/E_ACCESSDENIED
- 【vhdxファイルパス】/ext4.vhdxを右クリック
- プロパティ → 「セキュリティ」タブ → 詳細設定 → 「アクセス許可」タブ → 「アクセス許可エントリ」タブ内の追加
- プリンシパルの選択 → 詳細設定 → 検索 → 「検索結果」からアカウントBを選択 → OK → OK → 「フル コントロール」をチェック → OK → OK
【どちらでも】 ログインユーザー調整
wsl --importを行うとrootユーザーログインになってしまうので、使用するユーザーでログインできるようにディストリビューション内で調整。
# ディストリビューション内にてログインユーザー指定を追記 sudo vi /etc/wsl.conf
[user] default=【使用したいユーザー名】
【両アカウント】 調整&お掃除
# 既定ディストリビューションの調整 wsl --set-default 【作成したディストリビューション】 # 既存ディストリビューションの削除(任意) wsl --unregister 【既存ディストリビューション】
まとめ
vhdxファイルの格納パスを調整してwsl --import-in-placeすることで複数アカウントでの同一のディストリビューション共有は可能。
アカウントBでwsl --importしてしまうとエラーになってしまう。
指定されたインストール場所は既に使用されています。 エラー コード: Wsl/Service/RegisterDistro/ERROR_FILE_EXISTS
推測だが、importはvhdxファイル生成およびwsl2にディストリビューションの登録を行う挙動になっていて、すでにvhdxファイルがある場合を許容していないのかと。
import-in-placeでは、すでにあるvhdxファイルを参照してディストリビューションの登録のみを行っているように思える。
参考
Error code: Wsl/Service/CreateInstance/MountVhd/HCS/E_ACCESSDENIEDntVhd/HCS/E_ACCESSDENIED - Microsoft Q&A
https://learn.microsoft.com/en-us/answers/questions/1697336/error-code-wsl-service-createinstance-mountvhd-hcsE_ACCESSDENIED after wsl --update · Issue #9362 · microsoft/WSL
https://github.com/microsoft/WSL/issues/9362#issuecomment-1998349005WSL の基本的なコマンド | Microsoft Learn
https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands#import-a-distribution
https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands#import-a-distribution-in-place
メモ -Error: Failed to lookup view ”error” in views directory-
Express4系 + ectで動かしていたページにアクセスしようとしたら下記エラーが発生
「Error: Failed to lookup view "error" in views directory "hogehoge"」
調べてみても、どうも有益な情報が見当たらない。
きりがないので試しに別環境を作って、git cloneして試してみる。
エラーが出ずに問題なく動く…
さて、安心しつつ弱った。
とりあえず、差異を探しつつ検索を続ける。
手詰まったので、pm2 killしてからpm2 startでプロセス自体を再起動してみた。
エラーが出ずに問題なく動く…
さて、原因がわからず弱った。
とりあえず、半日詰まった内容が解決したので考えるのをやめた。
まとめ
Android Studioが便利なのはよーくわかっているが、プロジェクト構成ではまるポイントが多くて疲れる。
lint警告
- 現象:ビルドした際にuncehckedやdeprecationの警告ログが出てビルドが成功しない
警告レベルとは言っても未確認処理や不適切処理だから直せやと怒られている。
- 理由:ソース上の不備もしくはlintの設定による回避を行っていない
まぁ、不適切な処理を使っていると怒られているので修正するのが最善だが、
そうも言ってられない事情もある…ので回避することにする。
ちなみに、該当部分の詳細なログが欲しい場合は下記をbuild.gradleに記載。
(これを回避処理と勘違いしてはまったのは内緒…)
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
}
}
}
- 解決:build.gradleにlintOptionsを仕込む
android{
省略
lintOptions {
abortOnError false
warningsAsErrors true
lintConfig file("app/lint.xml")
}
}
記載内容にもあるが、appディレクトリ配下に下記の「lint.xml」を置いてある。
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<issue id="MissingTranslation" severity="warning" />
</lint>
褒められたやり方ではないのは百も承知…
ライブラリの重複
- 現象:ログにて以下のエラー(一部省略)が発生
com.android.dex.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
- 理由:取り込み済みライブラリが外部モジュールにも使用されていた
/libsディレクトリに「android-support-v4.jar」を置いていたが、
導入した外部モジュールであるdrag-sort-listview内にも同ファイルが存在していたため怒られていた。
(おかげで半日程はまった…)
- 解決:build.gradleを修正
build.gradle内のライブラリ記載箇所を修正
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
// compile 'asia.ivity.android:drag-sort-listview:1.0' と記載していたのを下記に修正
compile ('asia.ivity.android:drag-sort-listview:1.0'){
exclude module: 'support-v4'
}
}
AWSにてnode.js, express4.xをインストールしてhttps接続を行う
Amazon EC2にてインスタンス起動
Keyの作成
putty使用場合pemをputtygenにてppkに変換。
ログイン設定
準備
インスタンス内モジュールのアップデート
$ sudo yum update
gitのインストール
$ sudo yum install git
nvmのインストール
・gitリポジトリからクローン
$ git clone https://github.com/creationix/nvm.git ~/.nvm
・コマンド対応
$ source ~/.nvm/nvm.sh
node.jsのインストール
・node.jsのリリースバージョン確認
$ nvm ls-remote
・対象となるnode.jsのインストール
$ nvm install v[バージョンNo]
PM2のインストール(グローバル)
$ npm install pm2@latest -g
expressのインストール
$ npm install express
expressコマンドのインストール(グローバル)
$ npm install -g express-generator
expressアプリケーションを作成
expressコマンドを使わずシンプルなコードで確認
適当なディレクトリを作成して下記ファイルを配置
app.js
var express = require('express'); var app = express(); var port = 3000; app.get('/', function (req, res) { res.send('Hello, World!'); }); app.get('/port', function(req, res) { res.send(String(port)); }); app.listen(port); console.log("server starting...port:"+ port);
package.json
"name": "express-sample", "version": "0.0.1", "private": true, "scripts": { "start": "node app" }, "dependencies": { "express": "*" } }
起動
$ pm2 start app.js
expressコマンドにて作成したアプリの確認
アプリ作成
$ express [アプリ名]
起動
$ npm start
PM2でデーモン化して起動
・pm2起動用準備
express4.xのexpressコマンドで作成したアプリはそのままではpm2での起動ができない。
原因は、初期起動用の [アプリ名]/bin/www に拡張子が付いていないため(人に教えていただきました。)
なので、バックアップついでに拡張子を付与する。
$ cd bin/ $cp ./www ./www.js
・pm2で起動
$ pm2 start wwww.js
・確認
$ pm2 ls
httpsでのアクセス
証明書を作成
$ openssl genrsa -aes128 1024 > server.pem $ openssl req -new -key server.pem> server.csr $ openssl x509 -in server.csr -days 365 -req -signkey server.pem > server.crt $ openssl rsa -in server.pem -out server.rsa
https用にwww.jsを書き換え
・作成した証明書類を適当なディレクトリで管理
www.js
var debug = require('debug')('web');
var https = require('https');
var app = require('../app');
var fs = require('fs');
var port = 3000;
var options = {
key: fs.readFileSync('../keys/server.rsa'),
cert: fs.readFileSync('../keys/server.crt')
};
//var server = app.listen(app.get('port'), function() {
https.createServer(options, app).listen(port);
参考
ListViewでスクロール時に背景色が黒くなってしまう現象について
環境が激変。
かなり前に書いておいた内容を確認もせずに記載。
この訳あっているかなぁ…
Contextについて
Interface to global information about an application environment.
(アプリケーションの環境についての全体的な情報をインターフェースする。)
This is an abstract class whose implementation is provided by the Android system.
(これはアンドロイドシステムによって提供される実行の抽象クラスです。)
It allows access to application-specific resources and classes,
as well as up-calls for application-level operations such as launching activities,
broadcasting and receiving intents, etc.
(ブロードキャスティングやインテントへの返答、アクティビティの実行などの
アプリケーションレベルでの動作のアップコールだけでなく、
アプリケーションで明記した資源やクラスへのアクセスを許可を行う。)
ListViewでスクロール時に背景色が黒くなってしまう現象について
setScrollingCacheEnabled(false)
Enables or disables the children's drawing cache during a scroll.
By default, the drawing cache is enabled but this will use more memory.
When the scrolling cache is enabled, the caches are kept after the first scrolling.
You can manually clear the cache by calling setChildrenDrawingCacheEnabled(boolean).
(スクロール中の子要素の描写キャッシュを可能か不可能にする。
通常、描写キャッシュは可能になっていますが、これは多くのメモリが使用されるかもしれません。
スクロール動作のキャッシュが可能の時、キャッシュは最初のスクロール動作後に維持されます。
setChildrenDrawingCacheEnabled(boolean)を呼び出すことで手動でキャッシュをクリアすることができます。)
こちらはスクロール時に黒くなる現象を抑えられる
また、リスト上下端にあるまだ読み込み先があることを表示する黒線もそのまま表示
上下どちらかの限界までスクロールしたことを通知する青線も表示
android:cacheColorHint="#00000000"
こちらもスクロール字に黒くなる現象を抑えられる
また、リスト上下端にあるまだ読み込み先があることを表示する黒線も抑えられる
読み込み限界時の青線についてはそのまま表示される