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アドレスを静的に記述する必要がある。
準備
仮想マシン作成
- ウィザードではネットワークアダプタを追加しない。後から「レガシーネットワーク」を追加する
- ハードディスクは先に作った仮想ハードディスクを割り当てる。
インストール直前
対象マシンの設定。
- ハードウェアの追加>レガシーネットワークアダプタ を追加。
- 追加したレガシーネットワークアダプタ に実際のネットワークカードを割り当てる。
- IDEコントローラ >DVDドライブ にインストールイメージを割り当てておく。
インストール
- 対象マシンを起動する。
- 普通にインストールを開始する。
- ネットワークアダプタの設定の際、確実にインターネットに接続できるアドレス、DNS、ゲートウェイを指定する。
- あとはひたすらインストーラーの指示に従う。
- インストールが終了したらhyper-Vメニューでインストールメディアを取り出して置く
- 再起動する。
- このあたりでレガシーネットワークアダプタに割り当てられたMACアドレスをメモっておく。
初期設定
- yum update する。
- 再起動。
LinuxIC インストール
- メディア>ディスクを挿入>LinuxICディスクイメージを挿入。
- mount /dev/cdrom /mnt する。
- cd /mnt
- install.sh 実行。時間がかかる。
- 終わったら「シャットダウン」。リブートじゃない。
ネットワークアダプタを入れ替える
- 通常のネットワークアダプタを設定。MACアドレスは先にメモったものを静的に割り当てる。
- レガシーアダプタを削除する。
- マシンを起動し、ifconfigとかで確認。
あとは必要なものを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を上書きし
- さらに追加メンバーを上書きする。
って事。