管理共有(C$)の使用@Windows 7

Windows XPだと、ファイルの共有を設定しなくても、デフォルトでCドライブがC$ (管理共有とかDefault Shareとか呼ばれる)として使えていましたが、Windows 7にすると何故かアクセスできません。

調べてみたところ、セキュリティの向上が理由なのかデフォルトでは使用できないようになっているようです。

UAC(ユーザーアカウント制御) というのを無効にすればよいらしいですが、セキュリティ的にあまりようないので、レジストリを変更する方法があるらしいです。

方法は参考サイトを引用すると、

「HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ Systemまでキーをたどって開きます。右ペインの何もないところを右クリックし、メニューから<新規>→<DWORD(32ビット)値>を選択。 DWORD値名を「LocalAccountTokenFilterPolicy」に変更してから、同値をダブルクリックします。値のデータを「1」に書 き換えてから<OK>ボタンをクリックし再起動」

らしいです。

詳細は参考サイトを。

参考
http://journal.mycom.co.jp/column/windows/042/index.html


リモートデスクトップでPC再起動 or シャットダウン@Windows 7

Windows リモートデスクトップ接続では、通常のスタートメニューから再起動やシャットダウンができません。

Windows XPの時は、タスクマネージャーで出来たのですが、Windows 7ではメニューがありません。しかし以下の方法で簡単に再起動・シャットダウンが可能です。

  • スタートメニューから「Windows セキュリティ」をクリック
  • 画面右下に出てくる赤いアイコンで再起動・シャットダウンを選択

Cのコメント部分を正規表現で検索@vim

ソースコードを機械的に解析する際、コメントが邪魔だったりします。

viでコメント部分を削除しようとして、正規表現で以下のようにコメント部分を検索するとします。

\/\*.*\*\/

これは、/*で始まり、任意の文字列”.*”が続いた後に、*/で終わる部分にマッチしますので、

/* hoge */

というコメント部分にもちろんマッチしますが、実は最も長い部分にマッチするため、

/* hoge */ int a = 0; /* hoge */

は、int a =0; も含めてマッチしてしまいます。よって、/* と */の間にはコメントの閉じである*/がこないことを正規表現で表現する必要があります。

ここで、少し考え方が難しくなります。 じつは正規表現で否定を表現する場合、[^abc]と表現できますが、これはabcという文字列がこないという意味ではなくて、aかbかcがこないという意味なので目的にあいません。

よって、任意の文字”.”を[^*/]に置き換えた場合は、*または/ではないという意味なので、

\/\*[^*/]*\*\/

という正規表現は、

/* hoge/hoge */

という”/”を含んだコメントにマッチしなくなってしまいます。

では”*/”という文字列ではない という表現はどう表現すればよいのでしょうか。

正規表現では文字列否定専用の表現はありません。そこで”/” 以外の文字」と「直前が “*” 以外の “/”」と考えます。

これを正規表現と表すと

\([^\/]\|[^*]\/\)*

となり、/* と */の条件も付け加えると

 \/\*\([^\/]\|[^*]\/\)*\*\/

となります。

さらに、/* */は途中に改行が入る可能性があります。”.”は改行にはマッチしないので、改行の表現である”\n”をマッチの条件に追加して

\/\*\([^\/]\|[^*]\/\|\n\)*\*\/

となり、なんとか動いてくれたようです。複雑ですね~

これを使用することで、コメントの中にある文字列を探すことも可能になります。

上記を整理すると、Cにおいて 以下が改行を考慮した*/以外の文字列を示しているので

\([^\/]\|[^*]\/\|\n\)*

コメント内の文字列を探すには、探す文字列の前後にこの表現があればよいことになります。つまりhogeを探すならこのようになります。

\/\*\([^\/]\|[^*]\/\|\n\)*hoge\([^\/]\|[^*]\/\|\n\)*\*\/

なお、上記で説明した正規表現は、実はprintf などの文字列内にある/* */もマッチしてしまいます。他にも条件によっては動作がおかしくなる可能性があるので注意してくださ。

文字列を含まないというのを汎用的に表現すると、もっと難しく、さらにメモリ消費が激しいようです。参考サイトには文字列を含まない正規表現を自動生成してくれるJavascriptもありますが、maznの環境では動作が重く、実用に耐えられませんでした。

参考
http://blog.livedoor.jp/froo/archives/50581540.html
http://funcchan.blog16.fc2.com/blog-entry-39.html
http://www.kt.rim.or.jp/~kbk/regex/regex.html


KVMを使ってみる@CentOS 5.4

RHEL 5.4からKVMが使えるようになり、それに伴いCentOS 5.4でも使えるようになりました。Xenは使ったことがあるのですが、KVMは使ったことなかったので早速使ってみました。

前提ですが、 CentOSは仮想化のパッケージをインストールしておきます。

Gnomeのメニューのアプリケーション→システムツール から 仮想マシンマネージャ(virt-manager)を起動します。localhostというのがありますので、これを右クリックして、新規を選択します。

monitor01.jpg

後は、ウィザード(ほぼ英語)に従って仮想マシン(ゲストOS)を作成していくだけです。いくつかマシン作成でのポイントを書いておきます。

  • CPUには仮想化に対応した機能(AMD-V や Intel-VT)が必要。 (だと思う)
  • 完全仮想化しかない。
  • ホストがx86_64の場合ゲストOSは32bit, 64bitどちらでも動作可能。
  • OSインストールはDVD/CD-ROMドライブやISOイメージを使用可能。
  • ゲストOSは、ファイルとして保存もできるしパーティションを直接使用することも可能。
  • マシン作成時に、ゲストOSがWindowsなのかLinuxなのかSolarisなのかといった選択項目が出てくるが、選んだ場合にKVMの何の設定が変わるかは未調査。

試しにWindows7の64bit版をインストールしてみた。

が、、、、IntelのCPUは動くらしいが、AMDは動かないとか・・・・
インストーラーが途中で止まりました orz

ちなみにVmware 上では動きました。


VMware 2.0 を専用クライアントで使う (msiからファイルの抽出)

VMware 2.0 は基本的にWebインタフェースしか使えないと思っていましたが、インストールすると、VMware-viclient.exeというのも一緒に入るらしいです。

これを使えば、VMware 1.0のように専用のコンソールクライアントで使用でき快適かもしれません。

ただ、クライアントだけ使いたい場合インストールは面倒です。ここでクライアントの抽出方法が以下のように記述されていました。
※現在の最新の2.0.2には入っていません。2.0.0が必要のようです。
※tarコマンドが使える環境ならば、Linux版(tar.gz)から抽出する方が早いかもしれません。

  1. VMwareのサイトから VMware Server 2をダウンロードします。
  2. ダウンロードしたEXEを実行します。(仮想マシンの中では怒られてしまいますので注意)
  3. インストーラが起動すると、%TEMP%\{AF08C71F-F822-4416-87A9-2BBF5A8A5F12}~setup の中に VMware Server.msi が現れるので、別のディレクトリにコピーします。
  4. インストーラはキャンセルします。
  5. コピーしたディレクトリで、以下のコマンドを実行します。
    msiexec /a "VMware Server.msi" targetdir=c:\tmp\vmware /qn

    ※targetdirには適当なディレクトリを指定してください。
    ※msiファイルが暗号化されていたり、Everyoneユーザにアクセス権限がないとエラーになります。

  6. しばらく待つと、c:\temp\vmware にファイルが展開されます。
  7. VMware Server\hostd\docroot\client フォルダに VMware-viclient.exe というファイルができているはずです。
  8. この VMware-viclient.exe を実行すると、VMware Infrastructure Clientがインストールされます。
  9. c:\temp\vmwareに展開されたファイルを削除します。

接続時は、サーバーの8333ポートに繋ぎます。