OSビルド15002で加わったWSLの変更点

執筆時点の最新Windows 10 Insider PreviewはOSビルド15007だが、WSLの公式ブログでは、OSビルド15002に関する変更点が述べられている。詳しくはリンク先をごらんいただきたいが、興味深いのは一部のNETLINK_ROUTEメッセージを実装した点だ。Linux IPv4ルーティングソケットとなるRTM_NEWADDRがWSLで利用可能になることで、「ip addr add」といったコマンドがサポートされている。

Microsoft シニアプログラムマネジャーであるRich Turner氏は「Windows管理者が必要」と説明しているが、「sudo」コマンドを追加してもアクセスを拒否されてしまう。そこで各セッションをすべて終了し、BUW(Bash on Ubuntu on Windows)をコンテキストメニューから<管理者として実行>で起動し、「ip addr add~」と実行すると、正しく動作することが確認できた。「ConEmu」などのターミナル(端末)を使っている場合、ユーザー権限でBUWを起動するため、場合によっては何らかの再設定が必要になりそうだ。

管理者権限で起動すると「ip」コマンドのaddやdelが使用可能になる

BUWを管理者権限で起動する場合、1セッションしか利用できない

この他にも環境変数「TERM」の既定値を「xterm-256color」に変更し、/proc/sys/vm/overcommit_memoryや/proc/net/routeを実装しているが、気になるのがコマンドプロンプト(Bash)上で[Ctrl]+[C]キーによるコピー機能が動作しない点である。Turner氏の説明によれば、コンソール(コマンドプロンプト)とBUWは異なる組織の2チームによって構築し、定期的な協力関係にあるものの、異なるリズムで作業を行っているという。コンソールチームは古いコードを見直しつつ、再モデリングや近代化といった作業を行っているが、大半はコマンドプロンプトやPowerShell上でのテストに費やされている。そのため、BUW上での動作に支障が生じた訳だ。

不幸にも両チームの大半がクリスマス休暇に突入し、既にOSビルド15002以降の新ビルドでは修正コードが組み込まれる予定とTurner氏は述べているが、OSビルド15007でも修正されていない。バグフィックスや新機能の実装は重要度に応じて優先順位があるため、このような結果に至ったのだろう。Windows 10の開発内部をかいま見るような話なので、今回紹介することにした。

R言語でドライブを占有するフォルダーを可視化する

さて、前回のシェルスクリプトはテキストベースでグラフを作成したが、やはりグラフィカルに作成した方が見栄えもよい。Linuxには画像加工の定番ツールである「ImageMagick」があるものの、今回のように数値化した内容を元に画像作成する場合は不向きのようだ。そこで統計解析向けのプログラミング言語である「R」を使うことにした。Ubuntuの標準パッケージには組み込まれていないため、リポジトリを追加するなど事前準備を行おう。

「cat /etc/lsb-release | grep CODE」を実行してUbuntuのコードネームを確認してから、「/etc/vim/apt/sources.list」を任意のテキストエディターで開く

「deb https://cran.ism/ac/jp/bin/linux/ubuntu xenial/」とコードネームに合わせた内容を追記する

上記の手順で注意すべきは、Ubuntuのコードネームを入力する点。筆者はWindows 10 Insider Previewを使っているため、Ubuntu 16.04の「Xenial」となるが、Ubuntu 14.04の場合は「Trusty」となるはずである。後は公開鍵を登録するために、「gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9」「sudo gpg -a --export E084DAB9 | sudo apt-key add -」を実行した後、「sudo apt-get update」「sudo apt-get install r-base」でパッケージをインストールすればよい。

「R」のインストールを終えたら正しく動作するか、実行してみよう。なお、終了させるには「q()」もしくは「quit()」を実行する

 setwd("/mnt/c/Users/kaz/Desktop")

 jpeg("image.jpg", width=500, height=500, pointsize=12, bg="white")
 args <- commandArgs(trailingOnly=T)

 x <- scan(args[1])

 pie(x, clockwise=TRUE)
 quit()

まずは上記の内容を任意のテキストエディターで作成し、ファイル名「test3.R」をつけて保存しておこう。もちろんsetwd()で指定した作業ディレクトリのパスはご自身の環境合わせて変更してほしい。続いて下記に示したシェルスクリプトも同じように作成する。こちらのファイル名はお好みものでかまわない。後はいつもどおりchmodコマンドで実行権限を付与しておこう。

 #!/bin/bash

 TargetDir=/mnt/c/Windows/*
 TmpFile=$(mktemp)

 du -s $TargetDir 2>/dev/null | sort -n | tail -10 | cut -f1 > $TmpFile
 Rscript --vanilla --slave test3.R $TmpFile
 rm $TmpFile

こちらのシェルスクリプトを実行すると、6行目で実行したドライブを占有するフォルダー(ディレクトリ)の数値を一時ファイルに保存し、その結果をR言語のスクリプトで円グラフを作成する。正直なところR言語に触れるのは今回が初めてのため、構文などおかしいところが残っているかもしれないが、正しく動作するようだ。

シェルスクリプトを実行すると生成されるPNGファイル。R言語を用いて円グラフを作成している

阿久津良和(Cactus)