Windowsでduコマンドっぽいスクリプトを作った

widowsにはdu(directory usage?)がない。リソースキットをインストールすればdiruse.exeとか入るみたいだけどこの程度の作業にいちいちインストールとかめんどくさい。
TreeSizeFreeは便利だが結果をデータに落とせない。

仕方がないからvbscriptで作ってみた。

du.vbs

Dim argumentCount
argumentCount = WScript.Arguments.Count

If argumentCount = 0 Then
	usage
	WScript.Quit 0
End If

Dim filespec
filespec = WScript.Arguments.Item(argumentCount - 1)

Dim maxDepth
maxDepth = 100
If WScript.Arguments.Named.Exists("max-depth") Then
	maxDepth = CLng(WScript.Arguments.Named.Item("max-depth"))
End If

Dim ignoreHidden
If WScript.Arguments.Named.Exists("ignore-hidden") Then
	ignoreHidden = True
Else
	ignoreHidden = False
End If



Dim fileSystem
Set fileSystem = CreateObject("Scripting.FileSystemObject")


Dim f
Set f = fileSystem.GetFolder(filespec)

ShowFolderSize f,0

Function ShowFolderSize(folder,depth)

	Dim subFolders
	Dim subFolder
	If depth < maxDepth Then
		Set subFolders = folder.SubFolders
		For Each subFolder in subFolders
			walk subFolder,depth + 1
		Next
	End If

	WScript.Echo FormatNumber(folder.Size) & vbTab & folder.Path
End Function
Function walk(folder,depth)
	If ignoreHidden Then
		If folder.attributes and 2 Then
			Exit Function
		End If
		If InStr(folder.Name,".") > 0 Then
			Exit Function
		End If
	End If
	ShowFolderSize folder,depth
End Function

Function usage()
	WScript.Echo "usage: cscript du.vbs [/max-depth:n] [/ignore-hidden] dir"
End Function

/max-depth:1 とすると指定ディレクトリ直下まで表示。
/ignore-hidden をつけるとWindowsの隠しディレクトリと"ドットディレクトリ"を無視する。
cscriptで起動するのでロゴが出てうざい、とか言う場合はcscriptのオプションで消すとかする。

Zend_Captchaは便利だがデコレータが糞(あえて。)なのでこんなことをした。

デザインの都合上Zend_Captchaの画像部分と入力部分を分離してrender()したいが、なんかどうにもならない予感がするのでこんな風にしてみた
form

class Hoge_Form extends Zend_Form{
  public function init(){
    $this->captcha = new Zend_Form_Element_Captcha(...);
    $this->captcha->setDecorators(array("captcha"));
    $this->addElements(array(
      $this->captcha,
      ...
    ));
  }
}

controller

public function hogeAction(){
  $this->view->assign("form",new HogeForm());
}

view

<div>
<? echo $this->form->captcha ?>
</div>
<div id="captcha_input_box"></div>
<script type="text/javascript">
$(function(){
	$("#captcha-input").remove().appendTo("#captcha_input_box");
});
</script>

Decoratorでどうこうするのは諦めて、jQueryで入力要素を移動。

Hyper-VにCent OS 6.2をインストールする

ネットワークインストールを利用する場合。どうせあとからyumするときにはネットワークが使えないとどうしようもないのでこれでOK。
肝になるのはネットワークアダプタで、Windowsを乗せるときは通常のアダプタを設定しても問題ないから調子に乗って同じことをやるとハマる。
基本手順は

  • レガシーアダプタをつかってインストールを済ませる
  • LinuxICをインストール、最低限のアップデートまで済ませてシャットダウン。
  • レガシーアダプタを削除し、通常のアダプタを接続する。

インストール中にifcfg-eth0にMACアドレスが書き込まれるので通常のアダプタを設定するときにレガシーアダプタに設定されていたMACアドレスを静的に記述する必要がある。

準備

  • インストールイメージをcentosサイトからダウンロードする。使うのは「netinstall」。
  • 仮想ハードディスクを作る。固定サイズ、容量は必要に応じて。LAMP環境なら最終的に5G程度は食う。

仮想マシン作成

  • ウィザードではネットワークアダプタを追加しない。後から「レガシーネットワーク」を追加する
  • ハードディスクは先に作った仮想ハードディスクを割り当てる。

インストール直前

対象マシンの設定。

インストール

初期設定

  • yum update する。
  • 再起動。

LinuxIC インストール

  • メディア>ディスクを挿入>LinuxICディスクイメージを挿入。
  • mount /dev/cdrom /mnt する。
  • cd /mnt
  • install.sh 実行。時間がかかる。
  • 終わったら「シャットダウン」。リブートじゃない。

ネットワークアダプタを入れ替える

あとは必要なものをyum installとかapt-getとかrpmとかでインストールすれば良い。
ちょっと悩んだのはDNS確認をしようとdig example.comしようとしたら「command not found」といわれたこと。最小構成でインストールすると付いてこない。bind-utilsをインストールすれば良い。

ちょっと長めの文字のテストデータ。

あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよわをん
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
寿限無寿限無
五劫の擦り切れ
海砂利水魚
水行末 雲来末 風来末
食う寝る処に住む処
やぶら小路の藪柑子
パイポパイポ パイポシューリンガン
シューリンガングーリンダイ
グーリンダイポンポコピーポンポコナー
長久命の長助

jQuery.extendでオブジェクトを拡張する

基本

オブジェクト設定のデフォルトを定義しておき、後から設定されるオプションを上書きする場合。

var defaultValue = { value1: "default1",value2: "default2"};
var option = { value1:"vallue1"};
var extended = jQuery.extend(defaultValue,option);

extended.value1はoptionの内容で上書きされる。extended.value2はdefaultValue.value2の内容になる。
分でjquery拡張を書く時なんかに使う。

クラスの継承

基本クラスにメンバーを追加する、あるいはメソッドをオーバーライドする。
間違ったやり方はこう。

var Parent = function(){ ... };
Parent.protorype = { ... };
var Child = function(){ ... };
Child.prototype = { ... };
jQuery.extend(Child,Parent);

多分意図とは逆にChildに定義したメンバーがParentで上書きされてしまう。
これもだめ。

var Parent = function(){ ... };
Parent.protorype = { ... };
var Child = function(){ ... };
Child.prototype = { ... };
var extended = jQuery.extend({},Parent.prototype,Child.prototype);

意図としては"var obj = new Child()"したいのであって、これだと"var obj = new extended()"じゃないと使えない。
もしかしたら "var Child.prototype = jQuery.extend({},Parent.prototype,Child.prototype);"ならいけるかも。でも冗長。

var Parent = function(){ ... };
Parent.protorype = { ... };
var Child = function(){ ... };
 = { ... };
jQuery.extend(Child.prototype,Parent.prototype,{ /* 拡張メンバー */ });

こう書けば、意図通りに動作する。Childで上書きしなかったメンバーもChild内でthis.hogeして使える。
ただし、この書き方をするとjsdocのコメントがうまく入らなくなるので、昨日の日記を参照。
あと、オーバーライドしたメンバーの親を使う場合どうするのか、は未だ試してない。

追記:
最後の例が間違っていたので修正。
要するに

  • まだ空であるChildのprototypeに
  • 既に定義しているParent.prototypeを上書きし
  • さらに追加メンバーを上書きする。

って事。