Hatena::ブログ(Diary)

たなかれいなとあややとおっぱい。 このページをアンテナに追加 RSSフィード Twitter

2004 | 06 | 07 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 06 | 07 | 10 | 11 | 12 |
2009 | 01 | 03 | 04 | 05 | 06 | 08 | 10 | 11 | 12 |
2010 | 01 | 02 | 04 | 10 |
2011 | 01 | 03 | 12 |
2012 | 01 |

2012-01-15 ウィキペディア発足の日。(2001年)

kenrouse2012-01-15

僕にとって『ドリムス。(1)』とはなんだったのか。

去年の年末、紅白歌合戦が終わって「あー、もう年が明けるんだなぁ。」と思いふけっていたとき、ふとテレビのチャンネルを回してみたら、CDTVの年越しライブにドリームモーニング娘。(通称:ドリムス。)の姿が。

彼女たちが歌声を届けてくれたのは『ザ☆ピ〜ス!』、『LOVEマシーン』、『恋愛レボリューション21』の3曲でしたが、なにが琴線に引っかかったのか、僕にとっては涙が出るほどの衝撃を受けた瞬間でした。

モーニング娘。の卒業メンバーが再集結して、ドリームモーニング娘。が結成されたと言うことは見聞きしていたのですが、恥ずかしながら、実際にライブを見たのは去年のCDTV年越しライブがはじめてでした。

僕にとっての『モーニング娘。』とは、ロックボーカリストになりたくて応募したオーディションに落選し、敗者復活という形でチャンスをつかみ、いつか自分は脱落してしまうかもしれないという不安と戦いながら、夢を叶えるためにがんばってきた5人のメンバーの物語です。

2012 年を迎えたいま、モーニング娘。は正当派アイドルグループとしての進化を続けていますが、激動とも言うべき当時の面影を感じ取ることがなくなってしまっていました。

しかしながら、ドリムス。のライブを初めて見たとき、『ザ☆ピ〜ス!』のイントロを聴いたあのとき、僕の脳裏では、夢を叶えるために必死にがんばっていたあの頃の思い出が全身を駆け巡り、一瞬にして感覚が引き戻されたことを思い出します。

なるほど、ドリムス。ってそういうことなのかと。

これはドリムス。とはなんであるかを確かめねばならないと。

こう思った次第なのです。

そこで最近ようやくドリムス。(1) のアルバムを借りてきた次第ですが、これがまたすばらしく、ドリムス。とはなんであるかを非常によく表現しているアルバムだったわけなのですよ。

ドリムス。(1)

ご存じの方も多いかと思いますが、ドリムス。(1) のアルバムは2枚組で、1枚目の曲目は、モーニング娘。の進化をドリムス。が表現する。といった形で楽曲がまとめ上げられておりました。

そしてドリムス。(1) の2枚目は、僕にとっての『モーニング娘。』とはなんだったのか。をすさまじいほどに思い起こしてくれるような、大変刺激的な曲目でした。

以下の表は、ドリムス。(1) の2枚目の曲目一覧ですが、ここには、モーニング娘。のシングル楽曲が厳選され、時間の流れとともに収録されています。

01. サマーナイトタウン
02. 抱いてHOLD ON ME!
03. Memory 青春の光
04. LOVEマシーン
05. 恋のダンスサイト
06. ハッピーサマーウェディング
07. I WISH
08. 恋愛レボリューション21(にじゅういち)
09. ザ☆ピ〜ス!
10. そうだ!We're ALIVE

ドリムス。がなぜ衝撃だったのか、これらの楽曲にはどんな想いが詰まっているのか、いくつかの曲を紹介してみることで、僕なりの想いを語ってみました。

Memory 青春の光

4 枚目シングル、1999 年 2月 10 日発売、オリコン最高 2 位、初動 195,720 枚、累計 410,850 枚

1997 年 4 月、テレビ東京ASAYAN と言う番組で、『シャ乱Qロックボーカリストオーディション』が開催されました。

ご存じの通り、モーニング娘。とは、この『シャ乱Qロックボーカリストオーディション』に落選し、再度アーティストになるチャンスを与えられた5人組が、手売りCDを5万枚、販売達成したことから歩き出しました。

5人のメンバーで歩き出したモーニング娘。が、3人の新メンバーを加えて必死にがんばっていたはずでしたが、1999 年 1 月 17 日、メンバーのひとりが脱退を宣言するという衝撃の出来事に遭遇します。

そうです、福田明日香の脱退発表です。

福田は、4 枚目のシングルとなる『Memory 青春の光』を最後に、モーニング娘。を脱退することとなりました。

同年 4 月 18 日、新宿厚生年金会館では、志半ばで脱退という大きな衝撃を受けながらも、福田が叶えることのできなかった夢を残ったメンバーが受け継ぐという、決意表明がありました。

残念ながら僕はこのライブをリアルタイムに感じることはできなかったのですが、モーニング娘。の成功は、このライブでの決意が合ったからこそ、実現できたのではないかと感じています。

このとき、ライブの後半で歌われたのが『NEVER FORGET』と言う曲。

『Memory 青春の光』のカップリングであり、めずらしく第3トラックとして収録された楽曲です。

『Memory 青春の光』や『NEVER FORGET』が作成されたとき、福田脱退への思いがこもっていたかどうかについては不明ですが、いまでもこの曲を聴くとライブの様子が思い起こされるほど、思いの詰まった曲でもあります。

LOVEマシーン

7 枚目シングル、1999 年 9 月 9 日発売、オリコン最高 1 位、初動 241,540 枚、累計 1,646,630 枚

みなさんご存じの通り、『LOVEマシーン』はモーニング娘。歴代最高売り上げを記録したシングルです。

本来2人加入するはずだった予定のオーディションで1人だけ合格し、当時13歳にして金髪という強烈なインパクトをもって加入した後藤真希、これまでの路線とはがらっと趣を変え、とにかくすべてが弾けまくったディスコチューンサウンド、不況の世の中に元気を与えるアゲアゲのフレーズは日本で大流行となり、爆発的なヒットを飛ばしました。

その結果、『LOVEマシーン』はモーニング娘。初のミリオンセールスが確定し、名実ともにモーニング娘。を代表する曲となりました。

『LOVEマシーン』のヒットをきっかけとして、モーニング娘。はテレビや雑誌に頻繁に顔を出し、当時は小学生からオジサンまでカラオケで歌い、踊り、振りまねするなど、まさに社会現象とも言えるようなムーブメントを起こしたことを記憶しています。

『LOVEマシーン』のミリオンヒットとは、モーニング娘。がこれまでにがんばってきた成果を認められた記念すべき楽曲ではないかなと感じています。

恋愛レボリューション21

11 枚目シングル、2000 年 12 月 13 日発売、オリコン最高 2 位、初動 515,490 枚、累計 986,040 枚

f:id:kenrouse:20120115235707p:image

上の図を見てください。これは、モーニング娘。のこれまでのシングル CD 初動売り上げ枚数と、累計売り上げ枚数のグラフですが、7 枚目の『LOVEマシーン』とは別に、11 枚目の『恋愛レボリューション21』はミリオンヒットにはわずかに届かなかったものの、ふたつめの大きな巻き返しを記録しています。

この曲は、実は僕がモーニング娘。にハマるきっかけになった曲です。

当時学生だった僕は、じつはあんまりモーニング娘。に興味がありませんでした。

しかしながら、僕の大好きなダンスミュージックにサイバーな衣装、ノリノリの歌詞につんく♂大先生のステキなダミ声。そしてフォーメーションを重視した夏まゆみ先生の華麗な振り付け。正直、ここまで完成されたエンターテインメントはこれまでに見たことがありませんでした。あまりもの完成度の高さにそれはもうヘビーローテーションで聞きまくってた思い出があります。

いまでも『恋愛レボリューション21』が流れると、完成度の高さゆえに不思議と体が動き出し、元気がわいてくるようなとてつもないパワーを感じます。

個人的には、『恋愛レボリューション21』はモーニング娘。の当初の野望であった『ロック』が完成した瞬間だと思っています。

I WISH

10 枚目シングル、2000 年 9 月 6 日発売、オリコン最高 1 位、初動 407,350 枚、累計 654,640 枚

僕にとってこの曲はあいぼん加護亜依)とごっちん(後藤真希)の曲です。

この曲のラストには、『でも、笑顔は、大切にしたい』と言う加護のフレーズを、『愛する人のために。』と言うフレーズで後藤が受けるパートがあるのですが、このパートは加護と後藤の二人がクローズアップされることが多いシーンであり、数多くのライブやテレビ収録で披露され、僕にとって(そしてたぶん彼女たちにとっても)大変お気に入りのパートでした。

幸せとも言えるようなときが流れていたそんななか、2002 年 7 月 31 日、モーニング娘。ファンにとって衝撃とも言える発表がありました。

後藤真希と保田圭の卒業、そして既存グループの大幅な人員入れ替えです。

あまりの衝撃の大きさから、ファンの間では『ハロマゲドン』として記録に残されています。

Wikipedia - ハロマゲドン
http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%AD%E3%83%BC%E3%83%9E%E3%82%B2%E3%83%89%E3%83%B3

『I WISH』は、そんなハロマゲドンの影響を受けて最初に卒業することになった、後藤真希と加護亜依の思い出の一曲です。

後藤の卒業が決まり、加護は、タイムリミットが迫って来ていることを感じていたのだと思います。

後藤と加護が『I WISH』を歌うたび、残された時間が減っていく。楽しかった時間は永遠には続かないんだ。加護と後藤が歌うこのパートには、そんな思いが込められているように感じられました。

2002 年 9 月 22 日、後藤真希の卒業前夜。テレビで特別番組が放映され、残りわずかとなってしまった時間を惜しむように『I WISH』が奏でられました。それはそれはもう、アイドルの歌声から、こんなにも想いがあふれてくるものなのかと感じたものでした。

ドリムス。?で歌われている『I WISH』は加護と後藤のパートではありませんが、当時限られた時間を歌いきった彼女たちの、切ない気持ちがいまでも伝わってくるような気がします。

さいごに。

ハロマゲドン以降、主力とも言えるメンバーが次々と卒業し、自ら変化を求めることで驚くほどの進化を遂げ、正統派アイドルとしては模範的存在を手中に収めています。

しかし、それは僕にとって、モーニング娘。の初代メンバーが夢見ていたロックボーカリストの志が薄れていくようにも感じられました。

激動の時代を駆け抜けたあの頃の、精一杯がんばって歌っていたあの頃の気持ちに想いを込めて。

そんな想いが込められたアルバムが、ドリムス。?の2枚目なのではないのかなと。

そんな風に感じたのが、僕の感想なのでした。

2011-12-10 XBOX 360 発売 (2005 年)

kinrobot

金曜ロードショーの次回情報自動配信ボットを作りました。

ひさびさのブログ。最近はどっぷり Twitter にハマってるので、気軽にブログを書くきっかけが減った今日この頃です。

さて、金曜ロードショーでは僕的にすごく気になる映画、特番が放映されていることが多いのですが、放映前にチェックを忘れ、放映後に見たかった番組の感想が Twitter で流れて「ああしまった!」的な状況に陥ることが多いのです。

そこで、気になる番組を見逃さないように、いつも見ている Twitter のタイムラインに、毎日次回の金曜ロードショーの情報が流れるように自動配信プログラムを作れば良いじゃないか!

と言うことを思い立ったわけです。

で、できあがったのがこちらの @ アカウントです。

いまのところ、毎日朝7時と夜19時の2回、某番組表 URL から次回の金曜ロードショーのデータを探して日時とタイトルをツイートします。

興味があったら、是非ともフォローしていただければと思います。

また、ご意見、要望などは @ に直接リプライいただくか、@ までリプライください。

あと、せっかくなので、プログラムは最近興味を持ってる Ruby で書いてみました。Twitter に投稿する部分は、Maraigue さんの twbot2 ライブラリを使用させていただいております。

この場を借りて感謝の意を表します。

2011-03-13

復旧してます。

2011/03/30 計画停電が終わったので、サーバーは復旧しております。

しばらく自宅サーバーを停止します。

東京では明日から断続的に停電(輪番停電)が起きるようです。

サーバーの保護および節電のため、しばらく自宅サーバーの運用を停止します。

メーリングリストなどが使えなくなりますが、ご了承ください。

2011-01-12 光井愛佳(モーニング娘。)ちゃんの誕生日

kenrouse2011-01-12

ドメインが消失していたことに一年たってから気がついたの巻

我が家の自宅サーバーに使用していた以下のドメインが、一年前に利用権を消失していたことに気がついた。

  • rouse.homelinux.org
  • natsumi.homelinux.org
  • reina.dyndns.org
  • asami.dyndns.org
  • mona.dyndns.biz

今更気がついて再取得してみたところ、最近は一部のドメインがプレミアムアカウントのみ取得可能とのことで、有料アカウントを購入する羽目に。

しかも reina.dyndns.org はすでに別のユーザーに取得されていて復旧ならずという始末。残りのドメインはなんとか復旧。

 

というわけで、サーバーが落ちたんじゃないかと思っていたあなた。

サーバーは落ちていませんでしたが、ドメインが消失していたのでようやく復旧したよ。

 

というお知らせでした。※いやはやお恥ずかしい。だれか教えてくれてもよかったのに。。。

2010-10-24 木村カエラ さんの誕生日

kenrouse2010-10-24

wbadmin が昨日のバックアップを自動でリストアしてくれるようにしてみた。

みなさんおひさしぶりです。けんろ〜ずです。生きてますよ。

※ 2011/11/27 最新のバージョン文字列を正しく指定できるよう、手を加えました。

そもそものおはなし

つい最近、ファイル置き場にしていた USB ポータブル HDD が故障し、バックアップのない貴重なファイルが多数取り出せなくなったという出来事がありました。

HDD データ復旧業者と相談してみたりして、結構がんばってみたのですが、願いかなわずリカバリできなかったため泣き寝入り状態なのです。

 

しかーし!!

転んでもタダでは起きてはいけない。同じ過ちを二度と起こさぬよう、このたび我が家で初めての Windows Server 2008 R2 サーバーを構築しました。

しかもこんどこそは頑丈なファイル置き場を作ろうと思い、ハードディスクを3個接続して、2つのバックアップを作成する構成を考えました。

 

さて、いきおい余ってファイルサーバーを買ってきたのはいいものの、どうやってバックアップをとろうか考えていませんでした。

その結果、Windows Server 2008 R2 には Windows Server Backup という便利な機能があるようなので、これを採用しました。

Windows Server バックアップ
http://technet.microsoft.com/ja-jp/library/cc754572.aspx

Windows Server Backup は、内部で Volume Shadow Copy の機能を使うので、共有フォルダのファイルがオープン中でもバックアップをとってくれるし、さらにはシステムドライブのバックアップも起動しながらとってくれちゃいます。これならシステムディスクがぶっ壊れても、とりあえずバックアップが生きていれば大丈夫というわけ。なんと便利。

早速 Windows Server Backup が毎日一回実行されるよう、サーバーマネージャから設定することでとりあえずバックアップはひとつ作成されることになりました。ふぅ、やれやれ。

 

だがしかーし!!

これではとりあえずひとつバックアップを作っただけで、ふたつバックアップを作るという要件を満たしていません。

数日あれこれ考えた結果、保存されたバックアップデータをさらに別のディスクへ復元することで、バックアップが正しく採取されていることの確認と、もう一つバックアップを作成することが同時にできるのではないかと考えました。

これならバックアップがふたつ作成されることになりますよね。

 

そしてしかーし!!!

そういった機能は標準機能では用意されていない様子。じゃあ、自分で作るしかないですか、そうですね!!

というわけで、バックアップの状況確認と、自動復元、そしてその結果をメールで送ってくれるようなスクリプトを書き、バックアップのジョブにスクリプトの実行を追加することで、希望する要件が実現されたのです。めでたしめでたし。

どんなスクリプトを書いたのか

とりあえず長かった前提はおいといて、せっかくなので作成したスクリプトを公開してみます。

'wbadmin 状況確認&自動復元&メール送信スクリプト
' 2010/10/24 by kenrouse
'------------------------------------------------

' 現在時刻をメールの文面に記録します。
mailbody = Now & vbCrLf

' 直前に実行されたバックアップの終了を待つコマンドです。
command = "wbadmin.exe get status"

' コマンドを実行します。
Set WshShell = WScript.CreateObject("WScript.Shell")
Set oExec = WshShell.Exec(command)

' コマンドの出力結果を読み取ります。※ただし、進捗表示の出力は除去
Do While oExec.StdOut.AtEndOfStream <> True
  strline = oExec.StdOut.ReadLine
  If InStr(strline, "%") = 0 Then
    message = message & strline & vbCrLf
  End If
Loop

' ここまでの内容を、メールの文面として保存します。
mailbody = mailbody & command & vbCrLf & "----" & vbCrLf & message & vbCrLf
message = Empty

' おまじないです。
WScript.Sleep 1000

' 現在作成されているバックアップのバージョン識別子を取得するコマンドです。
command = "wbadmin.exe get versions"
version = Empty

' コマンドを実行します。
Set WshShell = WScript.CreateObject("WScript.Shell")
Set oExec = WshShell.Exec(command)

' コマンドの出力結果より、[バージョン識別子:] で始まる文字列を抽出します。
Do While oExec.StdOut.AtEndOfStream <> True
  strline = oExec.StdOut.ReadLine
  If InStr(strline, "識別子") > 0 Then
    version = Right(strline,16)
  End If
Loop

' 現在時刻をメールの文面に記録します。
mailbody = mailbody & Now & vbCrLf

' 指定したバージョンのバックアップを復元するため、version 文字列を作っていきます。
today = Date()
yesterday = DateAdd("d",-1,today)

days = Right(CStr( Day(yesterday) + 100),2)
months = Right(CStr( Month(yesterday) + 100),2)

'version = months & "/" & days & "/" & Year(yesterday) & "-20:00"

' バックアップを復元するためのコマンドです。
command = "wbadmin.exe start recovery -version:" & version & " -itemType:Volume -items:e: -recoverytarget:g: -quiet"

' コマンドを実行します。
Set WshShell = WScript.CreateObject("WScript.Shell")
Set oExec = WshShell.Exec(command)

' コマンドの出力結果を読み取ります。※ただし、進捗表示の出力は除去
Do While oExec.StdOut.AtEndOfStream <> True
  strline = oExec.StdOut.ReadLine
  If InStr(strline, "%") = 0 Then
    message = message & strline & vbCrLf
  End If
Loop

' ここまでの内容を、メールの文面として保存します。
mailbody = mailbody & command & vbCrLf & "----" & vbCrLf & message
message = Empty

' メールの送信準備です。
Set oMsg = CreateObject("CDO.Message")
oMsg.From = "送り主として表示するアドレス"
oMsg.To = "送りたいメールアドレス"
oMsg.Subject = "Wbadmin command Terminated."
oMsg.TextBody = mailbody

' 必要に応じて、メールサーバーなどを指定します。
oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.example.com"
oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
oMsg.Configuration.Fields.Update

' 送信します。
oMsg.Send

バックアップスクリプトを追加してみた画面です。

f:id:kenrouse:20101024051439p:image

こんな感じで、既存のバックアップジョブの操作に追加で指定します。

スクリプト解説

結構苦労して作ったスクリプトなので、どんなところを工夫したか解説してみました。

' 直前に実行されたバックアップの終了を待つコマンドです。
command = "wbadmin.exe get status"

' コマンドを実行します。
Set WshShell = WScript.CreateObject("WScript.Shell")
Set oExec = WshShell.Exec(command)

まずは冒頭部分です。

Windows Backup のジョブは、一つ目のジョブとして wbadmin start backup コマンドが実行されるのですが、このコマンドは、バックアップを開始するととりあえず戻り値を返して次のジョブが実行されます。

Wbadmin start backup
http://technet.microsoft.com/ja-jp/library/cc742083.aspx

タスクスケジューラーの [操作] 項目に複数の項目を作成した場合、上から順番にコマンドが実行されるのですが、上記 wbadmin の動作により、二つ目のコマンド実行開始時には、まだ一つ目のバックアップが終わっていません。

なので、wbadmin get status コマンドを使用して、バックアップの採取が終わるのを待ちます。

Wbadmin get status
http://technet.microsoft.com/ja-jp/library/cc742050.aspx
wbadmin コマンドの終了を待つ
' コマンドの出力結果を読み取ります。※ただし、進捗表示の出力は除去
Do While oExec.StdOut.AtEndOfStream <> True
  strline = oExec.StdOut.ReadLine
  If InStr(strline, "%") = 0 Then
    message = message & strline & vbCrLf
  End If
Loop

' ここまでの内容を、メールの文面として保存します。
mailbody = mailbody & command & vbCrLf & "----" & vbCrLf & message & vbCrLf
message = Empty

wbadmin のコマンドが終了するのを待つためには、WshScriptExec オブジェクトの Status 値を見てもいいのですが、僕の手元の環境では、Status 値が 1 になるのを待っていると、いつまでたっても wbadmin コマンドが終了しませんでした。

Status プロパティ (WshScriptExec)
http://msdn.microsoft.com/ja-jp/library/cc364410.aspx

終了しないコマンドのダンプをとって解析した結果、標準出力にステータスを表示する処理の延長で、バッファが詰まって処理が停止しているようででした。

0:000> kn
 # Child-SP          RetAddr           : Call Site
00 00000000`000ff238 000007fe`fdc61b0b : ntdll!ZwWriteFile+0xa    <<<<-------- ここから先はカーネル側の処理
01 00000000`000ff240 00000000`7788328a : KERNELBASE!WriteFile+0x77
02 00000000`000ff2b0 00000000`ffb9b5af : kernel32!WriteFileImplementation+0x36
03 00000000`000ff2f0 00000000`ffb9b7e0 : wbadmin!CBLBCli::OutputOnConsole+0x467    <<<<-------- 標準出力に出しているところ。
04 00000000`000ff370 00000000`ffb9b77d : wbadmin!CBLBCli::DisplayMessageWithArgList+0x58
05 00000000`000ff3c0 00000000`ffb89a56 : wbadmin!CBLBCli::DisplayMessage+0x29
06 00000000`000ff400 00000000`ffb8a1a2 : wbadmin!DisplayCurrentBackupVolumeStatus+0x11e
07 00000000`000ff460 00000000`ffb8af67 : wbadmin!DisplayBackupVolumeStatus+0x25e
08 00000000`000ff510 00000000`ffb8b7e3 : wbadmin!BackupLoop+0x193    <<<<-------- バックアップが終わるのを待つ処理
09 00000000`000ff6f0 00000000`ffb7ca0d : wbadmin!GetBackupStatus+0x63
0a 00000000`000ff760 00000000`ffb77f70 : wbadmin!GetStatusCommand+0x32d    <<<<-------- get status コマンドを実行していることがわかる
0b 00000000`000ff7d0 00000000`ffbaaa75 : wbadmin!wmain+0x8b4
0c 00000000`000ffa00 00000000`7787f56d : wbadmin!ATL::CAtlStringMgr::Reallocate+0x1f9
0d 00000000`000ffa40 00000000`77ab3021 : kernel32!BaseThreadInitThunk+0xd
0e 00000000`000ffa70 00000000`00000000 : ntdll!RtlUserThreadStart+0x1d

このため、status チェックではなく、標準出力に EndOfStream が検出されるのを待つことで、問題を回避しました。

※これで3日はハマりました。。。

wbadmin コマンドの進捗表示を除外する

また、通常の wbadmin get status コマンドでは、以下のように、10 秒おきにバックアップ状況のステータスが表示されます。

C:\>wbadmin get status
------------------------------
wbadmin 1.0 - バックアップ コマンド ライン ツール
(C) Copyright 2004 Microsoft Corp.

バックアップに指定されたボリュームのシャドウ コピーを作成しています...
バックアップに指定されたボリュームのシャドウ コピーを作成しています...
バックアップに指定されたボリュームのシャドウ コピーを作成しています...
ボリューム システムで予約済み (100.00 MB) のバックアップは正常に完了しました。
ボリューム ローカル ディスク(C:) のバックアップを作成中に (5%) をコピーしました。
ボリューム ローカル ディスク(C:) のバックアップを作成中に (13%) をコピーしました。
ボリューム ローカル ディスク(C:) のバックアップを作成中に (22%) をコピーしました。
ボリューム ローカル ディスク(C:) のバックアップを作成中に (30%) をコピーしました。
ボリューム ローカル ディスク(C:) のバックアップを作成中に (39%) をコピーしました。
ボリューム ローカル ディスク(C:) のバックアップを作成中に (47%) をコピーしました。
ボリューム ローカル ディスク(C:) のバックアップを作成中に (57%) をコピーしました。
ボリューム ローカル ディスク(C:) のバックアップを作成中に (66%) をコピーしました。
ボリューム ローカル ディスク(C:) のバックアップを作成中に (74%) をコピーしました。
ボリューム ローカル ディスク(C:) のバックアップを作成中に (83%) をコピーしました。
ボリューム ローカル ディスク(C:) のバックアップを作成中に (91%) をコピーしました。
ボリューム ローカル ディスク(C:) のバックアップを作成中に (98%) をコピーしました。
ボリューム ローカル ディスク(C:) のバックアップは正常に完了しました。

バックアップが短時間で終了すれば、これぐらいたいしたことないのですが、大容量データのバックアップでは、バックアップに1時間以上かかったりするため、このままでは報告メールがステータス表示で埋め尽くされてしまいます。

このため、InStr 関数を使って、出力の中に "%" が含まれている行はメール報告から除外しました。

InStr 関数
http://msdn.microsoft.com/ja-jp/library/cc410239.aspx

この対策を実施することで、報告メールが次のように非常にすっきりしました。

2010/10/23 5:00:30
wbadmin.exe get status
----
wbadmin 1.0 - バックアップ コマンド ライン ツール
(C) Copyright 2004 Microsoft Corp.

バックアップに指定されたボリュームのシャドウ コピーを作成しています...
バックアップに指定されたボリュームのシャドウ コピーを作成しています...
バックアップに指定されたボリュームのシャドウ コピーを作成しています...
ボリューム システムで予約済み (100.00 MB) のバックアップは正常に完了しました。
ボリューム ローカル ディスク(C:) のバックアップは正常に完了しました。
ボリューム ローカル ディスク(E:) のバックアップは正常に完了しました。
バックアップ操作が正常に完了しました。
バックアップ操作の概要:
-----------------------

ボリューム システムで予約済み (100.00 MB) のバックアップは正常に完了しました。
ボリューム ローカル ディスク(C:) のバックアップは正常に完了しました。
ボリューム ローカル ディスク(E:) のバックアップは正常に完了しました。

※これで2日ぐらいは手を焼きました。。。

おまじない
' おまじないです。
WScript.Sleep 1000

wbadmin コマンドの動作について会社の人に相談したら、wbadmin コマンドは、コマンドが終了してもすぐは次のコマンドを受け付けないことがあるから注意してね(はあと)とのことでした。このため、おまじないとして、とりあえず1秒待っています。

復元するデータのバージョン識別子を考える
' 現在作成されているバックアップのバージョン識別子を取得するコマンドです。
command = "wbadmin.exe get versions"
version = Empty

' コマンドを実行します。
Set WshShell = WScript.CreateObject("WScript.Shell")
Set oExec = WshShell.Exec(command)

' コマンドの出力結果より、[バージョン識別子:] で始まる文字列を抽出します。
Do While oExec.StdOut.AtEndOfStream <> True
  strline = oExec.StdOut.ReadLine
  If InStr(strline, "識別子") > 0 Then
    version = Right(strline,16)
  End If
Loop

' 現在時刻をメールの文面に記録します。
mailbody = mailbody & Now & vbCrLf

' 指定したバージョンのバックアップを復元するため、version 文字列を作っていきます。
today = Date()
yesterday = DateAdd("d",-1,today)

days = Right(CStr( Day(yesterday) + 100),2)
months = Right(CStr( Month(yesterday) + 100),2)

'version = months & "/" & days & "/" & Year(yesterday) & "-20:00"

' バックアップを復元するためのコマンドです。
command = "wbadmin.exe start recovery -version:" & version & " -itemType:Volume -items:e: -recoverytarget:g: -quiet"

' コマンドを実行します。
Set WshShell = WScript.CreateObject("WScript.Shell")
Set oExec = WshShell.Exec(command)

Windows Server Backup では、バックアップされたデータに [バージョン識別子] という情報をつけて管理しています。

C:\>wbadmin get versions
------------------------------
wbadmin 1.0 - バックアップ コマンド ライン ツール
(C) Copyright 2004 Microsoft Corp.

バックアップ時間: 2010/09/15 5:00
バックアップ対象: 固定ディスク ラベル付き F:
バージョン識別子: 09/14/2010-20:00
回復可能: ボリューム, ファイル, アプリケーション, ベア メタル回復, システム状態
スナップショット ID: {769dde24-aad7-4ef1-a1f8-522f87d09077}

バックアップ時間: 2010/09/16 5:00
バックアップ対象: 固定ディスク ラベル付き F:
バージョン識別子: 09/15/2010-20:00
回復可能: ボリューム, ファイル, アプリケーション, ベア メタル回復, システム状態
スナップショット ID: {81844074-0888-4bb9-a404-50060f85f75f}

バックアップ時間: 2010/09/17 5:00
バックアップ対象: 固定ディスク ラベル付き F:
バージョン識別子: 09/16/2010-20:00   <<<<-------- これのことです

復元するデータを指定するには [バージョン識別子] を指定する必要があるのですが、このバージョン情報、日本のタイムゾーンの都合上、AM 5:00 に作成したバックアップのバージョンは、前日の 20:00 として保存されるわけです。ややこしいですね。

このため、wbadmin get version コマンドを実行し、最後に出力された [バージョン識別子] の後半 16 文字を抽出し、wbadmin start recovery コマンドのオプションとして指定しています。

ちなみに我が家では、共有フォルダが E ドライブで、バックアップを復元するためのドライブが G ドライブなので、それにあわせたオプションを指定しています。

最後にメール送信
' メールの送信準備です。
Set oMsg = CreateObject("CDO.Message")
oMsg.From = "送り主として表示するアドレス"
oMsg.To = "送りたいメールアドレス"
oMsg.Subject = "Wbadmin command Terminated."
oMsg.TextBody = mailbody

' 必要に応じて、メールサーバーなどを指定します。
oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.example.com"
oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
oMsg.Configuration.Fields.Update

' 送信します。
oMsg.Send

最後、メールの送信のところです。

今回は、CDO.Message オブジェクトを使って、便利なメール送信機能を実現しています。

CDO.Message オブジェクト
http://msdn.microsoft.com/ja-jp/library/cc421174.aspx

メール送付っていろんなところで役に立つのですが、うちでは Linux サーバーもメールを送って一日の状況を報告するようになっているので、同じようにしてみました。

以上でスクリプトの解説は終了です。

おわりに

さて、これで我が家もハッピーな Windows Server 2008 R2 ファイルサーバー生活が送れること間違いなしです。

Windows Server 2008 R2 にはほかにもいろいろな機能がついているようですが、とりあえずプリンタもつないでみました。無線ネットワーク経由でノートパソコンから印刷できるって便利な時代になったもんですね。

あとは、ディスクが3台同時にぶっ壊れたりしないよう、神に祈るのみです。。。

おわり