実録コンピュータ物語

趣味で使っているコンピュータ&アプリの情報を発信するブログです。

Windows上のVSCode + Code RunnerでWSLのコマンドを実行する

Visual Studio CodeCode Runner拡張機能Windows側から WSL(Windows Subsystem for Linux)のコマンドを実行する設定方法です。

実行環境

設定方法その1 - カレントディレクトリを移動して実行

例としてWSLのperlを実行するようにします。Visual Studio Codeのユーザー設定(settings.json)に以下のように入力します。WSLのコマンドの呼び方は 「Windows 10のコマンドプロンプトからWSL上のLinuxコマンドを呼び出す(バージョン1803対応版):Tech TIPS - @IT」が詳しいです。

{
    "code-runner.executorMap": {
        "perl": "cd $dir && wsl perl $fileName"
    },
}

試しに実行中のOSを出力するperlスクリプトを実行してみます。Windows版のperlだと「MSWin32」となる所が「linux」になり、WSL上で実行されている事がわかります。

f:id:bosh:20190609152116p:plain
WSL上のperlが実行された

補足

ちなみに単純化して以下のようにしても、パスがWindowsのフォーマットで渡されるため動作しません。これを避けるために上記の設定ではcd $dirを入れてカレントディレクトリを移動し、ファイルのフルパスを渡さないようにしています。

{
    "code-runner.executorMap": {
        # 動作しない
        "perl": "wsl perl"
    },
}

f:id:bosh:20190609153116p:plain
パスのフォーマットがWindowsのままなので実行に失敗する

設定方法その2 - wslpathを使用

最初の設定では「wsl.exeは実行時のカレントディレクトリをそのまま引き継ぐ」ということを利用してcd $dirを入れていました。もう1つ、wslpathを使ってきちんとパスを変換する方法もあります。

{
    "code-runner.executorMap": {
        "perl": "bash -c \"perl $(wslpath $fullFileName)\""
    },
}

この場合のbashLinux上ではなく、WSLをセットアップするとインストールされるbash.exeが実行されます。-cオプションのコマンドはWSL上で実行されるので、Code Runnerのパラメータである$fullFileNamewslpathでWSLフォーマットに変換すればいいということになります。カレントディレクトリを変更しないという点では、こちらの方が本来の動作に近いと言えます。

ただし、このパスの途中に空白を含むファイルは実行できません。「方法その1」のcd $dir方式では問題なく実行できます。

f:id:bosh:20190609160225p:plain
wslpathでパスを変換して実行

設定方法その3 - 自力でWSLのパスに変換

パスに空白文字が含まれていても動作するように改良したバージョンです。sedでバックスラッシュをスラッシュに置換→ドライブレター(C:など)を/mnt/cに置換→シングルクオートで囲む、という処理を行っています。エスケープシーケンスが多すぎて分かりづらくなってしまいました。

{
    "code-runner.executorMap": {
        "perl": "bash -c \"perl '$( echo $fullFileName | sed 's%\\\\%/%g' | sed 's%^\\([a-zA-Z]\\):%/mnt/\\L\\1%' )'\""
    },
}

ASUSのファンレスマザーボード「PRIME J4005I-C」でゲームリモートプレイ用PCを作ってみた

ASUSのGemini Lake SoC搭載マザーボードPRIME J4005I-Cを購入しました。目的は「寝ながらPCゲームをプレイする」です。ポータブルモニターとタブレットアームを使い、Steamでホームストリーミングすることを狙いました。この記事ではマザーボードの特徴と使用感を紹介していきます。

www.asus.com

実はHDMI 2.0対応

PRIME J4005I-Cを使ってみて意外だったのが、HDMI端子が4K 3840 x 2160 60Hzに対応していることでした。

スペックに ”Supports HDMI with max. resolution 4096 x 2304 @ 24 Hz” と記載されているので勝手にHDMI 1.4だと思っていました。

f:id:bosh:20180908025130p:plain
4K 60Hz出力に対応

ただし4K 60Hz対応と言ってもヌルヌル動くわけではなく、ブラウザーのスクロールなどは多少カクつきます。

Steamホームストリーミングは1080pで充分快適。Moonlight PCだとさらに綺麗

目的であるゲームのストリーミングプレイは思ったよりラグが少なく、自分の環境では22ms程度の遅延でした。タイミングがシビアなゲームでなければ充分だと思います。ストリーミングはDXVA2のハードウェアデコードが有効になっていました。

NVIDIA SHIELDのゲームストリームがPCでも使えるようになるMoonlight PCも試してみると、さらに綺麗で安定したフレームレートでプレイできました。SteamがH.264エンコードしているのに対してSHIELDはH.265を使っているので差が出ているのかもしれません。

github.com

ケースファンのセミファンレス化が可能

BIOSで呼び出せるQ-Fan controlでは、CPU温度が閾値以下に下がるとケースファンを停止するように設定できます。停止できるのはDC 3ピンコネクターのファンをマニュアル制御で「Fan off」にした場合のみで、PWM 4ピンのファンでは設定できませんでした。

PRIME J4005I-Cその他の特徴

  • モリーはデスクトップ用のUDIMMを使用します。対してASRockのGemini LakeマザーはノートPC用のSODIMMです。
  • NVMeのM.2 SSDを使用できます。ただしPCIE 2.0 x 2接続なので、x 4のSSDでは性能をフルに発揮できません。
  • このマザーボードに限ったことではないですが、Intel graphicsは初期設定でRGBがリミテッドレンジになっています。「量子化の範囲」という設定を「全範囲」にすることでフルレンジにできます。

XboxワイヤレスコントローラーがBluetoothで検出できない場合の対処法

PCのシステムを新調し、Windows 10も再インストールしたのでXboxワイヤレスコントローラーをBlutooth接続しようとしたら・・・検出できないぞ?となったので解決法を載せておきます。

BluetoothXboxコントローラーを接続するときは「マウス、キーボード、ペン、オーディオまたはその他の種類のBluetoothバイス」を選択します。

下の「その他すべて」という項目に「Xboxコントローラーとワイヤレスアダプター、DLNAなど」と記載されていますが、こちらではコントローラーは検出されません

久しぶりで忘れていたとは言え、表記が紛らわしいので修正したほうがいいのでは?と思いました。

f:id:bosh:20180501124518p:plain

CPUをCore i7 6700からCore i5 8400に変更したので性能を比較してみた

PCのシステムを更新して、CPUをCore i7 6700(Skylake)からCore i5 8400(Coffee Lake)にしました。

i5 8400の性能はi7 7700Kに匹敵すると言われており、簡易的ですがCPU-Zベンチマークで確認してみました。

Core i7 6700の場合(4コア8スレッド)

シングルスレッドは407ポイント、マルチスレッドは1833ポイントになりました。 f:id:bosh:20180430232205p:plain

Core i5 8400の場合(6コア6スレッド)

シングルスレッドは460ポイント、マルチスレッドは2539ポイントになりました。確かに7700Kに近いですね。 f:id:bosh:20180430232215p:plain

比較結果

Core i7 6700からCore i5 8400にしたことでシングルスレッドは13%、マルチスレッドは38%向上しました。マザーボードも買い替える必要があるので、結局はCore i7 7700Kを買うのと同じくらいの投資になってしまいますが・・・

[Perl6]Unicodeプロパティを使って半角・全角の文字にマッチする正規表現を書く

Perl6で全角文字にマッチする正規表現を書いたり、特定の文字の「幅」を調べる方法です。具体的にはUnicodeEast_Asian_Widthというプロパティを調べることで半角・全角を判断します。

Unicodeプロパティを表示するにはunipropメソッドを使います。 以下のコードでは文字列を1文字ずつに分解し、East_Asian_Widthプロパティを表示します。

for "aaAÅÆ??++22Ⅱあ漢カ㍍".comb -> $char {
    say $char => $char.uniprop("East_Asian_Width");
}

以下が実行結果です。半角英数字・記号はNa、全角英数字・記号はF、ひらがなや漢字はW、それ以外はNA、半角カタカナはHとなりました。通常の全角日本語であればFWにマッチさせればよさそうです。

a => Na
a => F
A => Na
Å => N
Æ => A
? => Na
? => F
+ => Na
+ => F
2 => Na
2 => F
Ⅱ => A
あ => W
漢 => W
カ => H
㍍ => W

Perl6の正規表現Unicodeプロパティを使うには<:プロパティ名>という形式を使用します。また、+で連結することで文字集合を合成できます。

さらに、East_Asian_Widtheaという省略形があるので以下のように書けます。

my $str = "はいおgふrtjrtw吸うrwぇjおare+JerOwHr歩wえwgweおぐぇいおhio";

# 全角文字にマッチ
say $str ~~ m:global/ <:ea('W')+:ea('F')>+ /;
# 出力:(「はいおgふ」 「吸う」 「ぇ」 「お」 「+」 「歩」 「え」 「おぐぇいお」)

# 半角文字にマッチ
say $str ~~ m:global/ <:ea('Na')>+ /;
# 出力:(「rtjrtw」 「rw」 「j」 「are」 「JerOwHr」 「w」 「wgwe」 「hio」)

参考情報

[Perl6]HTMLエスケープはtransメソッドを使おう

HTMLやXMLの処理でよくある特殊文字& < > ' "」のエスケープをPerl 6でやってみましょう。

Perl 6の文字列には.transという便利なメソッドがあります。これは変換前→変換後のペアを受け取って文字の変換を行ってくれます。

my $trans-pair = ( '&', '<', '>', q{"}, q{'} ) =>
        ( '&amp;', '&lt;', '&gt;', '&quot;', '&apos;' );

sub encode-entities(Str $str) {
    return $str.trans($trans-pair);
}

my $encoded = encode-entities( q[a & b < c > d " e '] );
say $encoded;
# 出力:a &amp; b &lt; c &gt; d &quot; e &apos;

エスケープ済みの文字列を復元するのは簡単で、.transメソッドに渡すペアを逆にするだけです。ペアを逆にするには.antipairメソッドを使います。

my $trans-pair = ( '&', '<', '>', q{"}, q{'} ) =>
        ( '&amp;', '&lt;', '&gt;', '&quot;', '&apos;' );

sub encode-entities(Str $str) {
    return $str.trans($trans-pair);
}

sub decode-entities(Str $str) {
    return $str.trans($trans-pair.antipair); # ペアを逆にして渡す
}

my $decoded = decode-entities( q[a &amp; b &lt; c &gt; d &quot; e &apos;] );
say $decoded;
# 出力:a & b < c > d " e '

HDR対応モニター Acer ET322QKwmiipxとBenQ EW277HDRを購入。PS4 Proと接続した結果

HDR対応モニターを2台購入しました。AcerのET322QKwmiipxとBenQのEW277HDRです。PS4 Proと接続してHDRを試してみました。

先に結果を言うと、ET322QKwmiipx(というか4Kモニター全般)のHDRには落とし穴があります。一方、EW277HDRの映像は鮮やかでHDR表示も問題ありません。なぜこのような違いがあるのかは後述します。

www.acer.com

www.benq.co.jp

BenQ EW3270U発表

2018年3月29日追記:BenQから4K/HDR対応の31.5インチモニターEW3270Uが出ました。DisplayPort 1.4、USB Type C、DCI-P3カバー率95%、B.I.+など、ET322QKwmiipxの完全上位互換と言えるスペックです。値段もET322QKwmiipxより1万円高い程度のようなので、今から買うならこちらですね。

www.benq.co.jp

4K/60HzのHDRではパネルの性能を活かしきれない

ET322QKwmiipxとPS4 Proを接続し、HDRを有効にしたのが以下の画面になります。 f:id:bosh:20171222003248p:plain カラーフォーマットが「YUV422(HDR)」となっています。また、「HDMI 2.0の転送速度の上限により、4K HDRコンテンツを60Hzで表示する時のカラーフォーマットは、RGBの代わりにYUV422またはYUV420が使用されます。」というメッセージが表示されています。

これはET322QKwmiipxに限らず、4K/60Hzモニターでは必ず発生します。RGB(HDR)にするとHDMI 2.0の帯域である18Gbpsを超えてしまうため、HDRと引き換えに色情報の一部を減らしているわけです。

ET322QKwmiipxで気になった点
  • DisplayPortでHDR出力はできません(バージョン1.2なので)
  • カバーする色域がEW277HDRに劣る

不満ばかり書いてしまいましたが、ET322QKwmiipxはHDR関係が少し残念というだけで、通常のモニターとして考えればsRGBカバー率100%、10bit対応と性能は問題ありません。

また、試していませんがUltra HD Blu-rayのように4K/24Hzであれば色情報を減らさずにHDR出力できるはずです。

ゲームでHDRを活かすならEW277HDR

EW277HDRはフルHDで帯域に余裕があるため、4KモニターのようにカラーフォーマットがYUV422に制限されることはありません。RGB(HDR)が有効になっていることが確認できます。 f:id:bosh:20171215004822j:plain パネルの表示色は8bitであるものの、色域が DCI-P3カバー率93%だけあって鮮やかです。HDRを有効にすると明かりが本物に近くなり、まぶしく感じるくらいです。

f:id:bosh:20171222014146j:plain アサシンクリード オリジンズスクリーンショットです。この画像自体はHDRではありませんが、実際のゲーム画面では日光が本物のように見えます。