<   2009年 01月 ( 38 )   > この月の画像一覧
(SQL Server)SQLサーバの無人インストールとインストール後の各種設定設定 Part1
SQL Server 2005 Express の無人インストールの設定と、インストール後の各種設定をコマンドでやる方法です。
システムに詳しくないところをターゲットにしたパッケージ等に使えると思います。

なお、インストール先にはまだ SQL Server が入ってないという前提と、管理者権限での実行が必要です。

また、SQL Server のインスタンスは既定のもの( MSSQLSERVER )とします。
なぜならば、インスタンスが規定でないとTCPのポートが動的になり、ファイアウォール回避が面倒だからです。


SQL Server 2005 本体のサイレントインストールは Setup.exe に必要な設定をあらかじめ記述した ini ファイルをわたしてやるだけで構いません。
SQL Server 2005 Express Edition with Advanced Services SP2 の場合、SQLEXPR_ADV_JPN.EXE を解凍すると、Setup.exe と同じフォルダに template.ini というファイルがあるとおもます。このファイルにいろいろ書いていけばOKです。
このファイルの各設定項目については、MSDN:コマンド プロンプトから SQL Server 2005 をインストールする方法の「.ini ファイルを使用して SQL Server 2005 のコマンド プロンプト インストールを実行するには」にパラメタの細かい説明が載っています。
インストールフォルダや、コンポーネント、認証の方式などいろいろ変更できます。

今回は下記の部分だけパラメタを変更してみました。

[Options]
USERNAME=aaaa
COMPANYNAME=bbbbb
;コンポーネント全てインストール
ADDLOCAL=ALL
;インスタンス名は既定のやつ(MSSQLSERVER)
INSTANCENAME=MSSQLSERVER
;自動起動させるコンポーネント
SQLBROWSERAUTOSTART=1
SQLAUTOSTART=1
;認証は SQL 認証も使うように
SECURITYMODE=SQL
;sa のパスワード
SAPWD=1234


これで、この template.ini ファイルを引数として下記のように setup.exe をたたくとサイレントインストールが始ります。(どうやらiniファイルは絶対パスじゃないといけないみたいです)

>Setup.exe /settings c:\template.ini /qn

なお、/qn のパラメタをつけると、一切のウィザード画面がでてこず、本当にサイレントインストールとなります。
なので、実際の運用時は適当なプログレスバーとか、現在進行中のログ内容を表示してあげたりとかしたほうが親切かもしれませんね。

一応下記のログファイルを見れば正常にインストールできたかどうかは判断できます。
%ProgramFiles%\Microsoft SQL Server\90\Setup Bootstrap\LOG\Summary.txt


次回は、インストール後の設定でネットワーク越しに SQL Server にアクセスできるようにする方法です。

(SQL Server)SQLサーバの無人インストールとインストール後の各種設定設定 Part2に続く。
[PR]
by jehoshaphat | 2009-01-31 23:54 | SQL | Trackback | Comments(0)
(VB.Net)DBへの接続文字列を動的に変更させる方法
OLE DBでのデータベースへの接続を動的に変更させる方法です。

Visual Studio のデザイナで各 TableAdpter の接続先は、Settings.settings で指定したものとしてます。

これをソフトの起動時に設定ファイル等を読み込んで、接続先を動的に変更させるというのが要件です。

いろいろ方法はあると思うのですが、今回はここを参考にさせてもらいました。

要は、各 TableAdpter の接続先となっている Settings.settings で設定した接続文字列をコード内で置き換えるというものです。

とりえず、Settings.settings 内で接続文字列を2つ用意してみました。

┏━━━━━━━━━━━┳━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃名前 ┃型 ┃スコープ ┃値 ┃
┣━━━━━━━━━━━╋━━━━━━╋━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ConnectionString_mdb ┃(接続文字列)┃アプリケーション┃Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Data.mdb;Persist Security Info=True┃
┣━━━━━━━━━━━╋━━━━━━╋━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ConnectionString_sqlsv┃(接続文字列)┃アプリケーション┃Provider=SQLOLEDB;Persist Security Info=True;User ID=sa ┃
┗━━━━━━━━━━━┻━━━━━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

各 TableAdpter の接続先とは ConnectionString_mdb としています。

そして、 Settings.settings をソリューションエクスプローラで右クリック→「ファイルを開くアプリケーションを選択」で、「XMLエディタ」で開きます。
(XMLエディタで開くのは、設定デザイナでは接続文字列のスコープが変更できないため)
その XML エディタ上で各接続文字列について、Scope を "Application" から "User" に変更します。
(スコープを "User" に変更すると、My.MySettings.Default.ConnectionString_mdb が書き込み可能(ReadOnlyでなくなる)となります)
<Setting Name="ConnectionString_sqlsv" Type="(Connection string)" Scope="Application">
  ↓(Scopeを変更する)
<Setting Name="ConnectionString_sqlsv" Type="(Connection string)" Scope="User">

Settings.settings を保存後、DB接続コードが書いてるより手前で接続文字列を変更します。
下記の例ではスタートアップフォームのコンストラクタで接続文字列を変更させてます。
'デザイナにて TableAdapter の接続先は ConnectionString_mdb としている前提
'接続文字列の設定
Dim mode As Integer = 1
Dim sb As New OleDb.OleDbConnectionStringBuilder()
If mode = 0 Then
'MDB
sb.ConnectionString = My.MySettings.Default.ConnectionString_mdb
sb("Jet OLEDB:Database Password") = "1234"
sb("Data Source") = DataPath.GetDataBaseFilePath()
ElseIf mode = 1 Then
'SQL
sb.ConnectionString = My.MySettings.Default.ConnectionString_sqlsv
sb("Data Source") = "testsv\SQLEXPRESS"
sb("Initial Catalog") = "testDB"
sb("Password") = "1234"
End If
'変更した接続文字列をTableAdapterのデザイナで指定してる接続文字列に置き換える
My.MySettings.Default.ConnectionString_mdb = sb.ConnectionString

上記の例では Data Source や Password などはリテラルを使ってますが、本来なら設定ファイルを読み込む部分を、このコードより前に書き、そこで取得した値を使うのがいいと思います。

このほかにもTableAdapterのPartialクラスで動的に変更させたりするなどいくつか方法があるようです。
それら別方法については下記リンクが参考になると思います。
TableAdapterの接続文字列を変更する方法
ADO.NET TableAdapterの接続文字列を動的に変更したい TableAdapterのPartialクラスを使う方法です。コメント欄にサンプルソースが載ってます。


下記は接続文字列にかんするMSの情報です。
MSDN:接続文字列の使用 接続文字列の基本的考え方です。
MSDN:接続文字列と構成ファイル (ADO.NET) DBの設定を保存する構成ファイルの暗号化等についても書かれてます。DBのパスワードを構成ファイルに入れる場合は必見。
MSDN:接続文字列ビルダ (ADO.NET) ○○ConnectionStringBuilder を使った接続文字列の設定方法です。
[PR]
by jehoshaphat | 2009-01-28 21:01 | .Net開発 | Trackback | Comments(0)
Visual Studioセットアッププロジェクトでアップデートインストーラを作る
環境:Vitual Studio 2005 Pro

VSのセットアッププロジェクトでマイナーバージョンアップ用アップデートインストーラを作る方法です。
バグの修正等でマイナーバージョンアップする場合、ユーザが現行バージョンを明示的にアンインストールすることなく、アップデート用インストーラが旧バージョンを削除し、新バージョンをインストールするというほうがユーザには優しいでしょう。
もちろん、新規インストール時にも使えるようにする必要もあります。つまり、新規・アップデート兼用インストーラです。
(メージャーバージョンアップの場合はアップグレードになるので、また話が違ってくると思いますが。)

セットアッププロジェクトでちゃんと設定しないと下記のように「別のバージョンの製品が既にインストールされています。」とエラーになったりします。
e0091163_19175317.jpg


いろいろ試した結果下記のような設定だとうまくいきました。
セットアッププロジェクトのプロパティを下記のようにします。

RemovePreviousVersionsTrue にする。これは旧バージョンをインストーラで削除するプロパティらしいです。

UpgradeCode は変更しない。(前バージョンと同じコードにする)

ProductCode は新しいコードに変更する。(Versionプロパティを変更するとProductCodeも変更するかVSが聞いてきます)

Version をインクリメントする。

このインストーラでアップデートするとき、インストールフォルダを変更すると、前のインストールフォルダは本来消えないといけないのですが、カスタム動作するようにしてると、やはり *.InstallState ファイルは残ってしまいます。
( *.InstallState が残る件はVisual Studioセットアッププロジェクトのカスタム動作を参照。)


なお、すでにインストールされているバージョンより古いバージョンを入れようとすると下記のメッセージが表示されます。
e0091163_19182859.jpg

[PR]
by jehoshaphat | 2009-01-28 19:18 | .Net開発 | Trackback | Comments(0)
(ADO.Net)DataSetをMDB・SQL Server共通で使う
現在作成中のアプリケーションはデータベースに MDB を使っているのですが、これを複数人でクライアントサーバとして利用できるようにDBに SQL Server にするかつ、設定ファイルのパラメタでDBを MDB か SQL Serverかを変更できるようにという要件が上がりました。

で、DataSetやTableAdapterはVisual Studioのデザイナを使って定義してます。
工数が限られてるので、既存の DataSet を使って SQL Server ・ MDB 共通で使えるように変更する方法にしました。
(MDB は OLEDB 経由でつないでます。そのため、同じDataSetを使うため SQL Server にもOLE DB経由となります。)

DetaSet で使ってる SQL は基本的に単純なものばかりなので、SQL Server でも使えるはずです。
(これが複雑な SQL を使ってると DataSet は別に分けるべきでしょう。)
また、各TableAdapterはMDBファイルを参照しています。


まず、デザイナの TableAdapter で今設定してる SQL で文法に問題がないか調べます。
あれば、修正します。

そして、TableAdapter で自動的で作れる Insert , Update , Delete 文を、自動生成しないようにします。
TetbleAdapter を右クリックして、「構成」から「詳細オプション」で「INSERT、UPDATE、および DELETE ステートメントの生成」チェックを外します。
理由は現 TableAdapter は MDB ファイルを接続先としているのですが、接続先のデータプロバイダによって、自動生成されるSQLは最適化されるようです。
そのせいで自動生成された SQL はフィールドの区切り文字がつけられてしまいます。
MDB だとテーブル、列名の区切り文字が 「`」(バッククォート)になってしまいます。
(最初、TableAdapter の Insert や Update , Delete の CommandText プロパティから区切り文字を除去したのですが、DataSet 保存時に CommandText が再構成されるらしく、元に戻ってしまうのでダメでした。)
こんな感じです。
/* TableAdapter で自動生成されるSQLの例 */
INSERT INTO `ZipCode` (`ZipCode`, `PrefName`, `CityName`, `TownName`) VALUES (?, ?, ?, ?)

このテーブル・列名の区切り文字が本当に必要になるのは予約語や空白を含む名前をつけたときになるので、もし、そのような名前を使っていれば害がない名前に変更します。

ということで、各 TableAdaper の Partial クラスを ○○DataSet.vb につくり OleDbCommandBuilder から UpdateCommand , InsertCommandオブジェクトを生成します。
(もしくは、TableAdapterのクエリの追加で INSERT , UPDATE , DELETE を作ってもいいかもしれません。その場合は下記は不要です。)
OleDbCommandBuilder で動的に SQL を生成する場合は、そのテーブルの SELECT用 SQL が必要になります。で、SQL文を手で書くのはDBのフィールドに変更がると面倒なので、TableAdapte の Fill メソッドのSQLを使うことにします。
その Fill メソッドのSELECT文は ○○DataSet.Designer.vb の ○○TableAdapter.InitCommandCollection() メソッドをみると、CommandCollection配列の0番目にあるようなので、それを用いて OleDbCommandBuilder を使います。
(ただし、必ずしも CommandCollection(0) が Fill メソッドの SQL というわけでもないので注意が必要です。また、OLE DBは(パラメタ)プレス―ホルダーの順序が重要なので、CommandCollection(0) のSELECT文を使用しないと「同時実行違反 : UpdateCommand によって、処理予定の 1 レコードのうち 0 件が処理されました。」という例外が発生する場合があります)

下記が Datset の 各 TableAdapter 内で OleDbCommandBuilder を用い SQLを動的に生成するコードです。
とりあえずUpdateメソッドしか使ってません。DELETE,INSERT(INSERTはUpdateメソッドを使っても可能です)は、一旦DataSetをINSERT,DELETE自動生成モードにし ○○DataSet.Designer.vb で TableAdapterの各該当メソッド(Delete()やInsert())を ○○DataSet.vb の各 Partial クラスにコピペするといいと思います。ただ、引数にフィールド値が入るので、DBのフィールドを変更すると引数も変更しないといけないのが注意点です。

Partial Public Class ZipCodeTableAdapter
 
''' <summary>
''' Update,Insert用コマンド作成処理
''' </summary>
''' <remarks></remarks>
Private Sub InitCommandText()
If Me.Adapter.UpdateCommand Is Nothing OrElse Me.Adapter.InsertCommand Is Nothing Then
Dim da As New OleDb.OleDbDataAdapter(Me.CommandCollection(0).CommandText, Me.Connection)
Dim cb As New OleDb.OleDbCommandBuilder(da)
Me.Adapter.UpdateCommand = cb.GetUpdateCommand()
Me.Adapter.InsertCommand = cb.GetInsertCommand()
End If
End Sub
 
''' <summary>
''' テーブル更新処理(引数の種類によってオーバーロードしたほうがいいかも)
''' </summary>
''' <param name="dataTable"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function Update(ByVal dataTable As RhythmSalesDataSet.ZipCodeDataTable) As Integer
Me.InitCommandText()
Return Me.Adapter.Update(dataTable)
End Function
 
End Class

まあこう考えると DataSet はやはり接続するDB毎に分けた方が理想ですね。
この構成でOKなのは結構限られた条件となりそうです。

ちなみに、テーブル・フィールド名の区切り文字はOleDbCommandBuilder.QuotePrefix 、OleDbCommandBuilder.QuoteSuffix プロパティで変更できます。
CommandBuilder関係はMSDN CommandBuilder でのコマンドの生成 (ADO.NET)参照。

また、第10章 データベースの更新の実行ではADO.Netでのデータ更新について下記の3つのアプローチについて解説されてます。
非常に参考になります。(.Net2.0より前なのでちと古いですが)
・コードを使ってDataAdapterオブジェクトを手作業で設定する方法
・ 実行時にCommandBuilderを使用する方法
・ デザイン時にデータアダプタ構成ウィザードを使用する方法
[PR]
by jehoshaphat | 2009-01-28 02:03 | .Net開発 | Trackback | Comments(0)
(CakePHP)Sanitize::clean($this->data)はバリデート使ってるときはやめた方がいい!?
(CakePHP)$form->textareaはサニタイジングしてくれない!?の追記で $this->data 全体をSanitize::cleanしてましたが、どうやらこれはバリデート使っている時はまずいみたいです。

たとえば、バリデートでメールのチェックを定義し、Sanitize::clean($this->data) にします。
そして、「-」付のメールアドレスを入れます。
そうすると、先にサニタイジングが走るので、- が &#45; となります。
そして、$Model->Save 時にバリデートで 「&」 とか 「#」 とかがチェックに引っ掛かりそこで処理が止まってしまうわけです。

なので、結局各モデルの個別のフィールドごとにサニタイズするようにしました。
そして、メールアドレス等バリデートしてるところは、 Sanitize::html($string , true ) でhtmlタグを削除します。
( Sanitize::html() についてはhttp://book.cakephp.org/ja/view/462/html参照)

このやり方はあまりスマートでないので好きじゃないのですが、解決策が見つかるまで当面この方法でやることにしました。
//モデル
class Member extends AppModel {
//バリデーションの定義。
var $validate = array(
//氏名
'fname' => array(
'between' => array(
'rule' => array('between', 1, 50 , ) , //1-50文字
'allowEmpty' => false, //空の値を許さない
'message' => '氏名は1-25文字の範囲で入力してください。', //エラー時にhelperが出すメッセージ
),
),
//氏名カナ
'kana' => array(
'kanjiChk' => array(
'rule' => array('custom', '/^(?:\xE3\x82[\xA1-\xBF]|\xE3\x83[\x80-\xB6])+$/'),//'/^[ア-ヶ]+$/') , //半角文字以外(全角ONLY)
'allowEmpty' => false, //空の値を許さない
'message' => '氏名カナは全角カタカナで入力してください。', //エラー時にhelperが出すメッセージ
),
'between' => array(
'rule' => array('between', 1, 50 , ) , //1-50文字
'allowEmpty' => false, //空の値を許さない
'message' => '氏名カナは1-25文字の範囲で入力してください。', //エラー時にhelperが出すメッセージ
),
),
//メールアドレス
'mail' => array(
'rule' => 'email' , //メールの書式
'allowEmpty' => false, //空の値を許さない
'message' => '正しいメールアドレスを入力してください。', //エラー時にhelperが出すメッセージ
),
//電話番号
'mem_tel' => array(
'rule' => array('custom', '/\d{2,4}-\d{2,4}-\d{4}/') , //電話番号の書式
'allowEmpty' => true, //空の値を許す
'message' => '正しい電話番号を入力してください。', //エラー時にhelperが出すメッセージ
),
//FAX番号
'mem_fax' => array(
'rule' => array('custom', '/\d{2,4}-\d{2,4}-\d{4}/') , //FAX番号の書式
'allowEmpty' => true, //空の値を許す
'message' => '正しいFAX番号を入力してください。', //エラー時にhelperが出すメッセージ
),
);
}
 
//コントローラ
function index(){
...
if (empty($this->data))
{
//初回アクセス時
$this->render();
}
else
{
//2回目以降のアクセス(POSTデータがあったアクセス)
//モデルにPOSTデータセット
$this->Member->set( $this->data );
$this->Order->set( $this->data );
//サニタイズされないので、手動でサニタイジング
$this->_sanitize();
....
}
}
 
 
/**
* サニタイズする必要がある項目のみ、サニタイジング
*/

function _sanitize(){
App::import('Sanitize');
$this->data['Member']['name'] = Sanitize::clean($this->data['Member']['name']);
$this->data['Member']['kana'] = Sanitize::clean($this->data['Member']['kana']);
//mail,tel,faxは Sanitize::html を用いる
$this->data['Member']['mail'] = Sanitize::html($this->data['Member']['mail'], true);
$this->data['Member']['tel'] = Sanitize::html($this->data['Member']['tel'], true);
$this->data['Member']['fax'] = Sanitize::html($this->data['Member']['fax'], true);
$this->data['Member']['addr'] = Sanitize::clean($this->data['Member']['addr']);
$this->data['Order']['note'] = Sanitize::clean($this->data['Order']['note']);
}

[PR]
by jehoshaphat | 2009-01-27 19:22 | PHP開発 | Trackback | Comments(1)
(CakePHP)$form->textareaはサニタイジングしてくれない!?
CakePHP1.2

CakePHPは基本的に $form->input 等でデータを入力するときは htmlspecialchars() でサニタイズしてくれます。
が、なぜかテキストエリアをする $from->textarea() だけはサニタイズしてくれません。
なので、容易にクロスサイトスクリプティング(XSS)されてしまいます。

ということで、ここここを参考にしてみましたが、1.2のせいなのかどうかわかりませんが、うまくいきません。

仕方ないので、コントローラ内でモデルにセットした後にh()でエスケープすることにしました。
( h() は htmlspecialchars() の省略形らしいです)
//ビュー
<?php echo $form->textarea("Order.note", array("cols"=>"40" ,"rows"=>"5" , "label"=>"" ))?>
 
//コントローラ
//モデルにPOSTデータセット
$this->Order->set( $this->data );

//textareaはサニタイズされないので、手動でサニタイジング
$this->data['Order']['note'] = h($this->data['Order']['note']) ;

まあ、データはそのままで出力時にサニタイズするというアプローチもあると思いますが、今回は入力時にサニタイジングしてます。

追記: 2009/1/26
上で「 $form->input はサニタイズしてくれる」と書きましたが、試したところサニタイズしてくれませんでした。どうやら1.1とはさっぱし変わったようです。

結局 CakePHP の Sanitize::clean() を使うことにしました。
//コントローラ
 
//モデルにPOSTデータセット
$this->Order->set( $this->data );
//サニタイズされないので、手動でサニタイジング
App::import('Sanitize');
$this->data = Sanitize::clean($this->data, true);

$this->を丸ごとサニタイジングします。
なお、Sanitizeクラスについては下記参照。
http://book.cakephp.org/ja/view/153/%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%B5%E3%83%8B%E3%82%BF%E3%82%A4%E3%82%BA-Data-Sanitization

追記2 2009/1/27
上の方法でもまずい場合があります。
詳しくは(CakePHP)Sanitize::clean($this->data)はバリデート使ってるときはやめた方がいい!?を参照。
[PR]
by jehoshaphat | 2009-01-26 19:41 | PHP開発 | Trackback | Comments(2)
AccessからSQL Serverへの移行は簡単!?
現在開発中ソフトのデータをAccessから多人数でも利用できるようにSQL Serverに移行しようとする話が上がってます。
データもそのままでSQL Server に移行したいらしいということです。当初は面倒だと思ってましたが、なんとAccessにはSQL Serverに簡単に移行できる機能である アップサイジングウィザード というものが付いてました。

このウィザードを使うとワンタッチでSQL Serverに移行することができます。
e0091163_14393578.jpg


ちなみに、MSのTechNetにもSQL Server 2000への移行ですが、ガイドがあります。
[PR]
by jehoshaphat | 2009-01-26 19:38 | SQL | Trackback | Comments(0)
(ハードウェア)不良CD挿入から始まったストレージデバイスの異常
昨日自宅サーバで起こったトラブルです。
OSはWindows Server 2008 (Hyper-VでLinuxサーバ運用)。
ストレージの接続は下記のようになっています。

IDE--+---DVD-RW
+---HDD(Hyper-V用) \Device\Harddisk1\DR1
SATA-----HDD(Boot,OS用) \Device\Harddisk1\DR0
USB------HDD*2

ことの始まりは不良CD-RWを入れたことが原因でした。
しばらく光学メディアを読み込んでいたと思ったら、突然IDE接続のHDDとUSB外付けHDDがOSから認識されなくなったのです。(デバイスマネージャーからも焼失)

イベントログを見たらこんな順序の感じの警告とエラーが発生してました。

レベル :警告
イベントID:15
ソース :cdrom
ページング操作中にデバイス \Device\CdRom0 上でエラーが検出されました。
 ↓
レベル :エラー
イベントID:51
ソース :disk
デバイス \Device\Harddisk1\DR1 はまだアクセスできる状態ではありません。
 ↓
レベル :エラー
イベントID:11
ソース :atapi
ドライバは \Device\Ide\IdePort0 でコントローラ エラーを検出しました。
 ↓
レベル :警告
イベントID:15
ソース :disk
ページング操作中にデバイス \Device\Harddisk1\DR1 上でエラーが検出されました。
 ↓
レベル :エラー
イベントID:12
ソース :PlugPlayManager
デバイス 'Optiarc DVD+-RW ND-3570A ATA Device' (IDE\CdRomOptiarc_DVD+-RW_ND-3570A________________104B____\6&39eba4c8&0&0.0.0) は、最初に取り外しの準備が行われずにシステムから消滅しました。
 ↓
レベル :エラー
イベントID:12
ソース :PlugPlayManager
デバイス 'ST380021A ATA Device' (IDE\DiskST380021A_______________________________3.19____\6&39eba4c8&0&0.1.0) は、最初に取り外しの準備が行われずにシステムから消滅しました。

どうやら、CD-RWの読み込みエラーがスレーブのHDDとIDEコントローラに影響を与え、IDE自体のデバイスをソフトウェア的に削除したみたいです。
イベントログには載ってませんが、このときUSBの外付けHDDデバイスも切り離してました。

さて、ここでとりあえずシステムの再起動をしようと判断したわけですが、BIOSのPOST画面でフリーズしてしまいます。

そこで、USB外付けHDDを取り外すとちゃんと起動するようになりました。

いろいろ調べた結果BIOSを設定することで、USB外付けHDDをつけたままシステムを起動することができました。
BIOSで「Lagacy USB storage detect」を「Disable」にするとOKです。
これは USBメモリ、USB HDDなどのストレージ機器を起動時に検出させるか否かの設定 らしいです。
e0091163_2251479.jpg


以前はこのようなことはなかったのですが、どうやら不良CD挿入によるIDEコントローラ周りのエラーがハードウェア自体になにか影響を与えているのかもしれません。
ネットで探すと結構USB HDDつけたままのシステム起動が失敗する例もあるようです。


結局、不良CDを入れたくらいでなぜIDE系統やUSB系統が落ちるのかは不明でした。
おそらく安物光学ドライブの問題でおかしなIDEコマンドでも送ってマザボのコントローラ側に影響を与えたのではないかと思います。

ということで、サーバ機の光学ドライブを見直さないといけなくなりましたね。
まあ、予算がないんで、しばらくは怪しげなメディアをいれないような運用にしないといけないと思います。。

余談ですが、不良CDをNeroでチェックしたら、こんなにもエラーが出てました。
e0091163_228890.jpg

[PR]
by jehoshaphat | 2009-01-26 02:31 | ハードウェア | Trackback | Comments(0)
(VB.Net)DirectShowとWindowsMediaPlayerコントロールで動画を再生させる
1年弱ほどまえに作ったサンプルです。
.Netから直接DirectShowを利用するのと、WindowsMediaPlayerコントロールを利用して動画再生したときの状態を比較するために作りました。
WindowsMediaPlayerコントロールを使うと一時停止や音量などを操作するUIはついてくるのですが、明らかにWMPを使ってるのがバレバレです。また、WMPのバージョンにも左右されますしね。
一方のDirectShowを使う場合はかなりややこしいので扱うにはそれなりのスキルは必要ですね。UIも自分で作らないといけません。

なお、DirectShow、WMPはCOMコンポーネントですが、それ以外にも、.Net純正のMicrosoft.DirectX.AudioVideoPlaybackクラスがありましたが、あまりにバグが多いらしく.Net2.0以降は使用がほぼ無理な状態になりました。

なお、参考元にしたのは下記サイトです。
■WindowsMediaPlayerコントロール
C#でWindows Media Playerを使う
Media Playerエラーを取得するには?
■DirectShow
DirectShow関係 DirectShowに関するかなり詳細な情報があります。
MSDN:VBからDirectShow使うときに使うActiveMovie control type libraryのリファレンス

WindowsMediaPlayerコントロールを使うにはツールボックスに Windows Media Player のコントロールを追加してやる必要があります。
e0091163_047712.jpg

DirectShowを使うには参照設定で ActiveMovie control type library を追加してやる必要があります。
e0091163_0474287.jpg

下記のサンプルはDataフォルダ内にある動画ファイルをコンボボックスに表示し、開始ボタンを押下すると再生開始し、停止ボタンを押下すると再生停止します。
エラー処理等はちゃんとしてないので注意が必要です。特にCOMコンポーネントを利用してるため例外処理はシビアにならないといけないかもしれません。

デザイナはこんな感じです。
e0091163_0482620.jpg


コードをここに載せようとおもったのですが、文字数上の関係で何ページにもおよび面倒なので、ソース自体をZIPで固めてサーバにアップしました。
ここからダウンローできます。サンプル動画も入っているのでファイルサイズは30MB弱です。
一応ビルドしたのも入れてますが、ビルドフォルダのdataフォルダには動画が入ってません。プロジェクトのdataフォルダの動画をコピーするとOKです。
なお、ソースは Visual Studio 2008(VB)で作ってます。

なお、各種形式の動画を試すにはサンプルが必要ですが、下記サイトにある程度のコーデックサンプルがあります。
動画圧縮サンプル
[PR]
by jehoshaphat | 2009-01-22 01:15 | .Net開発 | Trackback | Comments(0)
(Firefox)ページランクを表示するアドオン「Live PageRank」
Googleのページランクを表示してくれるアドオンです。
下記のような感じでステータスバーに表示してくれます。
e0091163_2364594.jpg


見てるサイトの価値を知るにはいいですね。

ダウンロードは下記URLから。
https://addons.mozilla.org/ja/firefox/addon/2007?id=2007&application=firefox
[PR]
by jehoshaphat | 2009-01-21 23:07 | Webがらみ | Trackback | Comments(0)