「ほっ」と。キャンペーン
<   2012年 05月 ( 20 )   > この月の画像一覧
nslookup でDNSサーバを明示的に指定したい
通常 nslookup を叩くとデフォルトのDNSサーバに対してクエリを発行します。
これを任意のDNSサーバに対して名前解決を要求する方法ですが、nslookup の第二引数にDNSサーバを指定してやればいいようです。

nslookup hoge.exsamle ns1.piyo.ne.jp
Server: ns1.piyo.ne.jp
Address: xxx.xxx.xxx.xxx

Name: hoge.exsamle
Address: yyy.yyy.yyy.yyy


参考:
@IT:Windows TIPS -- Tips:nslookupの基本的な使い方(イントラネット編)
[PR]
by Jehoshaphat | 2012-05-16 00:35 | ネットワーク | Trackback | Comments(0)
(HTML)IE8で「操作は中断されました。」となる
簡単なWEBサイトを作っていたんですが、IE8でテストしていると、リンクを押下すると、「操作は中断されました。」とかいうエラーが表示されました。
ただ、この現象がでるPCとでないPCがある上に、現象発生するPCでもたまに現象が起きなくなる場合もあり、非常に気味が悪い現象でした。
(FirefoxやChromeなど他のブラウザでは発生しません。また、IE6でも発生しませんでした。)


いろいろ試すと、リンク元のページから、現象が発生するリンク先のページのURLにアンカータグ(ページ内リンク)が付いていると、この現象が発生します。(例:http://hoge.jp/test#top)
逆にアンカーリンクをのけると発生しません。(例:http://hoge.jp/test)

また、アンカーの名前を "top" にしているんですが、これを別の名前に変えたところ現象が発生しなくなりました。


同様の現象が、MS TechCenter:ページ内アンカーに移動しないIEでは”top”って予約語なのか?(ID名がtopだと移動できない?) | わたしのmemo帳でも取り上げられてました。

まったく、IEには困ったものです。
[PR]
by Jehoshaphat | 2012-05-16 00:34 | Webがらみ | Trackback | Comments(0)
(Word)セルの途中で改ページを許可する
Wordで表を作成したときに、セル(行)の途中で改ページを許可する方法です。
表のプロパティを表示し、"行"タブで、"行の途中で改ページする" にチェックをいれればOKです。

しかし、まれにこのチェックがグレーアウトしてチェックできないケースがあります。

これは表が途切れる位置にあるセルで、文字方向が縦になっている場合に起こるようです。
なので、文字方向を横にしてやる必要が有ります。

あまりWord触ってないので、基本的なこともわかってない3流PGです。


参考:
Word-表 「行の途中で改ページする」がグレーアウトされ、チェックを入れることができない。 - 教えて!HELPDESK
Wordの表で、セルの途中で改ページされないようにしたい: [aotenブログ]木村幸子の知って得するマイクロソフトオフィスの話
[PR]
by Jehoshaphat | 2012-05-16 00:33 | 豆知識 | Trackback | Comments(0)
(.Net)文字列で桁を揃えるため0埋めしたい

下記のように文字列型で数値をいれているケースが有るとします。
string no = "1234";


これを7桁にし、先頭に0で埋めたいというケースの場合、String.PadLeft メソッドを使えばいいようです。
string no = "1234";
no = no.PadLeft(7,'0');


こうすると、0001234 という文字列になります。


ちなみに、数値型を0埋め文字列にしたい場合は、String.Formatが使えますね。
int num = 123;
string str = String.Format("{0:0000}", num);



参考:
指定の文字数になるまで先頭を文字で埋める
@IT:数値を右詰めや0埋めで文字列化するには?[C#、VB]
[PR]
by Jehoshaphat | 2012-05-16 00:32 | .Net開発 | Trackback | Comments(0)
ドライバサービスを起動しないようにする
とあるWindowsPCで、「PCAMPR5 NDIS Protocol Driver サービスは次のエラーのため開始できませんでした: 指定されたパスが見つかりません。」というエラーがイベントログに大量に出てました。

どうやらLAN関係のドライバをいれてアンインストールしたらしいのですが、インストーラの出来が悪いようでドライバが残ってしまってしまってるようです。

ググッた結果 PCAMPR5 のサービスを削除すればいいとあったので、下記コマンドで削除を試みます。

sc delete PCAMPR5

これで、レジストリの HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PCAMPR5 を見たら消えてたんでやれやれと思い再起動をかけるとまたイベントログに同じエラーが。。。

レジストリを見たところ消えていたキーが復活してます。。
なぜかは不明です。。

レジストリから直接消してもリブートするとまた復活してしまいます。


仕方ないので消すのは諦めこのサービスが起動しないように設定することにしました。

sc コマンドを使いサービスの構成情報を表示します。


sc qc PCAMPR5

TYPE :1 KERNEL_DRIVER
START_TYPE :3 DEMAND_START
....


START_TYPE :3 DEMAND_START というのは、MSサポート:Windows でカーネル モードのフィルタ ドライバを一時的に無効にする方法によると、ドライバまたはサービスを要求に応じて起動する必要があります。という意味だそうです。

上記MSページにあるとおり、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PCAMPR5 の Start の値を 4 つまり、ドライバまたはサービスの読み取りや初期化は行われません。 にして再起動してみました。

するとエラーがイベントログに出ていません。どうやらこれでサービスの停止が上手くいったようです。


参考:
Tamutamu: PCAMPR5 と WNNDIS5
@IT:強化されたコマンドライン・ツール(前編)
sc:コマンドプロンプトを使いこなそう!
SCコマンド - Astarisk Works Wiki
[PR]
by Jehoshaphat | 2012-05-16 00:30 | 豆知識 | Trackback | Comments(0)
(.Net)DataTable.Selectの条件は引用符でくくらないとおかしなことになる
DataTable.Selectメソッドを使って、データの抽出を行ってました。
下記のように検索対象の列は文字列型ですが、中身は数値が入っています。

string strNo = "10";
 
DataTable tbl = new DataTable();
tbl.Columns.Add("no");
tbl.Columns.Add("name");
 
tbl.Rows.Add(new object[] { "1", "hoge" });
tbl.Rows.Add(new object[] { "10", "hoge" });
tbl.Rows.Add(new object[] { "2", "hoge" });
tbl.Rows.Add(new object[] { "20", "hoge" });
 
DataRow[] rows = tbl.Select("no=" + strNo);


検索値を 10 とすると以下のような例外が select メッソド実行時に発生します。

System.ArgumentException がキャッチされました
Message="Range オブジェクトの Min (1) は、 max (-1) 以下でなければなりません。"
Source="System.Data"
StackTrace:
場所 System.Data.Select.GetBinaryFilteredRecords()
場所 System.Data.Select.SelectRows()
場所 System.Data.DataTable.Select(String filterExpression)
場所 Hoge.hoge() 場所 D:\mydoc\devlop\hoge.cs:行 12
InnerException:


ちなみに、検索値を他の値に設定するとこのエラーが出ません。

で、原因を調べた結果、MSDNフォーラム: VB2005 .NET2.0 DataTable.Select()メソッドに関してに答えが。。

ほぼコピペですが、詳しい話を。。
DataTable.Selectメソッドの内部ではバイナリサーチ(二分探索)を使っているようです。
バイナリサーチは、一旦リストをソートしてから出ないと実行できません。
検索列は文字列型なので、ソートすると下記のようになります。(文字列上の昇順になるわけです)

1,10,2,20

バイナリサーチはソートしたリストから中央の値を検索値と比較して、検索したい値が中央の値の右にあるか、左にあるかを判断するので、この場合、2番目以降(値10)に値があると判断されます。
そして、10の値がどこまで続いているかを調べるためにバイナリサーチではもう一回検索されるわけですが、その時検索値の 10 とリスト内の 2 が比較された結果、10 > 2となり、DataTable内の "2" と "20" の間に 10 があるはずだとなって、エラーになるようですね。

対策として、下記のようにSelectメソッドの検索値に引用符(シングルクォーテーション)を付けて明示的に文字列だとすればこのエラーは回避できます。

DataRow[] rows = tbl.Select("no='" + strNo + "'");


文字列検索するときは引用符の付け忘れに注意しましょう。
引用符つけなくても一応動いてしまうので厄介です。

参考:
DataTable.Select の条件式での型推論による弊害
[PR]
by Jehoshaphat | 2012-05-15 23:39 | .Net開発 | Trackback | Comments(1)
DFSサーバ障害時にすべきこと
WindowsServer2008R2を2台使ってドメインDFSサービスを提供しています。
しかし、クライアントOSがXPの場合、片方のDFSサーバに障害が起きると、共有フォルダアクセス時に30秒弱の遅延が発生します。
(フォルダ開く毎に30秒かかるので、作業になりません。Windows7の場合は遅延は最初の一回だけで後はサクサクでした。)

詳しい原因はわかりませんが、パケットキャプチャした結果XPの場合、障害後も両方のサーバにアクセスしているようです。

いろいろ試した結果、障害があったサーバをDFSサーバとして無効にしてやればいいようです。
(削除すると、おかしなことになり、DFSサービスを再インストールする羽目になりました。)

削除の手順としては障害発生時に、正常稼動中のDFSサーバの管理ツール→DFSの管理を起動します。
そして、名前空間ツリー展開→名前空間名 をクリックし、中央ペインの "名前空間サーバ" タブを選択します。
障害がおきているサーバを右クリック→名前空間サーバを無効にする を押下します。

これで障害サーバが切り離されました。
しかし、この設定が各クライアントOSに適用されるまでにおおよそ20分程度掛かりました。(早い場合は数分で適用されます)

サーバが普及した場合は、上記と同じ設定のところで、有効にしてやればいいようです。


障害を考えて冗長化しているので、ほんとはタイムラグ無しで障害サーバを見ないよう切り替わって欲しいわけですが、とりあえずこの方法しか思いつきませんでした。

もっといい方法があれば教えて欲しいですね。
[PR]
by Jehoshaphat | 2012-05-15 23:37 | サーバがらみ | Trackback | Comments(0)
(Apache)名前バーチャルホストを設定したらメインのドキュメントルートにアクセスできなくなった
Apache2.2で以下のように名前バーチャルホストを設定しました。
(一つの IP アドレスでいくつかの名前ベースの ウェブサイトを実行するタイプのバーチャルホストです。)

余談ですが、Apache2.2だと conf\extra\httpd-vhosts.conf に設定を書いてやればいいようです。
(httpd.confで "Include conf/extra/httpd-vhosts.conf" のコメントを退ける必要があります)


NameVirtualHost *:80

<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2
DocumentRoot "E:/mydoc/hogeproject/html"
ServerName hogeserver
ErrorLog "logs/hogeserver-error.log"
CustomLog "logs/hogeserver-access.log" common
</VirtualHost>

<Directory "E:/mydoc/hogeproject/">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>


しかし、これで localhost にアクセスしても、上記で設定したディレクトリのコンテツが表示されてしまうのです。
こちらが意図しているのはデフォルトのドキュメントルート("C:/Program Files/Apache Software Foundation/Apache2.2/htdocs")にアクセスして欲しかったのです。

で、Apacheのマニュアルをみるとこう書いています。
アスタリスクはすべてのアドレスにマッチしますので、主サーバは リクエストを扱いません。www.example.com は 最初にあるため、優先順位は一番高くなり、default もしくは primary のサーバと考えることができます。つまり、リクエストが どの ServerName ディレクティブにもマッチしない場合、 一番最初の VirtualHost により扱われます。
なるほど。* とすると主サーバ、つまりhttpd.confにあるドキュメントルートは使われないようです。
といういことで、以下のようにしました。
これで ServerName と一致しないrequestは上側のデフォルトのドキュメントルートを見に行くようになります。

NameVirtualHost *:80

<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2
ServerName hoge
DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs"
ErrorLog "logs/error.log"
CustomLog "logs/access.log" common
</VirtualHost>

<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2
DocumentRoot "E:/mydoc/hogeproject/html"
ServerName hogeserver
ErrorLog "logs/hogeserver-error.log"
CustomLog "logs/hogeserver-access.log" common
</VirtualHost>

<Directory "E:/mydoc/hogeproject/">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>



参考:
(Apache)名前バーチャルホストでハマった
[PR]
by Jehoshaphat | 2012-05-13 21:36 | サーバがらみ | Trackback | Comments(0)
Smartyのincludeの話
Smartyを使っててテンプレート側の共通部分を上手くまとめられないかと思いました。
例えば下記のようなテンプレートファイルがあるとします。
●hoge1.tpl

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>{$title}</title>
</head>
<body>
<form action="./check.php" method="post">
氏名:<input type="text" size="30" name="name" value=""><br>
住所:<input type="text" size="30" name="addr" value="">}<br>
<input type="submit" value="送信">
</form>
</body>
</html>



●hoge2.tpl

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>{$title}</title>
</head>
<body>
氏名:{$name}<br>
住所:{$addr}<br>
</body>
</html>


上記のテンプレートファイルですが、ヘッダ部分は共通化できますね。
ということで、Smartyの{include}を使うと、下記のようにヘッダファイルを共通化できます。

●head.tpl

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>{$title}</title>
</head>



●hoge1.tpl

{include file='head.tpl'}
<body>
<form action="./check.php" method="post">
氏名:<input type="text" size="30" name="name" value=""><br>
住所:<input type="text" size="30" name="addr" value="">}<br>
<input type="submit" value="送信">
</form>
</body>
</html>



●hoge2.tpl

{include file='head.tpl'}
<body>
氏名:{$name}<br>
住所:{$addr}<br>
</body>
</html>



リファレンスを見ると、includeするファイル名にも変数を使用できるようなので、上手くincludeを使うとかなり共通化できよりメンテナンスに強いサイトに出来るかもしれません。
[PR]
by Jehoshaphat | 2012-05-13 21:33 | PHP開発 | Trackback | Comments(0)
(PHP)include_pathを本番環境、開発環境で切り替える

PHPで共通に使う外部ファイルを読み込ませたい時、絶対パス指定で require_once をする時が多いと思います。
(ディレクトリ階層が異なる場合や、インクルード先からさらに別ファイルをインクルードしている場合には絶対パスの方が無用なトラブルを避けれるので。。)


しかし、本番環境とローカルの開発環境では絶対パスが異なることが多々有ります。


いちいち各PHP内のファイルを本番にアップする前に置換したりするのは非常に手間です。
で、いい方法はないか探していると、include_path:とことん!ホームページに役立つ方法が。。。
そういう時に以下にようなスクリプトを各PHPの最初に実行するようにしておけばいいようです。(Smartyのライブラリをincludeする例です)

/**
* PHPのinclude_pathを設定。
* 本番環境、テスト環境を切り分ける。
*/

function IncludePathSetting(){
if ($_SERVER['SERVER_NAME']=='www.hoge.exsample' ){
//本番環境
$path = '/usr/home/hoge/smarty/libs/';
} else {
//リモートホスト
$path = 'D:/mydoc/hogeproject/smarty/libs/';
}
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
}



ちなみに、include_pathがうまく設定できてなかったり、パス指定が間違っていると、以下のようなエラーがでます。

Warning: require_once(Smarty.class.php) [function.require-once]: failed to open stream: No such file or directory in D:\hoge.jp\html\test.php on line 20

Fatal error: require_once() [function.require]: Failed opening required 'Smarty.class.php' (include_path='.;C:\php5\pear;D:\hoge.jp\html\') in D:\hoge.jp\html\test.php on line 20



参考:
codeなにがし::require_once で相対パスを使うと・・・:
基本的なインストール | Smarty:
PHP の include, require で相対パスを指定して読み込む場合のメモ
[PR]
by Jehoshaphat | 2012-05-13 21:27 | PHP開発 | Trackback | Comments(0)