hp ProLiant Server Series で BIOS の書き換え等に失敗しても
基本的にはリカバリ用にバックアップの BIOS が存在するために
一度の書き換え失敗でサーバが起動しなくなる危険は少なくなっています

しかし何らかの影響によってプライマリとバックアップ両方のBIOSが飛んだ場合には
当然のことながらサーバを起動することができくなってしまいます

このときには、サーバを起動するとビープ音が 長く1回 短く2回 鳴る状態になります
この状態になった場合でも、ProLiant には BIOS 復旧用のディザスタリカバリモードが用意されています

これは完全にBIOSが飛んだ状態でも、FDDがBIOSを読み込んで復旧してくれる最後の機能になります
ディザスタリカバリモードを使うには、まずはそのサーバ機のBIOS (ROMPaq) を hp のサイトからダウンロードし、
その ROMPaq に含まれている BIOS アップデート用のフロッピーディスク作成コマンドでアップデート用の FD を作成します

続いてサーバに USB-FDD などをつなぎアップデート用の FD を挿入します
その状態でサーバを起動すると FD を読みに行って BIOS の復旧が始ります

この復旧中、時折 FDD にアクセスがある以外はまったく反応がないためかなり不安になりますが
忍耐で30分ほど待っていると "ぴろりん" と徐々に音が高くなるビープ音が鳴って復旧の終了を教えてくれます

あとは FDD を外してサーバを再起動すれば無事に BIOS がリカバリされて hp のロゴが表示され起動するはずです

hp ProLiant Firmware Maintenance CD ユーザガイド
http://h50146.www5.hp.com/lib/products/servers/proliant/manuals/447788-195-j.pdf

Currently rated 1.5 by 2 people

  • Currently 1.5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Blog にアップロードしたイメージファイルを自動でサムネイル化してくれる Thumbnailer ですが
デフォルトではすべてのサムネイルが \AppData\files\Thumbnails\ フォルダに保存されてしまいます

これではサムネイルが同じフォルダにひたすらたまってしまって困るので
コードを少しいじって普通のイメージのように保存した年月ごとにフォルダ分けされるようにコードを書き換えます

書きかえる個所は static Thumbnailer() にある absoluteThumbnailPath のパス取得設定です。
ここは通常 "/files/" + ThumbnailPath になっているのですが、これを以下のように年月を付け加えるように変更します。 
また作例されたサムネイルを参照するタグの生成部分も、同様に年月を加えるように変更します。

    static Thumbnailer()
    {
        absoluteThumbnailPath = HttpContext.Current.Server.MapPath(BlogSettings.Instance.StorageLocation + "/files/" + DateTime.Now.ToString("yyyy/MM") + "/" + ThumbnailPath + "/");
    }

    private static HtmlImageTag CreateThumbnail(HtmlImageTag tag, Dictionary<string, string> thumbnailSettings)
    {
    //....
        thumbnailTag.Source = Utils.RelativeWebRoot + "image.axd?picture=/" + DateTime.Now.ToString("yyyy/MM") + "/" + ThumbnailPath + "/" + HttpUtility.UrlEncode(newFilename);
    //....
    }

これでめでたくサムネイルを保存するパスが変更されて
元のイメージが保存されているフォルダのサブフォルダとしてサムネイルを管理できます

Currently rated 3.3 by 6 people

  • Currently 3.333333/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Thumbnail Extension

2008-11-09

BlogEngine.NET 定番な感じの自動サムネイル作成エクステンションを入れてみました。

インストール方法は Extension のコードファイルを \AppCode\Extension\ にコピーするだけです。
あとはイメージをアップしたときにイメージの html を編集して、

<a href="ファイル名.jpg[thumb:height=200,link=original]" />

といったように href 属性内にサムネイルのサイズやリンク方法を指定すると
自動的にサムネイルを作成して \AppData\files\Thumbnail\ に保存、
そのサムネイルを本文に表示して、元のイメージへリンクしてくれます。

http://blog.data-worx.de/page/Extension-Thumbnailer.aspx

Currently rated 3.0 by 189 people

  • Currently 3.015872/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Open Day 2008 Tokyo

2008-11-08

Microsoft MVP Program による Open Day 2008 Tokyo が開催されました

内容については非公開のものが多いのであまり多くは語れませんが
話題のアレやコレもあるようなないようなということで
来年以降も楽しみなテクノロジがいろいろあるいいなっという感じでございます

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

六本木アカデミーヒルズで開催された Microsoft Developer Fourm 2008 に参加してきました

昨年に引き続き Steve Ballmer が登場して Azure Services Platform を紹介したほかにも
Visual Studio 2010 についての紹介、また Oslo と呼ばれる新時代のモデル駆動アプリケーションプラットフォームが紹介されました。

Azure や VS 2010 もさることながら、Oslo を構成する M言語、モデリングのためのQuadrant、そしてそれらモデルを格納する Repository と、
Oslo のコンセプトやアーキテクチャがデモも交えて日本初!? 紹介されました。

すでに CTP リリースのSDKがあるので、下記のURLからすぐに試せます。

Public "Oslo" SDK CTP
http://msdn.microsoft.com/oslo

 


Currently rated 3.0 by 5 people

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

System Center Virtual Machine Manager 2008 と System Center Configuration Manager 2007 R2 の日本語版が一般リリースされたとのこと

これで Windows Server 2008 ベースの環境で
System Center から Hyper-V の仮想環境をいろいろいじれるように

無駄に配信しまくったりしたい今日この頃(ぉぃ

http://www.microsoft.com/japan/presspass/detail.aspx?newsid=3575

Currently rated 2.5 by 4 people

  • Currently 2.5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

IPMI RMCP

2008-10-30

IPMI (Intelligent Platform Management Interface) を使って
サーバの物理ハードウェア管理をリモートから行うツールでも作ろうかと
RMCP+ (Remote Management Control Protocol+) を調べてみました

さすがに簡単なプロトコルではなく SNMP のようにはいかないらしい...
セッションレスもサポートされるようになってきているらしいですが
ちゃんと認証などがあるので UDP でもかなり重いプロトコルの模様

セッションシーケンスの管理とかまで実装するのは...うーむ

http://www.intel.com/design/servers/ipmi/

Currently rated 3.0 by 5 people

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Windows Azure

2008-10-28

Windows Azure が PDC 2008 で発表されました
ついに本気のクラウド コンピューティングな時代が見えてきました

いろいろ調べるものもたくさんありますが
たのしみたのしみ...

http://www.microsoft.com/azure/

Currently rated 3.0 by 188 people

  • Currently 3.031915/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

日本で 2 人しか認定されていない MCA (マイクロソフト認定アーキテクト) の福井さんの取得記念懇親会がMicrosoft OSTセミナー会場で開催されました。

世界で 100 名くらいしかいないそうで、Solution と Infrastructure のカテゴリがあるそうなのですが、
福井さんは Solution Architect として見事に合格された話を聞いてきました。

試験のために CV, Competencies, Case Study - Scenario & Solution, Presentation Slide を数ヶ月にわたって準備して望んだとのこと。
Case Study は Project 概要, Business 目標, Project 目標, テクノロジ上の選択基準などを経験から説明したり、Competency の証明して Project での Leadership, Strategy, Communication, Tactical/Process, Technology Depth, Technology Width, Organization Dynamics といったことを問われたりと、かなり厳しい Board Review があるそうです。

得意なテクノロジとして、Application Architecture と COM をあげたら、相当細かいつっこみを受けて大変だったそうです(笑

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

IIJ が Internet Infrastructure Review というフリーの冊子/PDFを定期的に刊行するそうです

すでに Vol.001 が公開されています。
ここでは DDoS や spam に関する話題のほか、
MD5 に代わる新しいハッシュ関数 MD6 についての情報も掲載されていました。

なかなか濃い内容が詰まっている媒体で、今後が期待されます。
こちらは PDF でダウンロードできるほか、冊子での送付もしていただけるようです。

IIJ Internet Infrastructure Review
http://www.iij.ad.jp/development/iir/

Currently rated 4.3 by 82 people

  • Currently 4.317073/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

MPI.net

2008-10-06

日本でも Windows HPC Server 2008 が発表されましたが
このクラスタノードで実行するアプリを書くためのライブラリとして
MPI.net (High-Performance C# Library for Message Passing) というライブラリが公開されていました

通常は C++ での開発となることが多いと思いますが
このライブラリを使うことで C# で Message Passing Interface を使って
Network Direct などのノード間通信を使いながらクラスタ計算が可能になる模様

詳しく試していませんがなかなかおもしろそうな予感です

MPI.net
http://www.osl.iu.edu/research/mpi.net/

Currently rated 3.0 by 5 people

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Admintech.jp のセミナー中に作ったコードをコマンドとして使えるように拡張しました

イベントログの内容を正規表現を使うことで
取り出したい内容をもったログだけを標準出力に吐きだせるようにしました

使い方としては、コマンド引数として /s:{イベントログのソース} "正規表現" を渡すと
指定したソース (Application や System) から正規表現にログの内容がマッチしたものを
まとめてCSVで出力するようになっています

また /n オプションを使うと、正規表現にマッチしなかったログだけを出力できます

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Diagnostics;

namespace EnvironmentManagement
{
    class Program
    {
        static int Main(string[] args)
        {
            Regex cmdHelp =
               new Regex("^/h", 
                 RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);
            Regex cmdPositive = 
               new Regex("^/p", 
                 RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);
            Regex cmdNegative = 
               new Regex("^/n", 
                 RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);
            Regex cmdQuit = 
               new Regex("^/q", 
                 RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);
            Regex cmdSource = 
               new Regex("^/s:\"?(?<source>.*)\"?", 
                 RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);

            bool quitMode = false;
            bool positiveMatch = true;
            string expression = String.Empty;
            string source = String.Empty;

            foreach (string param in args)
            {
                if (cmdHelp.IsMatch(param))
                {
                    ShowHelp();

                    return 0;
                }

                if (cmdPositive.IsMatch(param))
                {
                    positiveMatch = true;
                }
                else if (cmdNegative.IsMatch(param))
                {
                    positiveMatch = false;
                }
                else if (cmdQuit.IsMatch(param))
                {
                    quitMode = true;
                }
                else if (cmdSource.IsMatch(param))
                {
                    Match match = cmdSource.Match(param);

                    source = match.Groups["source"].Value;
                }
                else
                {
                    expression = param;
                }
            }

            if (!quitMode)
            {
                Console.WriteLine("EventLog Exporter with Regular Expressions");
                Console.WriteLine();
            }

            if (expression == string.Empty)
            {
                if (!quitMode) Console.Error.WriteLine("Please input regular expressions.");

                return 1;
            }
            else if (source == string.Empty)
            {
                if (!quitMode) Console.Error.WriteLine("Please input eventlog source name.");

                return 1;
            }

            try
            {
                ReadEventLogs(source, expression, positiveMatch);
            }
            catch (Exception e)
            {
                if (!quitMode)
                {
                    Console.Error.Write(e.Source);
                    Console.Error.Write(", ");
                    Console.Error.WriteLine(e.Message);
                }

                return 1;
            }

            return 0;
        }

        private static void ReadEventLogs(string source, string expression, bool positiveMatch)
        {
            EventLog logs = new EventLog(source);
            Regex regex = new Regex(expression, 
                 RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);

            OutputHeader();

            foreach (EventLogEntry entry in logs.Entries)
            {
                if (positiveMatch && regex.IsMatch(entry.Message))
                {
                    OutputLog(entry, source);
                }
                else if (!positiveMatch && !regex.IsMatch(entry.Message))
                {
                    OutputLog(entry, source);
                }
            }
        }

        private static void OutputHeader()
        {
            Console.Write("\"");
            Console.Write("Source");
            Console.Write("\",");

            Console.Write("\"");
            Console.Write("InstanceId");
            Console.Write("\",");

            Console.Write("\"");
            Console.Write("EntryType");
            Console.Write("\",");

            Console.Write("\"");
            Console.Write("Category");
            Console.Write("\",");

            Console.Write("\"");
            Console.Write("ApplicationSource");
            Console.Write("\",");

            Console.Write("\"");
            Console.Write("TimeGenerated");
            Console.Write("\",");

            Console.Write("\"");
            Console.Write("TimeWritten");
            Console.Write("\",");

            Console.Write("\"");
            Console.Write("MachineName");
            Console.Write("\",");

            Console.Write("\"");
            Console.Write("Username");
            Console.Write("\",");

            Console.Write("\"");
            Console.Write("Message");
            Console.Write("\"");

            Console.WriteLine();
        }

        private static void OutputLog(EventLogEntry entry, string source)
        {
            Console.Write("\"");
            Console.Write(source);
            Console.Write("\",");

            Console.Write("\"");
            Console.Write(entry.InstanceId.ToString());
            Console.Write("\",");

            Console.Write("\"");
            Console.Write(entry.EntryType.ToString());
            Console.Write("\",");

            Console.Write("\"");
            Console.Write(entry.Category);
            Console.Write("\",");

            Console.Write("\"");
            Console.Write(entry.Source);
            Console.Write("\",");

            Console.Write("\"");
            Console.Write(entry.TimeGenerated.ToString("s"));
            Console.Write("\",");

            Console.Write("\"");
            Console.Write(entry.TimeWritten.ToString("s"));
            Console.Write("\",");

            Console.Write("\"");
            Console.Write(entry.MachineName);
            Console.Write("\",");

            Console.Write("\"");
            Console.Write(entry.UserName);
            Console.Write("\",");

            Console.Write("\"");
            Console.Write(entry.Message.Replace("\"", "'"));
            Console.Write("\"");

            Console.WriteLine();
        }

        private static void ShowHelp()
        {
            Console.WriteLine("EventLog with regular expressions:");

            Console.WriteLine();

            Console.WriteLine(String.Format("{0} {1}", 
               System.IO.Path.GetFileNameWithoutExtension(Environment.GetCommandLineArgs()[0]), 
               "/h /p /n /q /s:{EventLogSource} \"{RegularExpression}\""));

            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine();

            Console.WriteLine("\t/h\tShow help.");
            Console.WriteLine("\t/p\tIf regular expressoin is match, to EventLog export.");
            Console.WriteLine("\t/p\tIf regular expression is not match, to EventLog export.");
            Console.WriteLine("\t/q\tQuit mode.");
            Console.WriteLine("\t/s:{EventLogSource}\n\t\tExporting EventLog source name.");
            Console.WriteLine("\t\"{RegularExpression}\"\n\t\tSearch keyword");

            Console.WriteLine();
        }
    }
}

Currently rated 3.0 by 5 people

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

.NET Framework v3.5 では System.Management 名前空間を使って
WMI プロバイダ経由でいろいろなデータの取得や設定、また操作ができます。

その中で Win32_Process クラスを使って
プロセスの起動と終了を行うサンプルを作成してみました

using System;
using System.Collections.Generic;
using System.Management;
using System.Diagnostics;

namespace EnvironmentManagement
{
    class Program
    {
        static void Main(string[] args)
        {
            // calc.exe を実行する
            int processId = InvokeProcess("calc.exe");

            Console.ReadLine();

            // 指定したプロセスIDを終了する
            TerminateProcess(processId);

            Console.ReadLine();
        }

        // 引数に指定された実行ファイルを起動する
        private static int InvokeProcess(string executeFile)
        {
            // Win32 Process を扱うWMIプロバイダ クラスを取得する
            ManagementClass processClass = new ManagementClass("Win32_Process");
           
            // Create メソッドのパラメータを準備する
            ManagementBaseObject inParams = processClass.GetMethodParameters("Create");

            // Create メソッドのパラメータとして
            inParams["CommandLine"] = executeFile;

            // Create メソッドをパラメータ付きで呼び出す
            ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null);

            // メソッドの実行結果を表示する
            Console.WriteLine("メソッド実行結果: " + outParams["returnValue"]);
            Console.WriteLine("プロセスID: " + outParams["processId"]);
           
            return Int32.Parse(outParams["processId"].ToString());
        }

        // 指定したプロセスを終了させる
        private static void TerminateProcess(int processId)
        {
            ManagementScope scope = new ManagementScope(@"\\.\ROOT\CIMV2");
            scope.Connect();

            // 指定したプロセスIDを持つプロセスをクエリする
            ObjectQuery query =
                new ObjectQuery(String.Format(@"SELECT * FROM Win32_Process WHERE ProcessID = {0}", processId));

            ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
            ManagementObjectCollection col = searcher.Get();

            // クエリの結果を取得する
            foreach (ManagementObject obj in col)
            {
                // プロセスを終了させる Terminate メソッドの引数を設定する
                ManagementBaseObject inParams = obj.GetMethodParameters("Terminate");
                inParams["Reason"] = 0;

                // クエリで取得したプロセス インスタンス オブジェクトの Terminate メソッドを呼び出し、プロセスを終了する
                obj.InvokeMethod("Terminate", inParams, null);
            }
        }
    }
}

Currently rated 2.5 by 4 people

  • Currently 2.5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

本日は Admintech.jp にてミニ勉強会を開催しました。

今回はメイン講師に C# MVP の AILight さんをお迎えして
デベロッパの視点とシステム管理の融合を目指した Hans-on を交えながらの勉強会となりました

私は Hans-on のお手伝いをするくらいの予定だったのですが
なぜか最終的には Live Coding までやっていました...

Link to Admintech.jp - Seminor

Currently rated 3.0 by 5 people

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Do Less. Get More. Develop on SharePoint ということで
MOSS に関連するリソースがまとまっているサイトが公開されていました

さりげなく Silverlight が使われていたりとなかなかセンスのいい感じにまとまってます

http://www.microsoft.com/click/SharePointDeveloper/default.aspx

Currently rated 3.0 by 191 people

  • Currently 3.001048/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5