32bit版は平気だけど64bit版は大変。
すんげー大変でした。
なんでこんなアホな仕様になってしまったんだろう。WOW64の弊害?
- メモ帳を右クリックして「管理者として実行」
- 開く
- 右下を「テキスト文書」から「すべてのファイル」に変更
- ファイル名に「c:\windows\sysnative」と入力すると隠しフォルダの中身が見える
- drivers/etc/hostsを開く。
デフォルトでlocalhostがコメントアウトされてるのも地味に凶悪な仕様変更だと思う。
堂々の完結編です。感動してモニタが見えなくなるかも。
昔の記事(妥協した結果)
http://rhiz.jp/id/111.html
hamachi のセキュリティが信頼できるかが不透明なので、本番で使うのが怖い。
とも書いてあるし、
やはりhamachiにしようかとも考えたが、Hyper-Vにインストール出来ないので厳しいと思う。
とも書いてある。
ゲストOSに入れて、本来のサブネットにブリッジさせれば動くかも知れないが・・・。
という風にも書いてあるけど、このアプローチは意味が無い気がする。
やりたいこと
Hyper-Vマネージャをリモートで安全に使うために、
インターネット上に存在する管理PCとHyper-VサーバをVPNで繋げる!
セキュリティには不安があるが、とりあえずHamachiを使う。
Hamachiのセキュリティを疑問視するべきなのは変わらないので、極力安全な設定をする。
試す場合は自己責任で。
シチュエーション
導入済みのHyper-V Serverがすでにあり、ローカルには管理PCが存在する。
これらはすでに設定が完了しており、リモートデスクトップも使える状態になっている。
また、リモートデスクトップはsshトンネルによってインターネット経由でも使用可能な状態になっている。
(RDP 7.0の暗号化が信頼出来るのであれば、sshトンネルはしなくても良い)
scpやftpなどのファイルの転送手段がある。
IISのFTPはパフォーマンス的な観点ではFileZillaよりずっと早いのでおすすめ。セキュリティは・・・。
インターネット経由で新しい管理PCを稼働させて、ローカルの管理PCを廃止したい。
サーバのユーザアカウントにはパスワードがかかっており、ゲストアカウントがオンになっていたりしないこと。
firewallはoffにしなくても、onのままで設定可能なので、offにするのはうまくいかない時の動作確認に限るべし。
導入
サーバにHamachiをインストールする。
現在公式から配布されているインストーラは、x86版ではあるようだが、それでインストールできる。
https://secure.logmein.com/products/hamachi2/
試したバージョンは2.0.2.85
しかし、インストール後の起動は「oledlg.dll が存在しない」というエラーを吐いて、うまくいかない。
Windows Web Server 2008 R2があれば、system32の中にある同名のファイルを、hamachi本体のあるディレクトリにコピーすれば、このエラーを回避する事が出来る。
起動が完了したら、「システム」「設定」「セキュリティ」で「デフォルトで新しいネットワークメンバをブロックする」にチェックを入れる。
「ネットワーク」「新規ネットワークの作成」で、IDとパスワードを設定する。
Hamachiの設定
管理PCにもHamachiを導入し、サーバとの接続を行う。
サーバ側で、接続してきたIDを「セキュリティ」画面で探し出し、右クリックして「信頼する」。
管理PCに戻り、右クリックでpingが打てる事を確認する。
共有フォルダにアクセス出来ないor適切な制限がかかっていることも確認すると良い。
管理PCの設定
従来通り。
http://blogs.technet.com/hirookun/archive/tags/Maniax/default.aspx
【仮想】Hyper-V Serverを使ったこんな環境を作りたい(4) まで手順を進める。
元サイトが消えたら悲しいので一応要約しておく。
- Windows 7 Pro or Ult をインストールする
- Hyper-Vマネージャをインストールする
- コントロールパネルのプログラムの「Windows の機能の有効化または無効化」で、Hyper-Vツールにチェックを入れる
- HVRemote.wsfをダウンロードする
- コマンドプロンプトを右クリックして「管理者として実行する」
- ダウンロードしたHVRemote.wsfのあるディレクトリに移動し、次のコマンドを打つ。
- 管理ツールのHyper-Vマネージャを開いて接続を確認する。だめなら再起動してもう一度試してみる。
cscript.exe hvremote.wsf /mmc:enable
cscript.exe hvremote.wsf /anondcom:grant
セキュリティへの配慮
安全なリモートデスクトップが利用できているなら、
「Hyper-Vマネージャを使いたいときだけサーバでHamachiを起動する」のがベストである。
使わないときはオフにしておく。
JOINをどうするか。
まず、RDBMSで自分が設計するテーブルの種類を洗い出してみた。
- ハッシュ(設定ファイル的な用途)
- 一対多のリレーション
- 多対多のリレーション
- 人間様向けに視認できるようにするための表(view)
- なんとかマスタ
- 取引の記録
こんだけと言えば、こんだけである。
もうちょっとだけ掘り下げておく。有料サイトのアクセス権を管理するシステムを想定する。
- customersマスタ
- sitesマスタ
- purchase_history(誰がいつ何を買ったかの記録 一対多)
- permission(誰がどこに入れる権限を有するかの状態 多対多)
- お客様がどのサイトにアクセス出来るかの一覧(ビュー)
リレーションをPHPで書くために最低限必要なことは、関連するすべてのテーブルをreadしないといけない。
それが嫌なら、リレーションの結果として取得したいデータを、あらかじめテーブルに埋めておくしかない。
SQL的に言うなら「パフォーマンスを稼ぐために正規化をあえて崩す部分を作る」ということになる。
「お客様がどのサイトにアクセス出来るかの一覧」を得るための最小限のコードは、次のようになる。
SELECT sites.name
FROM permission
INNER JOIN sites ON permission.sites_id = sites.id
WHERE customers.id = 1
これに対して、あらかじめpermissionテーブルの中にsites.nameを格納しましょう、というアプローチはだいぶナンセンスだ。なので仕方なくこれを分けることにする。
$sites_ids =
SELECT sites_id
FROM permission
WHERE customers_id = 1
$site_names =
SELECT name
FROM sites
WHERE id IN ( 【join(',', $site_ids)】 )
【】の中身はSQLではなくPHPです。
ちなみに、TT用語では、INのことを TDBQCNUMOREQ というらしい。
これを拡大して、「サイトの価格を表示したい」「合計金額も計算したい」となった場合は、合計金額の表示はPHPで計算することになる。カテゴリ別に分類したり、カテゴリごとの合計金額を出すのもPHPの仕事だ。でもそれは元々多次元配列で実現するだろうから、あまり労力は変わらないんじゃなかろうか。
この$site_namesを「購入順」に並べたい。となると、話は少しややこしくなる。
ひとつの方法は、PHPで配列をマージした上でsortしてしまう手である。さもなくば、新しい配列を作って並べ直す。
// $site_idsは ORDER BY dt ASCされているものとする。
// $site_namesは site_id を キーにしているものとする。
$sorted = array();
foreach ($site_ids as $site_id) {
$sorted[] = $site_names[$site_id];
}
ちょっと苦しいけど、まあ出来る。値渡しにしたらメモリ効率は良くないだろうな。
なんだかこの作業って、ORMの内側にある泥臭い実装とあんまり変わらない気がするのだ。
どうせmysqldにはhtmlspecialchars関数は無いので、ビューで受け取った値をさらに加工しているのが実態である。
だったら、いままでSQLに頼ってきた処理も全部PHPで用意しとけば便利じゃね? と思ったりする。
それだけじゃ実現不可能なケースや、実現コストが現実的ではないケースを考えようとしてみたけど、
とりあえずはあんまり浮かばなかった。あとは色々試してみるしかないな。