VisualStudioの最近のブログ記事

Visual Studio 2010 ラウンチツアー 雑感

| コメント(0) | トラックバック(0)

Visual Studio 2010 ラウンチツアー名古屋に行ってきた。 いか、個人的に気になった点などをメモ。

Visual Studio 2010

エディション

2010 では、Standard エディションなし。限定(1万セットだったかな)で、39,800 円(だったかな?)で、Professional エディションへのアップグレードパッケージを用意

前回MSのカンファレンスで、Visual Studio 2008 がもらえたんだよな~。Standard Edition がないということは、もう個人では買えない。まぁExpress Edition つかえってことだよな。と、

Express エディションが、4/28 にリリース!

2010 からは、XAMLをがりがり書かなくても、WPF が WYSIWYG で作成できるようになるようだ。たしかに、Windows Phone の CTP では、そうなっていた。だとしたら、C#買いだな(買わないけど)。ただ、高度なアニメーションとかは依然 ExpressionBlend を購入する必要があるとのこと。

並列プログラミングの強化

マルチコアプログラミングで、処理を論理的なタスクという単位に分割しプログラミングすることで、フレームワークが透過的にスレッド管理を行ってくれるようになる。

UML

UMLがいろいろ書けるようになった。

アーキテクチャー検証

これは面白いなとおもった。アーキテクチャーを定義しておくと、それに違反しているコードに対してアラートをあげることができる。

インテリトレース(InteliTrace)

なんと、デバック情報を記録していて、ステップをさかのぼって参照できる。デバッグ途中の変数の値をピンでソースコード上に留めておいたりもできる。便利そう。

ソースコード管理

SQL Server ベース、チェックインポリシーとか定義できて、ポリシーを満たさないとチェックインさせないとかできる。サーバー側でソースをビルドして検証したりできる。

TestManager 2010

システムテストのシナリオつくっってそれにそってテストしながら、操作をキャプチャしてバグが発生したら、バグ管理ができたりする。

Windows 7 開発

チャートコントロールの標準化

.Net フレームワーク 3.5 では別途ダウンロードする必要があった、チャートコントロールが、.Net フレームワーク 4 からは、標準になった。

WPFをつかった開発

2010から、Windows Forms と同様に 開発できる(XAMLを直接編集しなくてよい)ようになる。こった機能は ExpressionBlend。

リストボックスに、画像を表示するのなど、オブジェクトを自由に設定できる。

DLR(Dynamic Language Runtime)

レイトバインディングが、可能になる。実行時に、IronPython や IronRuby のコードを解釈して実行することが可能になるデモを見せてくれた。

Windows 7 の機能

など。

サーバーサイド

OData (Open Data Protocol)

Atom フィードの拡張で、問い合わせや、更新など、CRUDに対応している。既に Shere Point など対応済み。XML フィードなので、クライアント選ばす。

Visual Studio からは、 Visualizer を利用して、ER図 みたいなのを作成できる。

WCF Data Service で、作成する。

ADO .NET Entity フレームワーク

Windows Azure

最後にクラウド関係をちょっと。

まず、アズールではなく、アジュールと読むみたいですね。

Windows Azure for Visual Studio 2008/2010

 

全体として Visual Studio 2010 魅力的だし、使ってみたいなと思わされた。

Windows Phone チュートリアル(XNA)・・・のはずが。

| コメント(0) | トラックバック(0)

Windows Phone の Silverlight のサンプルアプリを作成することができたので、続いて、XNA アプリのサンプルを作ってみよう!ということで、がんばりました。

・・・ チュートリアル通りに作業を行い、いざデバッグ

winphone_xna_err01

Deploy failed with the following error: The current display adapter does not meet the emulator requirements to run XNA Framework applications.

うーん。上記のエラーがでる。どうも、エミュレータが対応していないように読めるのだが、何でだよ~ エミュレーター同梱されてたのに、XNAにだけ対応していなってどんなだ。と一瞬思ったが、どうやら

リリースノートによると

グラフィックカードが、DirectX10 以降に対応している必要があるらしい。

まぁ要件きつい。

もう一度あげると、

  • OS: Windows 7(除く Starter Edition)、Windows Vista(SP2)
  • 空き容量: 3GB
  • メモリ: 2GB
  • DirectX 10 対応グラフィックカード WDDM 1.1 ドライバ
  • うーん。うちの最新マシン(といっても2年前くらい)でやっているので、これでだめならアウトなんだよな~

    と思い、念のため、DirectX の対応を調べる。

    DirectX Caps Virwer Tool っつーのが必要らしいが、それが、DirectX の SDK に入っているとのこと。

    500M もあるし、いったんインストールするのめんどくさかったが、やってみた。

    SDK をインストールすると、(SDK root)\Utilities\Bin\x86 に、DXCapsViewer.exe があるので、起動。

    DXG 1.1 Devices \ グラフィックカード \ Direct3D 10.x と展開すると、D3D10_FEATURE_LEVEL_n_n ってなエントリがあるが、これがグラフィックカードが対応しているバージョンなんだろうな。

    D3D10_FEATURE_LEVEL_10_0 もしくは D3D10_FEATURE_LEVEL_10_1 の必要あり・・・

    winphone_xna_err02

    だめだ、9.2 ・・・

    萎えた。

    Google 先生とも和解したことだし、なんてったって、Xperia より高機能ではないかと言われている Desireが、この値段。

    HTC Desire(X06HT)、激安価格! 実質負担額10,000円切り。ドスパラでは9,120円!

    こんな話もあるしなぁ ~

    個人開発のAndroidアプリで月収116万円に

    Andoroid にしよかな。なれた Eclipse と Java だし。

    Windows Phone チュートリアル(Silverlight)

    | コメント(0) | トラックバック(0)
    スペルミスのあらしなのですが、あわててつくったので見ぬふりをしてください。

    Windows Phone には、Silverlight と、XNA という2つのUIフレームワークがあるらしい。

    Silverlight は、XAMLでマークアップして作成するイベントドリブンモデル、XNA はエンターテイメントやゲーム向けの没入型 体験が可能となるUIらしい(?) まずはSilverlight のGet Start を行う。

    メニューから、Visual Studio 2010 Express for Windows Phone を起動

    winphone_silverlight00

    File - New Project を選択し、Visual C#のテンプレートから、Silverlight for Windows Phone を選択し、プロジェクト名やら設定

    C# しかサポートされないのかな?

     

    winphone_silverlight01

    サンプルにしたがい、画面を配置

    • テキストボックスを配置(URL)  Height、Width にAutoを設定、HorizontalAlignment に Stretch、VerticalAlignment に Topを指定。
    • URLへジャンプするボタンを配置 Content プロパティを "GO"に、HorizontalAlignment に Right、VerticalAlignment に Topを指定。
    • WebBrowser コントロールを配置し、Height、Width にAutoを設定、HorizontalAlignment 、VerticalAlignment に Stretch を指定。

    などまぁ適当に。

    winphone_silverlight02

    コードを実装し、デバッグ実行

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        string site;
        site = textBox1.Text;
        webBrowser1.Navigate(new Uri(site, UriKind.Absolute));
    }
    

    実行された。文字化けというか、日本語に対応していないのかな?WebBrowserコントロールのフォントファミリに日本語フォントが現れない。まぁとりあえずいいや。

    winphone_silverlight03

    エミュレータの右上のコントロールバーみたいなので、左に90度傾けると、画面も傾くぞと。

    winphone_silverlight04

    いやー若干もったりしているのは、CTPだからか?

    ただ、Visual Studio 2010 Express 自体かなり使いやすそうな感じを受けた。Silverlight については、Wihdows Phone 向けに新たに何か覚え直す必要が多くなさそうなので、敷居はかなり低いのではないかなと。まぁこれだけぢゃわからんけど。

    結構期待。

    実機が欲しくなるな~。今のWindows Mobile を購入したのが、2008年1月 なので、SoftBank の2年縛りも終わってるし。

    ただ、出た当初は高いだろうなぁ。

    Windows Phone 開発環境(CTP) のインストール

    | コメント(0) | トラックバック(0)

    Microsoft、「Windows Phone 7 Series」開発キットの無償提供を発表

    きた!Windows Mobile は、Visual Studio 2008 の スタンダードエディションには、開発環境が含まれていないし、Express エディションもでなかったから、どうなるのかなぁと思っていたら、開発環境が無償提供されるようだ。

    喜ばしい。

    どうも、Windows Phone 7 は iPhone チックになり、現在のWindows Mobile 6.5 からは系統が分かれるようだ。個人的にはあまり、XBox や Zune と連携されてもうれしくないので、現在の系統でいって欲しかったが致し方ない。時代の趨勢か。

    iPhone の開発をしようとすると、まずMacがいる。よくわからないが、開発環境にも料金が必要だったような。

    まぁその時点で月々小遣い制でやっている身としてはムリ。Macは融通も利かないようだし、食指が動かない。

    そういう意味ではPCは自由だ。そもそも、Microsoft も嫌いじゃないし、個人的にはたとえ Hello World だけでも、そこへリーチできるのと、できないのとでは雲泥の差。

    ということで、早速、環境を構築しよう。ただ メインのマシンにはあまり CTP とか入れたくないんだよなぁー。ということで、VirtualBox に Windows XP の環境を焦って構築してから、ダウンロードしようとしたら、

    システム要件が、

    • OS: Windows 7(除く Starter Edition)、Windows Vista(SP2)
    • 空き容量: 3GB
    • メモリ: 2GB
    • DirectX 10 対応グラフィックカード WDDM 1.1 ドライバ

    おいおい、以外と求めるのね。いきなり Windows XP じゃだめじゃん。

    結構な台数PCがうちにはあるけど、そんな条件を満たすのは、メインマシン1台だけだよ。

    しょうがないので、メインマシンにインストールしてみる。

    ここのページの、最下段 から、 VM_BOOT\vm_web.exe をダウンロードして実行。このファイル自体はブートストラップなようで、環境に合わせて適切なファイルをダウンロードしてインストールしてくれる。

    winphone01

    インストール完了。

    以下の内容が含まれるということ

    とりあえず起動。

    winphone02

    Getting Start くらいは触りたいが、時間が時間なのでもう寝なければ。

    Windows Mobile アプリのインストーラ作成

    | コメント(0) | トラックバック(0)

    熱が冷めないうちに、インストーラまで作成する。

    作成したアプリケーションプロジェクトのコンテキストメニューから、「ファイル - 追加 - 新しいプロジェクト」を行い、「スマートデバイスCABプロジェクト」を選択。

    wm_inst01 

    プロパティ、ProductName(アプリケーション名)、Manufacturer(作成元)に適当に値を設定。

    wm_inst03

    アプリケーションフォルダのコンテキストメニューから、「追加-プロジェクト出力」し、開いたダイアログにてプロジェクトが正しく選択されているか確認し、OK。

    wm_inst04

    作成された、プロジェクト出力のコンテキストメニューから、ショートカットを作成し、作成されたショートカットの名称を変更

    wm_inst06

    対象コンピュータ上のファイルシステムのコンテキストメニューから、ショートカットをおきたいフォルダを追加する。

    wm_inst08

    追加したフォルダに、先ほど作成したショートカットを移動

    wm_inst09

    CABプロジェクトのビルド

    wm_inst10

    ReleaseフォルダにCABファイルが作成されるので、デバイスにコピーする。

    wm_inst11

    後は、デバイス側でインストール。

    スタートメニューにショートカットが作成された!!

    wm_inst11a

    無事起動!

    よし!いつでもきやがれ Windows Market Place For Mobile

    wm_inst12a

    Windows Mobile アプリを作ってみる

    | コメント(0) | トラックバック(0)

    iPhone アプリの状況がうらやましい限り。

    んー悔しい。何千万円も儲からなくてもいいんだよ。何千円でもおっけーなんだよ。

    Appleの事情にはとんと疎いので、iTunesとかも使ったことないけど、うまいこと課金システムが出来上がってるんだろうな。

    触発されたわけではないが、明日のためのその1として、Windows Mobile用のアプリを作成すべく、プロトタイプ的なものを作ってみる。

    すこしずつ、野望に近づくのだ!

    題材は、インド式計算としてみる。最近とんと計算ができなくなってきたため、通勤時等のエクササイズ用として使えれば幸い。

    以下手順、はまりポイントメモ。

    1.仕様

    計算問題を出題。回答入力。正解、不正解と解法を表示

    2.プロジェクトの作成

    (1) 新規作成-プロジェクト から、MFCスマートデバイスアプリケーションを選ぶ

    MFCを使ってみる。SDKプログラミングはよくわからんのでとっつきやすいかと思い。

    wmapp01

    (2) ウィザードで、Windows Mobile 6 Standard  SDKを選択

    自機が、Windows Mobile 6 Standard なので。

    wmapp02

    おっと、ここにくるまでに、準備が結構必要なので、興味ある方は、こちらを参照。

    (3) まずは、感じをつかむためなので、ダイアログベースで

    wmapp03

    3.画面まわりの実装手順

    (1) メニューの追加

    wmapp_mnu01

    はまりその1。

    もともと、存在している、IDR_MAINFRAME メニューはいくら修正しても、なにもおこらない。以下の対応をするまで、1時間程度のはまり。

    IDR_MENUを追加し、メニューを作成。ダイアログ cpp ファイルの、OnInitDialog 関数内の、dlgCommandBar.InsertMenuBarの引数を変更したら、メニューが表示されるようになった。

    BOOL CindcalcDlg::OnInitDialog()
    {
        CDialog::OnInitDialog();

        // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
        //  Framework は、この設定を自動的に行います。
        SetIcon(m_hIcon, TRUE);            // 大きいアイコンの設定
        SetIcon(m_hIcon, FALSE);        // 小さいアイコンの設定

        if (!m_dlgCommandBar.Create(this) ||
            !m_dlgCommandBar.InsertMenuBar(IDR_MENU /* IDR_MAINFRAME */))
        {
            TRACE0("CommandBar の作成に失敗しました\n");
            return FALSE;      // 作成できませんでした。
        }

                       :

    wmapp_mnu03 

    (2) メニューにイベントを追加する

    リソースエディタに戻り、メニューが押下されたときのイベントを以下の手順にて作成する。

    ・メニューのコンテキストメニューから、イベントハンドラの追加を選択

    wmapp_proc01

    ・イベントハンドラ追加先を選択。ダイアログにしておく。

    「追加して編集」で、イベントハンドラを編集できるようになる。

    wmapp_proc02

    (3) ダイアログ画面の作成

    ダイアログエディタで、コントロールをぺたぺたはりつつ、ダイアログのメンバー変数として、コントロールを管理するために、コンテキストメニューから変数の追加を選択する。

    wmapp_proc03

    変数名を適当につけて、完了すると、ダイアログボックスクラスのメンバー変数としてコントロールが作成される。

    wmapp_proc04

    (4) Enterキーのハンドリング

    はまりその2。というほどでもない。ぐぐったらすぐわかった。

    ダイアログベースなので、Enterキーを押すと、画面が閉じてしまうので、CDialog::PreTranslateMessage 関数をオーバーライドして、Enterキー押下時の処理を実装する

    BOOL CindcalcDlg::PreTranslateMessage(MSG* pMsg)
    {
        // TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。

        if(pMsg->message == WM_KEYDOWN) {
            switch(pMsg->wParam) {
                case VK_RETURN:

                    OnAnswer();    // Enterキー押下で、呼び出す処理。
                    return TRUE;
                default:
                    break;
            }
        }

        return CDialog::PreTranslateMessage(pMsg);
    }

     

    4. 計算練習クラスの追加

    (1) 簡単な練習クラス(普通のC++クラス)を作成して、プロジェクトに追加する。

    問題の値から、解法を表示させようかと思っていたが、面倒くさくなったのでやめ。

    単純に計算問題を作成するだけのクラス

    はまりその3.

    まいった。2時間程度はまったのが、Windows Mobile を Visual Studioで開発する場合、time_t 関係の関数が利用できないみたい。

    乱数のSeedに現在時間を取得したいだけなのに。以下の青字部分のようにして、何とか動いた。

    #include "StdAfx.h"
    #include "CompPractice.h"

    CompPractice::CompPractice(void)
    : m_practice_type(0)
    , m_len(0)
    , m_answer(0)
    , m_ope1(0)
    , m_ope2(0)
    {
    }

    CompPractice::~CompPractice(void)
    {
    }

    // 練習開始 練習タイプ 1:足し算、2:引き算、3:掛け算 と、桁数を与える
    int CompPractice::Start(int practice_type, int len)
    {
        m_practice_type = practice_type;
        m_len = len;
        return 0;
    }

    // 次の問題
    CString CompPractice::NextPractice(void)
    {
        int mn = (int)(pow(10, m_len) - 1.0);

        SYSTEMTIME st;
        GetSystemTime(&st);
        CTime ct = CTime(st);
        srand((unsigned)ct.GetTime());
        m_ope1 = rand() % mn;
        m_ope2 = rand() % mn;

        CString ope = _T("");
        switch(m_practice_type) {
            case 1:
                ope = _T("+");
                m_answer = m_ope1 + m_ope2;
                break;
            case 2:
                ope = _T("-");
                m_answer = m_ope1 - m_ope2;
                break;
            case 3:
                ope = _T("×");
                m_answer = m_ope1 * m_ope2;
                break;
            default:
                break;
        }

        CString exp = _T("");
        exp.Format(_T("%d %s %d ="), m_ope1, ope,  m_ope2);

        return exp;
    }

    // 回答のチェック
    bool CompPractice::Answer(int ans_num)
    {
        return (m_answer == ans_num);
    }

    // 正答の取得
    int CompPractice::GetAnswer(void)
    {
        return m_answer;
    }

    (2) 計算クラスを呼び出す

    先ほどの、ダイアログのイベントハンドラから、上記計算クラスの関数を呼び出す。

    MFCのCStringクラスの利用法などもにわかには覚えきれないので、使いそうなのをこちらにまとめておく。

    void CindcalcDlg::OnAnswer(void)
    {
        // 次の問題
        CString str_ans = NULL;
        CString old_practice = NULL;
        m_txt_ans.GetWindowTextW(str_ans);
        m_txt_ans.SetWindowTextW(_T(""));
        m_lbl_exp.GetWindowTextW(old_practice);

        int ans = _ttoi(str_ans);
        bool ret = m_practice->Answer(ans);
        CString msg = _T("");
        msg.Format(_T("【正答】%s %d \r\n【%s】あなたの答え %s")
                 , old_practice
                 , m_practice->GetAnswer()
                 , (ret)?_T("正解"):_T("不正解")
                 , str_ans
        );

        m_lbl_ans.SetWindowTextW(msg);   
        m_lbl_exp.SetWindowTextW(m_practice->NextPractice());
    }

    5.動かす

    エミュレータだとこんな感じ。実機でもちゃんと動いている感じ。

    wmapp_proc06

    6.まとめ

    また一歩野望に近づいた!

    次は、サンプルアプリのリリースバージョンをどうやって作成するか調べる。

    インストーラの作成

    the MS Conference SQL Server2008(St-1b)

    | コメント(0) | トラックバック(0)

    5月20日名古屋でのカンファレンスメモの続き

    「SQL Server2008 製品概要早わかり」セッションの概要

    SQL Server2008 は次の5つの特徴を持つ。

    1.高品質、2.コンプライアンス、3.サーバー統合シナリオ、4.大規模DWH、5.全社員向けBI基盤

    それぞれの特徴についての説明

    1.高品質

    SQL Server2008は、2008年7~9月が、完成予定であるが、SQL Server2005をベースに開発を行っており、NASDAQ百五銀行に採用実績。

    SQL Server2005をベースに開発しながら、以下のような、常に出荷可能に近い状態を保つ新しい開発プロセスを採用している。

    • SQL Server2005をベースにした製品をメインラインとし、常に出荷可能に近い保つ。
    • 機能(Improvement)ごとにチームを編成し、メインラインとは分離して開発され、テストが完了した時点で、メインラインに組み込みCTP(Community Technology Preview)とする。
    • これにより、メインラインに組み込まれた機能については、β版とはいえ、高い完成度を持っている。

    2.コンプライアンスの実現

    透過的データ暗号化

    SQL Server2005 でも、データ暗号化はサポートされていたが、利用するためには、SQLにて関数(EncryptByKey、DecryptByKey)を使用する必要があった。

    SQL Server2008 では、管理画面上から、チェックボックスをONにするだけで、データが暗号化される。これはアプリケーションからは完全に透過的に実行されるため、アプリケーションの変更は不要。

    ポリシーベース管理

    ITガバナンス実現のため、データ管理のルールを明文化する。

    ポリシーを制約を式として定義したファセットとして管理する。SQL Server 2000、2005も管理対象とすることができる。

      [ポリシー]

          +- [ファセット]

               +- [条件式]

    ポリシーを作成し、ジョブとして実行、評価を行う。

    データ操作監査

    以前のバージョンでは、SQL Trace プロファイラ[2005]、として実現されていたが、2008では、データベースエンジンにネイティブに組み込まれるため、オーバーヘッドが小さくパフォーマンス良。

    3.サーバー統合シナリオ

    マルチインスタンス

    単一のサーバーで複数のデータベースインスタンスを管理することができる(Enterprise エディションは50、Standard以下は16インスタンス)。インスタンスとして、SQL Server 2000、2005、2008の管理を行うことができる。

    マルチインスタンスを利用することにより、物理サーバを削減することができ、TCOの削減を行うことができる。

    ただし、物理サーバが統合されることで、複数のアプリケーションが1つの物理サーバに接続されることにより、リソースの競合が起こる。この対応として、リソースガバナが搭載されている。

    リソースガバナ

    メモリ、CPU等のリソースをプールし、リソースの利用を調整(使用率、時間、タイムアウト、最大数)する。

    パフォーマンスデータコレクション

    パフォーマンス状況を見える化する。

    過去のある時点にさかのぼって、そのときの状況を確認することができる。

    Disk Usage Summary : ディスク使用量の推移

    Query Statistics History : クエリの統計情報

    Server Activity History : メモリ、CPU、ディスク、ロック状況

    4.大規模データウェアハウス

    データパーティション

    テーブルに境界を設定し、別のディスクに格納するようにパーティショニング可能。これにより、ディスクI/Oを少なくできる。アプリケーションからは透過的である。

    データ圧縮

    以下のようなデータ圧縮を行い、ディスクI/Oを減少させる。

    行(ROW)圧縮 : 固定長データ型を可変長として格納(INT、FLOAT、REAL、MONEY、DETATIME、CHARなど)

    ページ(PAGE)圧縮 : 列ごとに重複しているプレフィックス部分を圧縮(プレフィックス)。詳細レベルの重複パターンを検出して圧縮(ディクショナリ)

    バックアップ圧縮 : BACKUP DATABASE (T-SQL)に、WITH COMPRESSION キーワードを付加し、メディアにバックアップを書き込む前に、CPUパワーを使用して圧縮する。ディスク要領は節約できるがリソースの利用とのトレードオフ

    5.全社員向けBI基盤

    Reporting Services

    Webを利用したリッチなレポートを作成。

    以上

    キーワード

    開発手法:CTP

    コンプライアンス:ファセットSQL Trace プロファイラ

    サーバー統合:マルチインスタンスリソースガバナパフォーマンスデータコレクション

    大規模DWH:データパーティションデータ圧縮行(ROW)圧縮ページ(PAGE)圧縮バックアップ圧縮 

    全社員向けBI : Reporting Services

    EclipseとVisualStudioをつかってJNIプログラムを作る手順

    | コメント(0) | トラックバック(0)

    ちょっと、JNIを使って、Java用のユーティリティを作ろうと思ったら、意外とチェックポイントが多かったので、サンプルプログラムを作り、手順をメモっておく。

    題材

    題材は何でもよかったが、手ごろな感じがするので、OSのメモリ使用量を調べるJNI用DLLを作成する。

    概要

    uml01

    MemoryCheckerクラスは、Javaのウィンドウで、TextAreaにメモリ情報を出力するメソッドを追加した、MemoryListenerTextAreaを配置。

    メモリ使用量を調査する抽象クラス、AbsMemoryManagerから、JVMのメモリ調査用クラスJavaMemoryManagerと、OSのメモリ調査用クラスJNIMemoryManagerを派生させる。

    メモリ使用量データ保持用にMemoryStatusクラスを用意

    uml02

    動きとしては、MemoryChecker(ウィンドウ)から、JNIMemoryManagerを生成する。JNIMemoryManagerは、DLLをロードし、MemoryStatusのインスタンスを渡す。DLLでは、メモリ量を指定インターバル毎に調査して、保持するMemoryStatusのインスタンスにセットし、changeメソッドを呼ぶ。これが順に伝わり、TextAreaに状況を表示する。

    win01

    出来上がりはこんな感じ。

    作成手順(Eclipse側)

    DLL呼び出し元クラス

    1. DLLをロードする記述を追加
    2. DLLの関数を呼び出すメソッドをnative宣言
    public class JNIMemoryManager extends AbsMemoryManager { 
      /** DLLをロード */ 
      static { 
        System.loadLibrary("MemStat"); 
      }  
      public JNIMemoryManager(IMemoryStatusListener listener, long inverval) { 
        super(listener, inverval); 
      } 
      public void changeStatus() { 
        this.listener.statusChenged(getMemoryStatus()); 
      } 
      /** DLLからMemoryStatusを取得 */ 
      public native MemoryStatus getMemoryStatus(); 
      /** DLLにMemoryStatusをセット */ 
      public native void setMemoryStatus(MemoryStatus memstat); 
      /** DLLのメモリ調査を開始 */ 
      public native void run(); 
      /** DLLのメモリ調査を終了 */ 
      public native void stop(); 
    }

    DLL指定の拡張子部分、dll、soは、Javaのライブラリが勝手に補完してくれるので不要。


    C/C++ ヘッダーファイルを作成

    1. コンパイル済みJavaクラスから、javah コマンドを利用して、C/C++用のヘッダファイルを生成
    2. C/C++での処理用に利用するJavaクラスのシグネチャをjavapコマンドを利用して取得

    上記の1.は最低限必要な作業。2.はDLL側からJavaのクラスのメソッドを呼び出すときに、メソッド名と、戻り値、引数のシグネチャが必要だが、この記述がJavaでの通常の記述とはことなるので、簡単に取得するために行う。

    また、上記作業をつどコマンドラインから実行するのも面倒なので、以下の手順でAntのタスクとして登録しておく。

    eclipse01

    プロジェクトから、新規作成-ファイルで、build.xml という名前のファイルを追加し、以下の内容を記述する。

    <project basedir="./"> 
      <property name="cpdir" value="${basedir}\bin"/> 
      <target name="create c header file"> 
        <!-- 
          JNI用のCヘッダーファイルを生成 
          -eg batch file 
             cd "C:\Program Files\eclipse3.3.2\workspace\JNISample\bin" 
                 javah -jni info.typea.jnisample.mem.JNIMemoryManager 
         --> 
        <exec executable="javah"> 
          <arg value="-classpath"/> 
          <arg value="${cpdir}"/> 
          <arg value="-jni"/> 
          <arg value="info.typea.jnisample.mem.JNIMemoryManager"/> 
        </exec> 
      </target> 
      <target name="print signeture (MemoryStatus)"> 
        <!-- 
          JNI用シグネチャ確認(標準出力に出力) 
          -eg batch file 
          cd "C:\Program Files\eclipse3.3.2\workspace\JNISample\bin" 
          javap -private -s -classpath . info.typea.jnisample.mem.MemoryStatus 
        --> 
        <exec executable="javap"> 
          <arg value="-private"/> 
          <arg value="-s"/> 
          <arg value="-classpath"/>  
          <arg value="${cpdir}"/> 
          <arg value="info.typea.jnisample.mem.MemoryStatus"/> 
        </exec> 
      </target> 
    </project>

    あとは、Eclipseのメニュー- Window- Show View から、Antを開くと、今の設定が表示されるので、該当を選択して、実行ボタンを押すとヘッダーファイルが作成される。

    今回の例では、パッケージを展開したやたら長い名前のヘッダーファイルが作成される。

    info_typea_jnisample_mem_JNIMemoryManager.h

    eclipse02

    とりあえず、ここまででEclipse側は終了。

    作成手順(VisualStudio側)

    プロジェクトの作成

    VisualStudio側では、VC++を利用して、MFC拡張DLLを作成する。

    mfc01

    プロジェクト名を、上記Java側でロードするDLLの名称にする。

    mfc02

    MFC拡張DLLを指定

    JNI用ヘッダーファイルの取り込み

    mfc03

    先ほど作成した「info_typea_jnisample_mem_JNIMemoryManager.h」を、作成されたプロジェクトの適当なところにコピーして、ソリューションエクスプローラのヘッダーファイルのコンテキストメニューから、既存の項目を選んで取り込む。

    mfc04

    実装用に、「info_typea_jnisample_mem_JNIMemoryManager.cpp」ファイルを、同じくソリューションエクスプローラのソースファイルから新しい項目として追加する。

    環境設定

    JNI用のインクルードファイルの場所をVisualStudioに設定する。

    メニュー-ツール-オプションでオプションダイアログを開き、「プロジェクトおよびソリューション-VC++ディレクトリ」を選択し、「ディレクトリを表示するプロジェクト」に、「インクルードファイル」を選択

    mfc05

    ここに、JavaSDKのjni.hを含む、includeディレクトリ、jni_md.hを含むwin32ディレクトリを指定する。

    ちなみに、今回の環境だと、

    • C:\Program Files\Java\jdk1.6.0_06\include
    • C:\Program Files\Java\jdk1.6.0_06\include\win32

    の2つとなる。

    JVM引数の指定(Eclipse側)

    テスト段階では、コンパイルされたDLLをEclipseのデバッグ環境から認識させるために、以下の設定を行う。

    mfc06

    実行するクラスのコンテキストメニュー-Debug As-Open Debug Dialogを選択すると、上記ダイアログが起動するので、Argument タブの VM argumentsに、-Djava.library.path オプションを指定する。値は、DLLのパス。

    今回の例では、

    -Djava.library.path="C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\MemStat\Debug"

    となる。

    ここまでで、基本的な設定は完了なので、後は、実装を行う。

    DLLの実装

    JNIのリファレンスは、ここらあたりに、あるので結局はそこを読めばよいのだが、いかんせんなじみがないので、素直には読み進められなかった。

    上記シナリオに基づいて、作成したコードに補足する。

    #include "stdafx.h"
    #include "info_typea_jnisample_mem_JNIMemoryManager.h"
    
    

    jobject global_memstat; // (2)
    boolean _stopFlag;

    /*
    * Class: info_typea_jnisample_mem_JNIMemoryManager
    * Method: getMemoryStatus
    * Signature: ()Linfo/typea/jnisample/mem/MemoryStatus;
    */
    JNIEXPORT jobject JNICALL Java_info_typea_jnisample_mem_JNIMemoryManager_getMemoryStatus
    (JNIEnv *env, jobject thisObj){ // (1)
    return global_memstat;
    }

    /*
    * Class: info_typea_jnisample_mem_JNIMemoryManager
    * Method: setMemoryStatus
    * Signature: (Linfo/typea/jnisample/mem/MemoryStatus;)V
    */
    JNIEXPORT void JNICALL Java_info_typea_jnisample_mem_JNIMemoryManager_setMemoryStatus
    (JNIEnv *env, jobject thisObj, jobject memstat) {

    global_memstat = env->NewGlobalRef(memstat); // (2-1)
    }

    /*
    * Class: info_typea_jnisample_mem_JNIMemoryManager
    * Method: start
    * Signature: ()V
    */
    JNIEXPORT void JNICALL Java_info_typea_jnisample_mem_JNIMemoryManager_run
    (JNIEnv *env, jobject thisObj){

    // (3)
    jclass mng = env->GetObjectClass(thisObj);
    jmethodID jmIntvl = env->GetMethodID(mng, "getInterval", "()J");
    jlong interval = env->CallLongMethod(thisObj, jmIntvl);

    _stopFlag = false;

    jclass jc = env->GetObjectClass(global_memstat);
    jmethodID jmChng = env->GetMethodID(jc, "change", "()V");

    jmethodID jmMemLd
    = env->GetMethodID(jc, "setMemoryLoad", "(I)V");
    jmethodID jmTtlPs
    = env->GetMethodID(jc, "setTotalPhys", "(I)V");
    jmethodID jmAvlPs
    = env->GetMethodID(jc, "setAvailPhys", "(I)V");
    jmethodID jmTtlPf
    = env->GetMethodID(jc, "setTotalPageFile", "(I)V");
    jmethodID jmAvlPf
    = env->GetMethodID(jc, "setAvailPageFile", "(I)V");
    jmethodID jmTtlVr
    = env->GetMethodID(jc, "setTotalVirtual", "(I)V");
    jmethodID jmAvlVr
    = env->GetMethodID(jc, "setAvailVirtual", "(I)V");

    MEMORYSTATUS memstat;

    while (!_stopFlag) {
    GlobalMemoryStatus( &memstat );

    env->CallVoidMethod
    (global_memstat, jmMemLd, memstat.dwMemoryLoad);
    env->CallVoidMethod
    (global_memstat, jmTtlPs, memstat.dwTotalPhys / 1024);
    env->CallVoidMethod
    (global_memstat, jmAvlPs, memstat.dwAvailPhys / 1024);
    env->CallVoidMethod
    (global_memstat, jmTtlPf, memstat.dwTotalPageFile / 1024);
    env->CallVoidMethod
    (global_memstat, jmAvlPf, memstat.dwAvailPageFile / 1024);
    env->CallVoidMethod
    (global_memstat, jmTtlVr, memstat.dwTotalVirtual / 1024);
    env->CallVoidMethod
    (global_memstat, jmAvlVr, memstat.dwAvailVirtual / 1024);
    env->CallVoidMethod(global_memstat, jmChng);

    SleepEx(interval, FALSE);
    }
    }

    /*
    * Class: info_typea_jnisample_mem_JNIMemoryManager
    * Method: stop
    * Signature: ()V
    */
    JNIEXPORT void JNICALL Java_info_typea_jnisample_mem_JNIMemoryManager_stop
    (JNIEnv *env, jobject thisObj) {
    _stopFlag = true;

    env->DeleteGlobalRef(global_memstat); // (2-1)

    global_memstat = NULL;
    }

     

    (1) 関数宣言

    1つ目の引数に、JNIEnvとして、JNI用の関数テーブルが渡される。これを利用して各種操作を行う。

    2つ目の引数には、呼び出し元オブジェクトが渡される。

    (2) グローバル参照

    DLLの関数をまたがって、Javaのインスタンスを保持したい場合、(2)のように宣言して、初回の関数呼び出し時の引数jobjectを代入しておくだけでは、次回の関数呼び出し時に、その値は利用できない。そのような場合、グローバル参照を利用する必要があり、作成時には、

    NewGlobalRef

    破棄時には、

    DeleteGlobalRef

    を使用する。

    (3) Javaメソッドの呼び出し

    1:  JNIEXPORT void JNICALL Java_info_typea_jnisample_mem_JNIMemoryManager_run


        (JNIEnv *env, jobject thisObj){

    2:  jclass mng = env->GetObjectClass(thisObj);
    3:  jmethodID jmIntvl = env->GetMethodID(mng, "getInterval", "()J");


    4:  jlong interval = env->CallLongMethod(thisObj, jmIntvl);

    今回の例で、nativeメソッド呼び出し元である、JNIMemoryManagerクラスのgetIntervalメソッドを、JNI関数の中から呼び出す場合、

    1行目:JNIMemoryManagerのnativeメソッドrunが呼び出される。2つ目の引数に、JNIMemoryManager自身のインスタンスが設定されている。

    2行目:JNIMemoryManager自身のインスタンスから、GetObjectClass関数を利用して、jclassを取得する。

    3行目:取得した、jclassに、メソッド名、シグネチャを指定(ここで、上記で作成した、Antタスクを利用すると便利 ちなみに、()Jは、引数なし、戻り値long)してGetMethodIDを呼び出すと、jmethodIDを取得できる。

    4:戻り値にあわせたCallxxxMethod関数を利用して、メソッドを呼び出す。

     

    と。とりあえずはこんなところ。

    まぁあとはリファレンスを見ながら何とかなるかな。

    ソースコードはここ

    ちょっと古い本だけど、JNIについて、丁寧に説明されています。

    the MS Conference Win Svr 2k8(St-1a)

    | コメント(0) | トラックバック(0)

    昨日開催された、the Microsoft Conference 2008 に参加してきた。

    社長が、基調講演で、要望に答えてやっと名古屋開催にいたりました!みたいなことをいっていたけど、今回で3回目くらいの参加(in 名古屋)。

    たしか、去年かおととしは名古屋飛ばされたんだよな~

    今回はなんと参加者に、VisualStudio2008 Standard Editionが配られました(転売不可版)。太っ腹。

    Amazon だと、2,8161円也 前回参加したときのお土産(?)が、SQLServerの乾電池だったことを考えるとすごい出世。

    ms_omiyage

    ほかにも、WindowsVista Ultimate、SQL Server 2008 等の評価版もいただきました。

    あと、世界中のSEの写真集。

     

    ~ 以下 Window Server 2008 概要をわすれないうちにまとめとく ~

    「Windows Server 2008 概要(ST-1A) 」セッションの概要

    今回のバージョンアップは、5年ぶりのメジャーバージョンアップであり、柔軟性、セキュリティとコンプライアンス、次世代サービス基盤の3本柱を実現するためのソリューションを提供する。

    Micorosoftは、柔軟性を実現するために、戦略的な仮想化技術を展開する。

    一般によく言及される、サーバのみ仮想化ではなく、サーバ、プロファイル、プレゼンテーション、デスクトップ、アプリケーションと包括的に仮想化技術を提供する。また運用管理として、SystemCenterを提供(非MS製品も管理可能)する。

    特に、サーバの仮想化としては、Xen同様SuperVisor方式を採用したHyper-Vという仮想化技術を提供する。SuperVisor方式であるため、現行のVirtualServer2005R2とくらべて倍以上の速度差を体感できる。

    従来のターミナルサーバーは、デスクトップまるごと表示していたが、アプリケーションのWindowのみを転送することが可能なRemoteAppを提供する。また、TSゲートウェイという、インターネット(SSL)経由でリモートデスクトップや、RemoteApp利用できる機能を提供する。これにより、社外から社内のアプリケーションを利用するために、VPNを構築したり、社内アプリケーションをWeb化するなどのコストをかける必要がなくなる。

    セキュリティでは、NAP(NetworkAccessProtection)という検疫サービスを標準で提供する。検疫サービスは、現状コストがかかる上に効果が薄く、設定も複雑なため、導入が進んでいない。NAPでは、管理ポリシーを常時監視し、違反しているPC等は、接続させない。標準で提供されている管理ポリシー以外のポリシーを設定したい場合、SDK(C言語)が提供されている。

    次世代サービス基盤として、IIS7.0では、RIA(RichInteractiveApplication)である、Silverlightの提供が容易になる。また、国内で数十万人の開発者を擁するPHPにも対応する。Apacheからの移行も容易になる。

    上記3本柱を支えるソリューションとして、管理性では、Windows Power Shellの提供、これは、Cシェルや、bashと同等のもので、Windows Serverのすべての機能にアクセスできる。また、堅牢製を担保するために、Server Core(コマンドプロンプトのみの構成 不要サービスはインストールされない)、フェイルオーバークラスタなどが提供される。次世代プロトコルスタック(IPv6)も、Windows Vista、Windows Server 2008で、スクラッチから実装しなおされている(これまでは、Windows 95時代に実装されたものに修正を重ねてきた)

    これらをもって、TCOの削減により、現在の調査では、新規開発20%、保守運用80%となっているIT投資の割合を逆転させたい。

     

    以上

    キーワード

    仮想化: SystemCenterHyper-VRemoteAppTSゲートウェイ

    セキュリティ: NAP読み取り専用ドメインコントローラ

    堅牢性:Server Coreフェイルオーバークラスタ

    管理性:WindowsPowerShell

    Web:IIS7.0(PHP)、Silverlight



    このアーカイブについて

    このページには、過去に書かれたブログ記事のうちVisualStudioカテゴリに属しているものが含まれています。

    前のカテゴリはVC++です。

    次のカテゴリはWindowsです。

    最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

    ウェブページ

    OpenID対応しています OpenIDについて
    Powered by Movable Type 5.02