月別アーカイブ: 2014年9月

特定のクラスのみ操作したい

今回はC#とASP.NETの話です。

Webページで登録画面を作成していて、
必須入力項目への入力確認に、
RequiredFieldValidatorクラスを使用しました。

バリデーションを行うコントロール名とエラーメッセージをセットすれば、
指定したコントロールに対して、入力がなされたかクライアント側で確認することができます。

ただし、今回作成している画面が少し厄介で、
ドロップダウンリストの選択した値によって、
必須入力が変更される、という仕様を盛り込んでいました。

そこで、SelectedIndexChangedイベントを使用し、
選択した値が変更した時に、RequiredFieldValidatorの設定を切り替えるようにしました。

初めは、選択した値ごとに、RequiredFieldValidatorのEnabledプロパティに
TrueやFalseをセットしていたのですが、
これだと、Falseのセット漏れが出たりするなぁ、と思い、
一度、ページ内の全てのRequiredFieldValidatorにFalseをセットした後、
必要なコントロールのみ、Trueを設定しようと考えました。

では、どの様にして、全てのRequiredFieldValidatorコントロールに
Falseをセットするのか、考えました。
ASP.NETの各コントロールが継承するクラスにControlクラスが有ります。
このControlクラスには、FindControlというメソッドが有りますが、
これはコントロールのIDでしか探せません。
それに加え、コントロールは階層配置されており、
FindControlメソッドでは、呼出元のコントロールが有する子コントロールが
対象となります。

そこで、下記の記事を参考にし、再帰的に呼び出されるメソッドを作成しました。
下記記事では、IDを使用していますが、今回はクラス名で検索する様にします。

方法: ID を使用してサーバー コントロールにアクセスする

http://msdn.microsoft.com/ja-jp/library/y81z8326(v=vs.100).aspx

上記記事内に記載されているメソッドからの変更点は、
1.引数のIDをクラス名に変更する。
2.コントロールとIDの照合を
コントロールのクラス名と1で変更した引数と照合する。


    public static Control FindControlRecursive(Control rootControl,
                                               string findControlClassName)
    {
        if (rootControl.GetType().Name == findControlClassName)
        {
            return rootControl;
        }

        foreach (System.Web.UI.Control searchControl in rootControl.Controls)
        {
            Control controlToReturn =
                FindControlRecursive(searchControl, findControlClassName);
            if (controlToReturn != null)
            {
                return controlToReturn;
            }
        }
        return null;
    }

このメソッドを実行することで、rootControl以下のコントロールから
検索対象とするクラス名を有するコントロールを取得できます。
後は、取得したコントロールのparentプロパティで、
直近の親コントロールを取得し、
親コントロールが持つ子コントロールをforeachで回し、
GetType().Name で同一のクラス名を持つコントロールのEnabledプロパティに
FALSEをセットすれば、Webページ内のRequiredFieldValidatorオブジェクトを
無効化できます。

ちなみに、呼出元は以下の様なコードを書きました。


    // ページ内のコントロールを対象とする。
    foreach (Control pageChild in Page.Controls)
    {
        // RequiredFieldValidatorクラスのコントロールを検索する。
        var findControl = FindControlRecursive(pageChild,
                                  "RequiredFieldValidator");

        if (findControl != null)
        {
            // 検索結果のコントロールの親コントロールを取得する。
            var parentControl = findControl.Parent;

            // 親コントロールの全てのvalidatorを無効にする。
            foreach (Control childControl in parentControl.Controls)
            {
                If (childControl.GetType().Name == "RequiredFieldValidator")
                {
                    RequiredFieldValidator requiredFieldControl =
                        (RequiredFieldValidator)childControl;
                    requiredFieldControl.Enabled = false;
                }
            }
        }
    }

サーバサイドで同一のクラスを持つコントロールに
一律の操作をする際に、使えると思います。

VMWare ESXiのセットアップで苦戦した話(2)

前回の続きです。

開発用のサーバにVMWare ESXiをインストールさせようとしている社員O氏。
RAIDの設定に四苦八苦しながらも、なんとかRAIDの設定は行えましたが、
まだまだ続きます。
というより、むしろここからがインストール作業です。

空の環境にインストールする際、特に難しいことはありません。(ないはずでした……)
1.ブート時にCDからインストールするか確認
2.規約事項の確認
3.インストールするハードディスクの確認
この順に確認が出ますので、
それぞれ入力を行います。

が、今回は楽にはいきませんでした。
今回の問題は3のハードディスクでした。

どのハードディスクにインストールするか確認する画面が表示されるのですが、
RAID構成したはずのディスクなのに、物理ハードディスクが二つ見える……

RAID構成が崩れた? と思い、サーバを再起動させて確認する。
RAID構成は崩れていない。
とりあえず、そのままインストールを続行してみました。
その後の起動で確認すると、RAID構成は崩れたままです。

どういうことだ? と考える。
まさか、オンボードRAID(=ソフトウェアRAID)だとよろしくないのか、と思い、
ESXi5.5のインストールマニュアルを探す。
やはりというか、下調べが足りてないというか、
ESXi5.5ではソフトウェアRAIDはサポートしていない、という一文が。
そうですか、マザーボードに載っているタイプのRAIDもアウトですか……

しかし、原因さえわかってしまえば、回避できます。
ということで、BIOSを立ち上げ、HDDモードをAHCIへ。
その後、正常にインストールは完了しました。

正直、ここまで苦戦することになるとは考えてもいませんでした。
ESXiも(バージョンが異なるとはいえ)インストールしたことはありましたから。

それでは、今回の教訓です。
インストールする環境はきちんとマニュアルに目を通しましょう。

前回といい、今回といい、事前に情報さえ持っておけば、
回避できる状況に対し、前にやったことあるし、大丈夫大丈夫と
安易に考えたために、結果として、大火傷してしまいました。

事前準備ってホント重要ですね……

VMWare ESXiのセットアップで苦戦した話

今回は、VMWare ESXiをインストールしたときに、
苦戦した話をしたいと思います。

インストールしたESXiのバージョンは5.5。
開発用のサーバにインストールし、その上で、
仮想サーバを立てる予定です。

過去にESXi5.1をインストールしたことがあったため、
そう苦戦することはないだろうと考えながら、
ESXi5.5のインストール用ISOファイルをダウンロードしました。
ISOファイルをCDに焼き、インストールメディアを準備します。

さて、インストールするために、サーバの電源を入れ、
BIOSを流し見た後、RAID(※1)を構成するため、
POST画面を眺めます。

※1:複数のハードディスクを1つのディスクとして扱う技術。
信頼性、可用性を向上させる。
ハードウェア(RAIDコントローラ)によって、管理されるものと
ソフトウェア(OSなど)によって、管理されるものがある。

……POST画面にRAID構成情報が表示されません。
この時点で、おかしいな、と思いはしましたが、
電源を入れ直し、BIOSを確認します。

RAIDの情報がない?
RAIDコントローラの情報はBIOSに表示されなかったか?
などと考えながら、探します。

結局、見つけることが出来なかったため、
サーバのセットアップに使用するDVDを挿入し、
GUI画面を眺めます。

こちらにも表示が無い?
この時点で、すでに混乱しています。

セットアップ用DVDを入れたり抜いたり、
ESXiのインストールCDを入れたり抜いたり、
サーバのPOST画面を眺め続けたり。

どこにもRAIDのセットアップ画面は有りません。

BIOSも見たんだけどなぁ、と考えながら、
BIOSを立ち上げ、HDD情報の画面を表示します。

HDDモード:AHCI と表記されている箇所に目が留まります。
このサーバのHDDはSATAでしたので、
AHCIかIDEかの選択だろうと高を括っていましたが、
念のため確認するか、と項目を選択すると、
そこには、IDE・AHCI・RAIDと書かれた項目が。

思わず、「こんな所にあるのか……」と声に出しました。
これでRAIDが設定できる、と安心し、RAIDモードを選択します。

設定を変更し、BIOSを保存、再起動します。
POST画面にようやくRAIDの設定画面へのコマンドが表示されました。

コマンドを叩き、設定画面へ移ります。
ここからは問題ないだろう、と考え、設定を行います。

設定も無事完了し、サーバを再起動させ、
ESXiのインストールに移ります。

実は、この後、さらに想定外の事態に襲われたのですが、
それについては、次回に持ち越させていただこうかと思います。

今回の教訓は、慣れているメーカーでもモデルが変われば、
BIOSも変わることが有るので、事前に下調べを行う事、でした。

[Oracle初心者運用メモ]ADO.NETでOledb接続ができない

ASP.NET(VS2010)開発のWebシステムを構築している
客先の本番Webサーバにて、突然、下記のエラーが発生し、
Webシステムから別DBサーバのDB(Oracle11g)へ接続できなくなってしまいました。

——————————-
データベースからのデータ取得に失敗しました。
‘OraOLEDB.Oracle’ プロバイダーはローカルのコンピューターに登録されていません。
——————————-

WebシステムからはADO.NETのOledb接続でDBへ接続しています。

Webサーバの環境は以下の通り(Webサーバ管理は別会社)
OS:Windows Server 2008 R2
DB:Oracle11g クライアント32bit

実は、Webシステムを構築した当初は
DBはOracle11gサーバ64bitがインストールされており
その時点では正常に接続できていました。
その後、別会社で使用しているシステムが32bit版のOracleクライアントが
必要になり、 追加でOracle11g クライアント32bitをインストールされたようで
インストール後、エラーが発生するようになりました。

・Oracleホームディレクトリのユーザ権限を確認
(Everyone権限を設定したりなどいろいろ試す)
・Oracleホーム/binフォルダへのPath設定を確認
などいろいろ試してみましたが結果は変わらず。。

Webサーバを管理している会社に、Oracle11g クライアント32bitをアンインストールし
構築当初のOracle11gサーバ64bitに戻してもらいましたが、
それでも結果は変わらず。。

最終的にWebサーバをOSからインストールしなおしていただき
(DBはOracle11gサーバ64bit)
正常に接続できるようになりました。

今回の現象は、Oracleの再イントールが要因でしたが
そのことにより何故このような現象が発生したのか
OS再インストールではなく、何か解決方法はなかったのか
突き止めることができなかったことが残念です。

Xamarin って初めて聞いた

Xamarin(ザマリン)とは企業名であり、

またその製品群をさす言葉でもあります。

 

Xamarin社は2013年11月に「Xamarin for Visual Studio」をリリースしました。

これを使うと、なんと Visual Studio 2013 (主にC#, VB.NET)で、

iOS/Android のネイティブアプリが作れちゃうそうです!!

 

ライセンスは有償ですが、30日間の試用期間もあります。

 

Visual Studio を使い慣れている方で、

iOS/Android アプリを作ってみたい方には、

おすすめかもしれません。