2015年1月31日土曜日

Windows標準コマンドでdiffする


Linuxなら迷うこと無くdiffコマンドがあるので問題ないが、Windowsの場合どうすれば良いか悩んでしまうことがある。フリーソフトがインストールできる環境ならまだしも、インターネットに繋がないサーバーとなると、OS標準のコマンドで実施する必要があるので調べてみた。

Windowsバッチファイル

実はコマンドがあってfc (File Compare) を使えば良い。オプションを確認してみよう。
C:\>fc /?
2 つのファイルまたはファイル セットを比較し、相違点を表示します。


FC [/A] [/C] [/L] [/LBn] [/N] [/OFF[LINE]] [/T] [/U] [/W] [/nnnn]
   [ドライブ1:][パス1]ファイル名1 [ドライブ2:][パス2]ファイル名2
FC /B [ドライブ1:][パス1]ファイル名1 [ドライブ2:][パス2]ファイル名2

  /A         相違する各部分の 1 行目と最後の行だけを表示します。
  /B         バイナリの比較を実行します。
  /C         英字の大文字と小文字を区別しません。
  /L         ファイルを ASCII テキストとして比較します。
  /LBn       連続する最大不一致行を指定行数に設定します。
  /N         ASCII の比較で行番号を表示します。
  /OFF[LINE] オフライン属性が設定されたファイルをスキップしません。
  /T         タブをスペースに変換しません。
  /U         Unicode テキスト ファイルとしてファイルを比較します。
  /W         連続した空白 (タブとスペース) を 1 つのスペースに圧縮して比較
             します。
  /nnnn      不一致発見後に確認する、一致すべき連続行数を指定します。

  [ドライブ1:][パス1]ファイル名1
             比較する最初のファイルまたはファイル セットを指定します。
  [ドライブ2:][パス2]ファイル名2
             比較する 2 番目のファイルまたはファイル セットを指定します。
見ての通りいろいろオプションはあるが、お勧めは/n付けて相違行番号を出すと比較結果が確認しやすい。
(実行例)
c:\>fc /n test.txt test2.txt
ファイル test.txt と TEST2.TXT を比較しています
***** test.txt
***** TEST2.TXT
    5:
    6:  hoge4
*****

PowerShell

Compare-Objectを使う。さらに標準でdiffcompareでエイリアスに登録されているので、以下コマンドで実行することができる。

PowerShell的にはあくまでオブジェクトの比較になるので、一度cat(Get-Contentのエイリアス) でテキストを読み込ませてから比較する必要がある。SideIndicator=>となっていれば引数の右側、<=になっていれば引数の左側に差異があることを表している。
PS C:\> diff (cat '.\test.txt') (cat .\test2.txt)
 
InputObject                                                 SideIndicator
-----------                                                 -------------
                                                            =>
hoge4                                                       =>

2015年1月28日水曜日

バッチファイルの遅延環境変数の展開

バッチファイルの遅延環境変数の展開について知らなかったため、先日バッチファイル作成時にハマってしまった。調べればもっとわかりやすいサイトもあるが、自分でもスクリプト作って調査・確認をしたので備忘として残しておく。

環境変数の展開というバッチファイルの罠

バッチファイルは1行1行読み込みながらコマンドを解釈して処理を実行する。変数がある場合は、1行読み込んだ際に値を代入して処理をする。しかし、if文やfor文の場合は、if文の中身も含めて一気に変数に値を代入する(環境変数が展開される)という、バッチファイルならではの癖がある。

例を出そう。以下は1~10までを足し算するバッチファイルである。
rem 1~10までを足し算する
@echo off
set i=0
for /l %%X in (1,1,10) do (
set /a i=%i% + %%X
echo %i%
)
echo %i%
pause
exit 0
結果は55が最後に表示されることを期待するが、以下の通りうまくいかない。
0
0
0
0
0
0
0
0
0
0
10
続行するには何かキーを押してください . . .
なぜかというとfor文の()の中身は、for文開始時に変数iが0で展開されてしまうから。わかりやすく書くと、以下を実行していることと同一になってしまう(ループの最後は%%Xは10が入るので、それが変数iに代入されて終わる)。
rem 1~10までを足し算する
@echo off
set i=0
for /l %%X in (1,1,10) do (
set /a i=0 + %%X
echo 0
)
echo %i%
pause
exit 0

遅延環境変数の展開を有効化する

問題を解決するためには、以下2点を対応すれば良い。

  1. 最初に"setlocal enabledelayedexpansion"を書いて、遅延環境変数の展開を有効化
  2. 遅延環境変数は"%"ではなく"!"で囲む

試してみよう。
rem 1~10までを足し算する
@echo off
rem 遅延環境変数
setlocal enabledelayedexpansion

set i=0
for /l %%X in (1,1,10) do (
set /a i=!i! + %%X
echo !i!
)
echo %i%
pause
exit 0

結果。
1
3
6
10
15
21
28
36
45
55
55
続行するには何かキーを押してください . . .
以上の通り、想定される55の結果が表示された。

シェルスクリプトでreadを使った際に、入力した文字を表示させない方法

小ネタだが、スクリプト実行時に特定のユーザーID、パスワードを使って処理を実施したい場合があるとして、その際に単純にreadで入力をさせてしまうと、TeraTerm等のログ保存を使っている場合、ログにパスワードが平文で表示されてしまう。

その対策として、sttyコマンドで入力文字のechoをOFFにしてしまえば良い。
# username入力を求める(これは表示される)
echo -n "username:"
read _user
echo

# password入力を求める(これは表示されない)
stty -echo
echo -n "password:"
read _pass
stty echo
echo
2015年1月24日土曜日

インフラエンジニアの仕事で使える素材集

設計図やネットワーク構成図、あるいは提案書を書く際に使えるインフラ機器の素材集。ただのオートシェイプで表現するよりも"らしく"なるので便利。

VMware PowerPoint Icons and Images - 2Q12

◆URL
https://communities.vmware.com/thread/400678

◆評価
非常に綺麗な高品質な素材となっており、この素材を使って報告書等を作ると、大した内容を書いていなくてもそれっぽいものになるので活用させてもらっている。

仮想化製品ベンダーのアイコンだけあって、仮想環境を表現するにはうってつけの図はもちろんのこと、一般的なサーバー、ネットワーク機器、ストレージの構成図を書く際に必要となる図や、マニアックな周辺機器(NIC、HBA、Tape Driveなど)まで、広く揃っていて、使い勝手かものすごく良い。

難点を言えば正面から見た図ではなく、斜め45度に傾いた立体感のある図が多いので、他素材と合わせる際は統一感を出しづらいかもしれないので注意。

AWSシンプルアイコン

◆URL
http://aws.amazon.com/jp/architecture/icons/

◆評価
Amazon Web Services使うならこれ。

AWSで使われているそれっぽい図のための素材が用意されている。最近の流行りと勝手に思っているシンプルなデザイン。この前少しだけAWSを使う機会があったので使ってみたが、これを使うだけでいかにもAWSを使いこなしている感が出て良い感じ。

AWS以外に使えるかというとAWS特有のサービスの図が多いので難しいかもしれない。また、独特なデザインなので他の素材との相性はイマイチかも。

Microsoft Azure, Cloud and Enterprise Symbol / Icon Set for Visio, PowerPoint, PNG

◆URL
http://www.microsoft.com/en-us/download/details.aspx?id=41937

◆評価
AWSシンプルアイコンと同様、流行りのシンプルなデザイン。2014年12月にVersion 2.0になっており、以前に比べると画像点数が大幅に増えている(Xboxの図まである!)。

欠点はAWSシンプルアイコンと同様、これを使ったらこれだけでドキュメントを作らないと統一感が出ないこと。

CISCO ネットワーク トポロジー アイコン

◆URL
http://www.cisco.com/web/JP/product/topology_icons.html

◆評価
昔からある素材で、インフラエンジニアなら誰でも知っていると思われる独特の色とデザイン。シンプルだが、悪く言うとのっぺりしたデザインなので、ちょっと地味に見えてしまうかも。設計書や構成図に使うのは問題ないが、提案書に使うには少しインパクトが弱い(他のパワーポイントのデザインに負けてしまいがち)。

HP製品写真ライブラリ

◆URL
http://h50146.www5.hp.com/info/newsroom/library/

◆評価
HPの実物の製品写真でありCGでは無い。HPの製品使って提案書等のドキュメントを作るなら使えそうだが、真正面から撮った写真ではないことと、白い余白の背景を含む画像なので、使う前にちょっとした画像の加工が必要になる。

IBM Systems フォト・ライブラリー

◆URL
http://www-06.ibm.com/systems/jp/photo/

◆評価
IBM版はこちら。使い方はHPと同様。


2015年1月22日木曜日

PowerCLIで仮想マシンのCPU・メモリ制限を「制限なし」に設定する方法

制限の有効化

仮想マシンのCPU・メモリの制限に対して、PowerCLIで有効化することは簡単で、以下のコマンドで実施可能。
Get-VM -Name "VM_NAME" | Get-VMResourceConfiguration | Set-VMResourceConfiguration -CpuLimitMhz 2048
Get-VM -Name "VM_NAME" | Get-VMResourceConfiguration | Set-VMResourceConfiguration -MemLimitMB 2048

確認コマンドは以下の通り。「制限なし」の場合は"-1"と表示される。
Get-VM -Name "VM_NAME" | Get-VMResourceConfiguration  | ft VM,CPULimitMh,MemLimitMB
VM                                              CpuLimitMhz                    MemLimitMB
--                                              -----------                    ----------
VM_NAME                                             -1                            -1


制限の無効化(「制限なし」にする)

しかし、「制限なし」に設定する場合はどのようにすれば良いのか悩んでしまう。"0"では普通に設定が通ってしまうし、"-1"でいけるかと思いきやエラーとなってしまって先に進めない。
Get-VM -Name "VM_NAME" | Get-VMResourceConfiguration | Set-VMResourceConfiguration -CpuLimitMhz -1
Set-VMResourceConfiguration : 2015/01/22 20:42:58    Set-VMResourceConfiguration        Invalid value passed to the CpuLimitMhz parameter.発生場所 行:1 文字:86+ Get-VM -Name JEPOS-TEST01 | Get-VMResourceConfiguration | Set-VMResourceConfiguration <<<<  -CpuLimitMhz -1    + CategoryInfo          : InvalidArgument: (:) [Set-VMResourceConfiguration]、Invalid    Argument    + FullyQualifiedErrorId : Core_SetVmResourceConfiguration_TryValidateParameterList_I   nvalidValue_CpuLimitMhz,VMware.VimAutomation.ViCore.Cmdlets.Commands.SetVMResourceCo  nfiguration
結果的に以下のように対応すれば良いことがわかった。PowerCLIのコマンド集にも明記されていないので注意しよう。$nullがミソ。
Get-VM -Name "VM_NAME" | Get-VMResourceConfiguration | Set-VMResourceConfiguration -MemLimitMB $null

人気の投稿