情報流通モデル(メディアタイプの変遷)

インターネット

Google時代(個 → 場)

⇒ 能動と受動が一対一。

検索			:情報検索	SEARCH		能動

		↓

・閲覧			:情報取得	INPUT		受動


Web1.0(BBS)フェーズ
⇒ 「場」が基点となり情報の授受が行われる。

コンテンツ登録	:情報発信	OUTPUT		能動

	個	⇒	場	←	個(能動)		:every time
				取得


RSS(blog)フェーズ
⇒ 情報の授受が行われる「場」の変化をwatchする「系」の登場。

コンテンツ登録	:情報発信	OUTPUT		能動

	個	⇒	場	←	個(能動)		:every time
				取得
			↑参照
				┌	←	個(能動)	:once
					登録
			└	系

				└	→	個(受動)	:at any time
					配信
SNS時代(個 → 個)

⇒ 「個」と「個」による情報の共有。

コンテンツ共有	:情報発信	OUTPUT	PUSH	能動

	個	⇔	個(能動)
		連結

		↓

	個	⇒	個(受動)


twitterフェーズ
⇒ 「個」が基点となり情報発信が行われ、「場」も「個」の中に取り込まれる。

コンテンツ発信	:情報発信	OUTPUT	PUSH	能動

	個	⇒	場

			↓登録

	個	⇒	self(stream)

			│		┌	←	個(能動)	:once
						登録
			└	→	系

					└	→	個(受動)	:at any time
						配信

Active Directoryを用いたWindowsネットワークの構築(トピックス集)

先日からちょっとした案件の絡みで、Active Directoryを用いたWindowsネットワークを構築することになった。
今までWorkgroupを用いたWindowsネットワークの構築なら、それなりに経験があったが、
Active Directoryを用いてドメインを作成するようなWindowsネットワークというのは今回が初めてであった。

一応、ある程度設定がされた環境があった上で、トラブルシュート的にシステムの正常化を行うような形の対処ではあったが、
Windowsネットワーク上で動作するアプリケーション用のテスト環境構築ということで、
それに必要な内容については、一通り目を通したと思うので、参考にしたサイトの紹介を中心に、トピックス的にまとめておく。

Active Directoryの基礎知識

そもそもActive Directoryとは?基本的な設定として何をすればいいのか?各バージョン毎の特徴は?
といった内容を理解するために参照したサイト。

//ja.wikipedia.org/wiki/Active_Directory">Active Directory - Wikipedia:Active Directoryというものは何か?を理解するためにまず参照した情報。
ドメイン”という考え方と”ドメインコントローラ”という概念を理解するのがポイントかなと。
//www.atmarkit.co.jp/fwin2k/win2ktips/1166adfunclev/adfunclev.html">Active Directoryドメイン/フォレストの機能レベルとは? − @IT:Active Directoryというのはそれを搭載するサーバOS毎にそれぞれ若干が異なる、
というのは耳にしていたが、じゃあ実際どういった違いがあるのか?ということで、
主に機能面の違いをざっくりとではあるが、概要把握のために参照したページ。
//www.atmarkit.co.jp/fwin2k/win2ktips/980buildad/buildad.html">Active Directoryドメインを構築する(基本編) − @IT:Active Directoryをいざ設置しようとなった時に、
先ず最初に設定するOSのネットワーク設定およびActive Directoryインストールの手順について書かれている。

記事内にも書かれている通り、Active Directoryというのは本来入念な計画を立てた上で導入するべきものである。

ただ、今回の自分のケースのように、テスト環境構築などや学習目的などで、
手早くActive Directoryを導入したい場合も当然あり、そういった時に参考になる基本的な情報がまとめられている。
//journal.mycom.co.jp/series/win2008/006/index.html">【連載】Windows Server 2008で運用管理はどう変わる? (6) Active Directory 関連の仕様変更 - 管理ツール編 | エンタープライズ | マイコミジャーナル:Windows Server 2008からの特徴がざっとまとめられている。
今回の自分のケースではそこまで必要としなかったが、
2008の特徴をより知りたい場合に参考になりそうな記事ということでピックアップしておく。

ドメイン移行関連

今回の自分のケースは、既に暫定的にインストールした環境があり、それを正常動作させるというタスクであったが、
その中でも、テスト用に暫定的に設定しておいたドメインを本番環境と同等のモノに合わせるという時に参照した情報。

前述の記事でも書かれていたが、Active Directoryというのを導入する際はある程度計画を立ててから設置を始めるべきである。
このケースの対応を行ってみて、設置済みのドメインを移行するというのが如何に大掛かりであり、
また、そもそもそういった状況はあまり想定されていない(推奨されていない)というのがよく分かった。

今回はテスト環境でまだそれ程設定を行っていない状況であったから影響は小さかったが、
本運用している環境でのケースではより入念な計画を立てた上でより慎重に、
より詳細な情報源に頼ることをお勧めする。あくまでテスト環境用ということで参照するように。

//technet.microsoft.com/ja-jp/library/cc740017(WS.10).aspx">ドメイン コントローラを降格させる:ドメインを移行する際、先ず最初に考えた方法は、OSのネットワーク設定からサーバの所属ドメイン変更するという方法。
しかし、変更しようとしたところ、ドメインコントローラに設定されているため変更できない、という警告が出た。
そこでドメインコントローラから降格させる方法として参照したのがこのページであったが、
この手順を完遂するには、他のドメインコントローラが必要、ということであった。

別途、SambaやLDAPを用意すれば実行できないこともなかったかもしれないが、
あいにく適当なサーバを用意できなかったため、結局、この方法は断念した。
//support.microsoft.com/kb/230306/ja">[HOW TO] 孤立したドメインActive Directory から削除する方法:ネットワーク設定から単純に所属ドメインを変えるが困難、ということで、次に考えたのが、
そもそも今あるドメインを削除してしまおう、ということで参照したのがこのページ。

しかし、この手順を実施してみたものの、”remove selected domain”のところでやはりエラーが出てしまった。
//journal.mycom.co.jp/series/AD/093/index.html">【連載】にわか管理者のためのActive Directory入門 (93) RENDOMコマンドを使ったドメイン名変更(後編) | エンタープライズ | マイコミジャーナル:最終的に、この方法でドメイン名の変更は成功した。

dendom”という専用コマンドを用いることで、移行ができるらしい。
問題なく完了することはできたが、実際この手順を踏んでみて、
ドメイン変更というのが容易な操作ではない、というのがよく感じ取れた。

因みに、記事の最後にも書かれているが、この手順の後に
gpfixup /olddns:<移行前のDNS名> /newdns:<移行後のDNS名>
を実行しておくこと。(詳しくは、”gpfixup /?”参照。)
//page2rss.com/p/3b07ee49fd514d59abcc46d802e762d1_4884132_4884615">- Page2RSS:ドメイン名の変更が成功した後もいくつか問題点が残った。

移行前のドメインドメイン参加させていたコンピュータから、
移行後のドメインに新たに参加させることができないという状況に陥った。

全く方策を見出せなかったので、とりあえず力技でレジストリを片っ端から、
移行前のドメインに参加していたコンピュータの名前で全文検索して調べていった。

その中にあった、”HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ADs\Providers\LDAP\”という
レジストリ名で検索をかけて、引っかかったのがこのページ。

直接の解決方法が載っているワケではないが、ページの一番下に
レジストリ名)と、その先がさしているファイルを削除を実施しました。
上記対処を実施後、無事 MaxPwdAge を取得することに成功しました!!めでたしめでたし!
というヒントがあったので、このレジストリ値が指し示すパスに存在するファイルを削除してみたところ、
なんとかドメインに参加させることに成功。

ただし、ドメイン移行前にサーバがコンピュータ名として使用していた名前は、
移行後のドメインでも使用することができなかった。
これはまた別の問題なようで、結局未解決のまま。
//www.atmarkit.co.jp/fwin2k/win2ktips/1075renamepc/renamepc.html">Windows Server 2008のコンピュータ名をコマンドラインから変更する − @IT:ドメイン名の変更が完了しても、”フルコンピュータ名”は依然、移行前のドメイン名のままであった。
ただ前述の通り、ドメインコントローラに指定されているため、相変わらずGUIから変更はできなかった。
そこで、コマンドラインから変更する方法はないか?ということで辿り着いたのがこの記事。

この手順によって、無事、フルコンピュータ名も変更完了。

また、ここで紹介されている方法によって、サーバにコンピュータ名を複数持たせることも可能。

SQL Server関連

Active Directoryの設定とは直接関係はないが、”Active Directory経由でSQL Serverにアクセスする”
という運用であるため、併せてSQL Serverの設定も行った。

//techon.webhop.net/?tag=sql-server-2008-management-studio-express">InstallManiax3 サーバー構築日記 » SQL Server 2008 Management Studio Express:初歩中の初歩であるが、SQL Serverにアクセスユーザを設定し、db_owner権限を付与する手順。
ポイントは各データベースのユーザー設定に追加するのではなく、全体のセキュリティ設定のログインに追加すること。

参考文献

//itpro.nikkeibp.co.jp/article/COLUMN/20060224/230618/">管理者必見! ネットワーク・コマンド集 - 管理者必見! ネットワーク・コマンド集:ITpro:今回はあまり参照することはなかったが、コマンドからネットワーク設定を行う上での基本。
汎用的なリファレンスとしてご参照下さい。

jQueryを用いた増殖フォームについて(および:hiddenセレクタの挙動に関する注意事項)

HTMLでフォームを作る際、初めから必要個数が分かっている場合であれば、静的なHTMLファイル一枚用意すれば事は足りるが、ユーザ操作によって動的にフォームを増やせるようにしたい、といった場合には、JavaScriptによってHTMLをDOM操作して処理する必要がある。
そういった場合に、jQueryを用いることで、かなり容易に実装することが可能となる。

今回は、そのテストケースとしての実装例を挙げ、その挙動について考察をしてみる。

環境

今回の実装およびテストは以下の環境にて行った。

ライブラリ
  • jQuery1.4.2
ブラウザ

単純なフォームの複製

copyボタンを押すことで、フォームのまとまり(ブロック)が複製されていくという単純な例を、以下の通りに実装した。

[test1.html]

<html>
<head>
  <script type="text/javascript" src="jquery-1.4.2.min.js"></script>
  <script type="text/javascript">
  <!--
	// フォームの複製を行う関数を定義
	var copy_block = function(i) {
		var increament_id = function(name,id) {
			$("#cover"+id+" ."+name).attr("id", name+id);
		};
		
		var target = $("#cover"+(i-1));
		target.clone().insertAfter(target).attr("id","cover"+i);
		
		increament_id("text",i);
		increament_id("field",i);
		increament_id("select",i);
		
		$("#field"+i).val(i);
		
	};

	// イベントを設定
	$(function() {
		$("#button1").click(function() {
			var i=1;
			while($("#cover"+i).length != 0) {
				i++;
			}
			copy_block(i);
		});
	});
  //-->
  </script>
  <title>test</title>
</head>
<body>
  <div id="cover1">
    <input type="text" class="text" id="text1" />
    <input type="hidden" class="field" id="field1" value="1" />
    <select class="select" id="select1">
      <option value="0">--</option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
  </div>
  <input type="button" id="button1" value="copy" />
</body>
</html>

まず、フォームを覆うdiv要素にcover1というIDを付け、その中にtextフォームとhiddenフォーム、selectフォームを配置した。(IDはそれぞれ”text1”、”field1”、”select1”とする。)
目的の動作は、copyボタンをクリックすることで、div要素が元のdiv要素の後ろに複製されていくという内容。

実際の処理内容は、まず、copy_blockという関数を定義し、この関数をcopyボタンのクリックイベントに割り当てる。この関数を呼び出す際、新規に作成するdiv要素の通し番号(IDに付加するための数値)を引き渡す。

copy_block関数では、直前のdiv要素をセレクタに指定し、clone()によって複製、insertAftter()で配置していく。複製の後、各フォームのIDを新しい通し番号に更新する。
この更新処理のため、各フォームのclassには、IDの値から通し番号を除いた名前を予めclass名として持たせておき、複製完了直後、”複製したdiv要素以下の、指定class値を持つ要素”という形でこのclass名をセレクタに指定し、”class名 + 新しい通し番号”という形式で値を作成し、IDを更新していく。

ex)
 <input type="text" name="text1" id="text1" class="text" />
としておき、
 $("cover"+i+" .text").attr("name", "text"+i).attr("id", "text"+i);
とすることで、
 <input type="text" name="text2" id="text2" class="text" />
とすることができる。


因みに、[test1.html]のコード例では、IE以外のブラウザでフォームを複製する時に、select要素のselected指定されたoption情報が引き継がれない。(なぜIEは引き継ぐのかは不明。)
そのため、select要素のseleced指定されたのoption値については、別途、複製処理を行う必要がある。

[test2.html]

<html>
<head>
  <script type="text/javascript" src="jquery-1.4.2.min.js"></script>
  <script type="text/javascript">
  <!--
	var copy_block = function(i) {
		var increament_id = function(name,id) {
			$("#cover"+id+" ."+name).attr("id", name+id);
		};
		
		// select要素のselected指定されたoptionの情報を複製するための関数を定義
		var set_select_vals = function(i) {
			var prev_vals = [];
			$("#cover"+(i-1)+" select").each(function() {
				prev_vals.push( $(this).val() );
			});
			$("#cover"+i+" select").each(function() {
				$(this).val( prev_vals.shift() );
			});
		};
		
		var target = $("#cover"+(i-1));
		target.clone().insertAfter(target).attr("id","cover"+i);
		
		increament_id("text",i);
		increament_id("field",i);
		increament_id("select",i);
		
		$("#field"+i).val(i);
		
		set_select_vals(i);
	};

	$(function() {
		$("#button1").click(function() {
			var i=1;
			while($("#cover"+i).length != 0) {
				i++;
			}
			copy_block(i);
		});
	});
  //-->
  </script>
  <title>test</title>
</head>
<body>
  <div id="cover1">
    <input type="text" class="text" id="text1" />
    <input type="hidden" class="field" id="field1" value="1" />
    <select class="select" id="select1">
      <option value="0">--</option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
  </div>
  <input type="button" id="button1" value="copy" />
</body>
</html>

上記のコードではset_select_vals関数を追加した。
この関数では、複製元のselected指定されたoptionのvalue値を取得し、それを新しいselect要素にも適用する、という処理を行っている。
なお、selected指定されたoptionのvalue値の取得およびselected指定は、共にval()によって行っている。

空のフォームを追加する

より実際的なニーズに対応するためには、単純な複製だけでなく、設定した値をクリアした状態での複製―すなわち、フォームの新規追加も可能にしておく必要があると思われる。
今回の例では、まず先に複製を行い、その後に値を初期化する、という方法を取る。

[test3.html]

<html>
<head>
  <script type="text/javascript" src="jquery-1.4.2.min.js"></script>
  <script type="text/javascript">
  <!--
	var copy_block = function(i) {
		var increament_id = function(name,id) {
			$("#cover"+id+" ."+name).attr("id", name+id);
		};
		
		var set_select_vals = function(i) {
			var prev_vals = [];
			$("#cover"+(i-1)+" select").each(function() {
				prev_vals.push( $(this).val() );
			});
			$("#cover"+i+" select").each(function() {
				$(this).val( prev_vals.shift() );
			});
		};
		
		var target = $("#cover"+(i-1));
		target.clone().insertAfter(target).attr("id","cover"+i);
		
		increament_id("text",i);
		increament_id("field",i);
		increament_id("select",i);
		
		$("#field"+i).val(i);
		
		set_select_vals(i);
	};
	// 値を初期化した状態で複製を行う関数を定義
	var add_block = function(i) {
		var init_vals = function(i) {
			$("#cover"+i+" :text").val('');
			$("#cover"+i+" :hidden").val('');
			$("#cover"+i+" select").val('0');
		};
		copy_block(i);
		init_vals(i);
	};

	$(function() {
		$("#button1").click(function() {
			var i=1;
			while($("#cover"+i).length != 0) {
				i++;
			}
			copy_block(i);
		});
		$("#button2").click(function() {
			var i=1;
			while($("#cover"+i).length != 0) {
				i++;
			}
			add_block(i);
		});
	});
  //-->
  </script>
  <title>test</title>
</head>
<body>
  <div id="cover1">
    <input type="text" class="text" id="text1" />
    <input type="hidden" class="field" id="field1" value="1" />
    <select class="select" id="select1">
      <option value="0">--</option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
  </div>
  <input type="button" id="button1" value="copy" />
  <input type="button" id="button2" value="new" />
</body>
</html>

[test2.html]から新たにadd_block関数を定義し、これをnewボタンのクリックイベントに割り当てた。
add_block関数では、フォームの値を初期化するためのinit_vals関数を定義し、それをcopy_block関数を実行した後、実行する。

[test3.html]のコード例でのセレクタ設定は、Firefoxにおいては問題なく動作する。
ただし、safariおよびGoogle ChromeWebKit系ブラウザでは、初期化時にselect要素の初期値が正しくセットされず、option要素が無選択の状態で追加されてしまう。
さらにこの状態で、optionの選択をしてcopyを行うと、今度はoption要素の最大値が設定された状態で複製されてしまう。
これはIEにおいてもほぼ同じ現象が発生する。(より正確に述べると、IEではそもそも値の初期化が行われない)

この問題は、以下のようにすることで解決できる。

[test4.html]

<html>
<head>
  <script type="text/javascript" src="jquery-1.4.2.min.js"></script>
  <script type="text/javascript">
  <!--
	var copy_block = function(i) {
		var increament_id = function(name,id) {
			$("#cover"+id+" ."+name).attr("id", name+id);
		};
		
		var set_select_vals = function(i) {
			var prev_vals = [];
			$("#cover"+(i-1)+" select").each(function() {
				prev_vals.push( $(this).val() );
			});
			$("#cover"+i+" select").each(function() {
				$(this).val( prev_vals.shift() );
			});
		};
		
		var target = $("#cover"+(i-1));
		target.clone().insertAfter(target).attr("id","cover"+i);
		
		increament_id("text",i);
		increament_id("field",i);
		increament_id("select",i);
		
		$("#field"+i).val(i);
		
		set_select_vals(i);
	};
	var add_block = function(i) {
		var init_vals = function(i) {
			$("#cover"+i+" :text").val('');
			// :hiddenの前にinputを指定
			$("#cover"+i+" input:hidden").val('');
			$("#cover"+i+" select").val('0');
		};
		copy_block(i);
		init_vals(i);
	};

	$(function() {
		$("#button1").click(function() {
			var i=1;
			while($("#cover"+i).length != 0) {
				i++;
			}
			copy_block(i);
		});
		$("#button2").click(function() {
			var i=1;
			while($("#cover"+i).length != 0) {
				i++;
			}
			add_block(i);
		});
	});
  //-->
  </script>
  <title>test</title>
</head>
<body>
  <div id="cover1">
    <input type="text" class="text" id="text1" />
    <input type="hidden" class="field" id="field1" value="1" />
    <select class="select" id="select1">
      <option value="0">--</option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
  </div>
  <input type="button" id="button1" value="copy" />
  <input type="button" id="button2" value="new" />
</body>
</html>

”:hidden”を指定する際、input要素の指定もしておくなど、より範囲を限定する形でセレクタを設定しないと、予期せぬ影響を及ぼすようである。
実際、この”:hidden”セレクタは、input要素のhiddenタイプに限らず、他の不可視状態にある要素もマッチしてしまうようである。(それがなぜselect要素に影響を及ぼすかは不明)

以上で、増殖フォームの実装が完了する。


ここからさらに、1ブロックあたりのフォームの数を増やすなど、カスタマイズしていくことで、より使い勝手の良いものとなっていく。
フォームの数が増えてきた場合には、ID名の一覧を配列に持たせ、それをループで読み出して処理するようにすることで、より柔軟に対応することが出来る。