Windows上のVSCode + Code RunnerでWSLのコマンドを実行する
Visual Studio CodeのCode Runner拡張機能でWindows側から WSL(Windows Subsystem for Linux)のコマンドを実行する設定方法です。
実行環境
- Visual Studio Code自体はWindows 10で実行
- Code Runnerでコードを実行する際、WindowsではなくWSL上のコマンドを実行する
- WSLのLinuxはPengwinを使用
設定方法その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上で実行されている事がわかります。
補足
ちなみに単純化して以下のようにしても、パスがWindowsのフォーマットで渡されるため動作しません。これを避けるために上記の設定ではcd $dir
を入れてカレントディレクトリを移動し、ファイルのフルパスを渡さないようにしています。
{ "code-runner.executorMap": { # 動作しない "perl": "wsl perl" }, }
設定方法その2 - wslpathを使用
最初の設定では「wsl.exe
は実行時のカレントディレクトリをそのまま引き継ぐ」ということを利用してcd $dir
を入れていました。もう1つ、wslpath
を使ってきちんとパスを変換する方法もあります。
{ "code-runner.executorMap": { "perl": "bash -c \"perl $(wslpath $fullFileName)\"" }, }
この場合のbash
はLinux上ではなく、WSLをセットアップするとインストールされるbash.exe
が実行されます。-c
オプションのコマンドはWSL上で実行されるので、Code Runnerのパラメータである$fullFileName
をwslpath
でWSLフォーマットに変換すればいいということになります。カレントディレクトリを変更しないという点では、こちらの方が本来の動作に近いと言えます。
ただし、このパスの途中に空白を含むファイルは実行できません。「方法その1」のcd $dir
方式では問題なく実行できます。
設定方法その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でホームストリーミングすることを狙いました。この記事ではマザーボードの特徴と使用感を紹介していきます。
実は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だと思っていました。
ただし4K 60Hz対応と言ってもヌルヌル動くわけではなく、ブラウザーのスクロールなどは多少カクつきます。
Steamホームストリーミングは1080pで充分快適。Moonlight PCだとさらに綺麗
目的であるゲームのストリーミングプレイは思ったよりラグが少なく、自分の環境では22ms程度の遅延でした。タイミングがシビアなゲームでなければ充分だと思います。ストリーミングはDXVA2のハードウェアデコードが有効になっていました。
NVIDIA SHIELDのゲームストリームがPCでも使えるようになるMoonlight PCも試してみると、さらに綺麗で安定したフレームレートでプレイできました。SteamがH.264でエンコードしているのに対してSHIELDはH.265を使っているので差が出ているのかもしれません。
ケースファンのセミファンレス化が可能
BIOSで呼び出せるQ-Fan controlでは、CPU温度が閾値以下に下がるとケースファンを停止するように設定できます。停止できるのはDC 3ピンコネクターのファンをマニュアル制御で「Fan off」にした場合のみで、PWM 4ピンのファンでは設定できませんでした。
PRIME J4005I-Cその他の特徴
XboxワイヤレスコントローラーがBluetoothで検出できない場合の対処法
PCのシステムを新調し、Windows 10も再インストールしたのでXboxワイヤレスコントローラーをBlutooth接続しようとしたら・・・検出できないぞ?となったので解決法を載せておきます。
BluetoothでXboxコントローラーを接続するときは「マウス、キーボード、ペン、オーディオまたはその他の種類のBluetoothデバイス」を選択します。
下の「その他すべて」という項目に「Xboxコントローラーとワイヤレスアダプター、DLNAなど」と記載されていますが、こちらではコントローラーは検出されません。
久しぶりで忘れていたとは言え、表記が紛らわしいので修正したほうがいいのでは?と思いました。
マイクロソフト ゲームコントローラー Bluetooth/有線接続/xbox one/Windows対応 PC用USBケーブル同梱 4N6-00003
- 出版社/メーカー: マイクロソフト
- 発売日: 2017/02/02
- メディア: Personal Computers
- この商品を含むブログを見る
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ポイントになりました。
Core i5 8400の場合(6コア6スレッド)
シングルスレッドは460ポイント、マルチスレッドは2539ポイントになりました。確かに7700Kに近いですね。
比較結果
Core i7 6700からCore i5 8400にしたことでシングルスレッドは13%、マルチスレッドは38%向上しました。マザーボードも買い替える必要があるので、結局はCore i7 7700Kを買うのと同じくらいの投資になってしまいますが・・・
[Perl6]Unicodeプロパティを使って半角・全角の文字にマッチする正規表現を書く
Perl6で全角文字にマッチする正規表現を書いたり、特定の文字の「幅」を調べる方法です。具体的にはUnicodeのEast_Asian_Width
というプロパティを調べることで半角・全角を判断します。
Unicodeプロパティを表示するにはuniprop
メソッドを使います。
以下のコードでは文字列を1文字ずつに分解し、East_Asian_Width
プロパティを表示します。
for "aaAÅÆ??++22Ⅱあ漢カ㍍".comb -> $char { say $char => $char.uniprop("East_Asian_Width"); }
以下が実行結果です。半角英数字・記号はNa
、全角英数字・記号はF
、ひらがなや漢字はW
、それ以外はN
やA
、半角カタカナはH
となりました。通常の全角日本語であればF
とW
にマッチさせればよさそうです。
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_Width
はea
という省略形があるので以下のように書けます。
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{'} ) => ( '&', '<', '>', '"', ''' ); sub encode-entities(Str $str) { return $str.trans($trans-pair); } my $encoded = encode-entities( q[a & b < c > d " e '] ); say $encoded; # 出力:a & b < c > d " e '
エスケープ済みの文字列を復元するのは簡単で、.trans
メソッドに渡すペアを逆にするだけです。ペアを逆にするには.antipair
メソッドを使います。
my $trans-pair = ( '&', '<', '>', q{"}, q{'} ) => ( '&', '<', '>', '"', ''' ); 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 & b < c > d " e '] ); 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表示も問題ありません。なぜこのような違いがあるのかは後述します。
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万円高い程度のようなので、今から買うならこちらですね。
4K/60HzのHDRではパネルの性能を活かしきれない
ET322QKwmiipxとPS4 Proを接続し、HDRを有効にしたのが以下の画面になります。 カラーフォーマットが「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)が有効になっていることが確認できます。 パネルの表示色は8bitであるものの、色域が DCI-P3カバー率93%だけあって鮮やかです。HDRを有効にすると明かりが本物に近くなり、まぶしく感じるくらいです。
アサシンクリード オリジンズのスクリーンショットです。この画像自体はHDRではありませんが、実際のゲーム画面では日光が本物のように見えます。