アーカイブ | 12:16

WindowsとCUI

19 12月

今日はCUIの話をします。

GUIじゃなくてCUI。グイじゃなくてキュイ。グラフィカルじゃなくて、キャラクター。マウスやタッチ操作じゃなくて、全部文字!

なんか鳴き声みたいですけどキュイ。ウェブで「キュイ」で画像検索したらたぶん吹き出しそうな結果が出てきますけど、キュイ。

アップデートしてますか?

みんな、自分の専門外のことについては驚くほど古い知識のまま更新されずにいます。10年前の話を平気でしてきます。きっと、10光年離れた場所から観測しています。

なので、「Windowsはコマンド プロンプトが使いにくいから…」なんてぼやく人がいても、その人を責めることはできないでしょう。

今はPowerShellがあるのに!

PowerShell

正規表現の回とかでもさらっと出しましたが、改めてご紹介いたしましょう。ザNEWコマンド ライン!! PowerShell。

2006年に登場し、Windows 7やWindows Server 2008には標準搭載されています。

以下のような感じで使います(配色は私の好みで白背景に変えています)。

完全に文字だけのコマンド ラインに加えて、コード補完や色付け表示もしてくれるPowerShell ISE(Integrated Scripting Environment)も付属しています。

次期バージョンではISEのUIを一新するようですねぇ。今、CTP2(コミュニティ向け技術プレビュー版の第2版)ですが、以下のような感じになっています。コード補完回りが大幅強化されるようです。

 

GUI vs CUI

昨日に引き続き、「どっちがいいか?」という質問です。答えは「両方」! GUIとCUI、それぞれいいところがあります。

やっぱり、初見のとっつきやすさでいうとグラフィカルな方がわかりやすいです。それに、可視化ってのも大事です。サーバーの状態などを一目瞭然に把握できるような、素敵UIはあった方がいいです。

一方で、繰り返し同じ処理をするような場合は、スクリプト言語を使った操作をしたいです。それに、GUIを付けるというのは、OSのサイズを大きくしますし、セキュリティ アップデートの頻度も増えます。GUIがなくて済むなら、なしで済ませたいです。前述の可視化なんかも、例えばサーバー クラスターだったりすると、クラスター管理している1台だけが持っていれば事足りたりしますし。

ということで、今のWindowsは、GUIにもCUIにも、両方に本気です。GUIに本気なのは当たり前として、CUIもおろそかにしていません。

コマンド ラインにもGUIを欠かさない

もうすでに紹介していますが、PowerShellには、コードの補完や色付けをしてくれる便利なGUI、PowerShell ISEがあります。

手元のGUIありのクライアントOSでスクリプトを書いて、リモートのGUIなしサーバーOSで実行しましょう。

というか、PowerShellはリモート操作機能も備えていたり(手元のPowerShellコンソールでコマンドをたたいて、リモート上でジョブを動かす)。

PowerShell、急拡大中

PowerShellも登場から5年くらい経ち、だいぶこなれてきましたね。基礎がこなれたところで、応用が急速に進んでいます。

Windows Server 8

Window Serverの次期バージョン、今はコードネームでWindows Server 8なんて呼ばれていますが、Windows Server 8の方針としては、サーバー上で動くアプリは「GUIなしが必須」だそうです。

GUIの提供とともに、PowerShellのコマンド(Cmdlet(コマンドレット)といいます)の提供が必須です。

Windows Server 8自身の管理も、Cmdletでできるよう、大量のCmdletが追加されています。

Cmdlet拡充中

Windows Server 8に限らず、マイクロソフトのサーバー製品関連はCmdlet提供が当たり前になってきています。次のバージョンで、軒並みCmdlet化されそうです。

  • SQL Server 2012
    • すでに、2012年中のリリースが確定したようで、SQL Server 2012という名称でリリース候補版が出ています
    • SQL Server Management Studio中に「PowerShellを起動」メニューがあったり
    • ls Tables とかのコマンドでテーブル操作できたり
  • Windows Azure
  • Team Foundation Server

コマンドが主軸 + オブジェクト指向も

今までも、スクリプトでのOS管理というと、VBS、JSあったわけですが。PowerShellはあくまでコマンド ベースなのと、.NET統合が特徴的です。

コマンド ベース

非開発者向け・IT管理者向けだと、コマンド形式の方が良いみたいですね。なので、主軸がコマンドにあります。

PowerShell専用のCmdletと呼ばれるコマンドだけでなく、今まで通りの、単なるコンソール アプリも呼び出せます。

.NET統合

一方で、ちょっと込み入った処理をしたいときには、C#的なオブジェクト指向なプログラムを書くこともできます。ライブラリ的には、.NET Frameworkのクラスをそのまま使えます。

モード切り替え

PowerShellは、2系統の文法(に加えて、文字列中も特殊な処理が入るので、実質3系統)が混ざってて、状況に応じて切り替わっていたりします。

  • コマンド モード
    • 文字列から始めると、コマンドと解釈されます
    • 以降、引用符なしで文字列を受け付けます
    • 付きの文字はオプション
  • 式モード
    • $から始めると式モードと解釈されます
    • 以降、PerlっぽいようなC#っぽいようなOOP言語になります
      • if, switch, while, do-while, for, foreachなども使えます
      • . でメソッド呼び出し、引数には()必要、文字列には引用符必要

 

(= の直後には、モードの再選択が行われます(= の直後を文字列から始めると、コマンドと解釈されます)。

オブジェクト パイプライン

コマンド モードであっても、.NETオブジェクトが中心的な役割りを担います。Cmdlet(PowerShell専用のコマンド)は、.NETオブジェクトを入出力に使います。

一般的なコマンド ラインと同じく、| (パイプ演算子)を使って複数のコマンドをつなげますが、つないだコマンドが両方Cmdletの場合、データが.NETオブジェクトのまま渡ります。

例えば、以下の例を見てください。

lsコマンド(Get-ChildItemというコマンドのエイリアスです。Unixコマンドっぽいエイリアスが結構な数用意されています)の結果は、DictionaryInfo型の配列になっています。次のselectコマンドで、その.NET型の配列をそのまま受け取って、最初の1項目だけ返します。その結果に対して、.NETのobject.GetType()メソッドを呼んでいるので、結果は、DictionaryInfoを表すType型インスタンスになります。

IsPublic IsSerial Name BaseType
——– ——– —- ——–
True True DirectoryInfo System.IO.FileSystemInfo

 

オブジェクト パイプラインでデータ処理

オブジェクト パイプラインは、ある意味、C#のLINQ的な機構です。

冒頭の、PowerShellの画面キャプチャ中に移っているのがまさにその例だったりします。再掲すると以下の通り。

cat
$file |
foreach { [regex]::Split($_, ‘\s+’) } |
where { $_ } |
group |
sort
Count -Descending |
select
Count, Name -First 10 |
foreach { ‘{1, -12}: {0}’
-f
$_.Count, $_.Name }

foreachwhereなどは、Cmdletとして提供されている1種のデータ処理コマンドです。ちなみに、前段からの入力は、$_ という暗黙的な変数に格納されます。

これで、$file(ファイルのパスを表す文字列)の内容を読んで、単語を集計して、頻度が高いもの10個を、書式指定して表示します。

C#で書くと以下のような感じに。

var q =
    from line in File.ReadLines(file)
    from word in Regex.Split(line, @”\s+”)
    where !string.IsNullOrEmpty(word)
    group word by word into g
    orderby g.Count() descending
    select new { Count = g.Count(), Name = g.Key };

foreach (var x in q.Take(10))
{
    Console.WriteLine(“{1, -12}: {0}”, x.Count, x.Name);
}