IIS7.0 基本のき(補講4)

補講の4回目です。今回は「アプリケーションプール」について解説します。

ASP.NET アプリケーションは、PerlなどのCGIと違って、一度コンパイルされて動いています。前回、解説したように一時的にコンパイルされたDLLを呼び出しているわけです。

このDLLは単体で動くわけではなくて、w3wp.exe という「ワーカープロセス」から呼び出しています。この実行ファイルを制御しているのが「アプリケーションプール」というものです。
通常は、「ワーカープロセス」=「アプリケーションプール」と覚えていて構いません。

IISマネージャでみると、これですね。

<012>
20100303_0121

また、ASP.NETアプリケーションが動くときに、このワーカープロセスが1つずつ起動されているわけではありません。複数のASP.NETは、ひとつのワーカープロセスに相乗りしています。

中身を見たいアプリケーションプールを選択して、右側の【アプリケーションの表示】を選択すると、アプリケーションプールを共有している ASP.NET アプリが見れます。

<013>
20100303_0131
さて、ちょっと考えると分かりますが、複数のASP.NETアプリが相乗りしているということは、このワーカープロセスが落ちるようなことがあると、全てのASP.NETに影響がでてしまいます。
つまり、他のASP.NETアプリで不都合があったり、非常に重たかったりすると、他のASP.NETアプリに影響がでるわけです。

これを防ぐために、デフォルトのアプリケーションプール以外にも、新しいアプリケーションプールを作成できます。
アプリケーションプールを選択した後に、右上にある【アプリケーションプールの追加】を選択します。

<014>
20100303_0141

こうすることで、重たいASP.NETアプリを別のアプリケーションプールに移して、軽いASP.NETアプリはひとつのアプリケーションプールに置く、という配置が可能です。

カテゴリー: 設計 | IIS7.0 基本のき(補講4) はコメントを受け付けていません

IIS7.0 基本のき(補講3)

補講の3回目です。

IISマネージャで、仮想ディレクトリを追加する方法ですが、まずは「仮想ディレクトリ」とは何かを説明しましょう。

通常、IISのルートディレクトリは、c:\inetpub\wwwroot ディレクトリになっています。このフォルダに、c:\inetpub\wwwroot\moonmile のようなフォルダを作って、

http://localhost/moonmile/

のようにアクセスできるようにします。

ただし、このドライブはCドライブにあるので、常に Windows のシステムフォルダと同じになります(変更は可能ですが…)。なので、アプリケーションのフォルダを別のドライブにリンクさせることで HDD の容量を分散させたり、HDD アクセスを軽減させたりできます。

例えば、

d:\moonmile というフォルダを http://localhost/moonmile/ に割り当てようとすれば、

フォルダを右クリックして「仮想ディレクトリの追加」を選択します。

<008>
20100303_008

ダイアログで、パスと、物理フォルダを設定します。

<009>
20100303_009

これで、http://localhost/moonmile/ にアクセスすると d:\moonmile が使われる訳です。

同様に、Webアプリケーションの場合も、「アプリケーションの追加」を選足して、フォルダを変えることができます。

<010>
20100303_010

ただし、ASP.NETを使うWebアプリケーションの場合、HDD アクセスに関しては注意点があります。

ASP.NETのソースコードは、そのまま実行されるわけではなくて、一時的コンパイルされて実行されます。このコンパイルされた実行ファイルは、

ASP.NET Web サイトのプリコンパイルの概要
http://msdn.microsoft.com/ja-jp/library/399f057w(VS.80).aspx

にあるように、「%SystemRoot%\Microsoft.NET\Framework\version\Temporary ASP.NET Files」のようなフォルダに置かれます。ASP.NET 2.0 の場合は、

C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files

のフォルダになります。
# vista の場合は、このフォルダに一時的なコンパイルファイルを確認できるのですが、
# Windows Server 2008 では DOS プロンプトでは確認できません。

このように、ASP.NET の場合はプリコンパイルされたファイルが一時的に保存されるので(aspxファイルを編集すると、更に新しいファイルが作成されます)、このままでは Cドライブに負担を掛けます。
最悪の場合、Cドライブの容量が足りないために、システムがダウンします。

これを防ぐために、一時フォルダを変更することが可能です。

ASP.NETカテゴリの【.NETコンパイル】のアイコンをクリックすると、

<011>
20100303_011

この一時ディレクトリを変更できます。

カテゴリー: 設計 | IIS7.0 基本のき(補講3) はコメントを受け付けていません

IIS7.0 基本のき(補講2)

補講の2回目です。

実は、IISを最初にインストールした状態では、ASP.NETは使えません。他にも色々な機能が制限されています。

これは「まずは最低限の状態でインストールする」というセキュリティの方針から、こうなっています。一見不便なような気がしますが、必要なときに必要なだけの設定ができる(よくわからない設定がされていない)状態であるので、「安心感」があると云えます。

余談ですが、GUI部分すら取り除いた、Core モードというのが、Windows Server 2008 にはあります。起動すると、馴染みのない(私にはなじみ深いのだが)、DOS プロンプトが立ち上がります。

さて、ASP.NETを導入するためには、サーバーマネージャの「役割」を使います。

<004>
20100303_004

右にある「役割サービスの追加」をクリックすると、ダイアログが出ます。

<005>
20100303_005

ここで【アプリケーション開発】→【ASP.NET】にチェックを入れて【インストール】ボタンを押すと、ASP.NETが使えるようになります。

vista の場合は、ちょっとややこしくて、

【コントロールパネル】を開いて、【プログラム】を選択した後に、【Windowsの機能の有効化または無効化】を選択します。

<006>
20100303_006

【Windowsの機能】のダイアログで【ASP.NET】を選択します。

<007>
20100303_007

ちなみに認証関係(基本認証やWindows認証など)も初期状態では入っていないので、ここでインストールします。

カテゴリー: 設計 | IIS7.0 基本のき(補講2) はコメントを受け付けていません

IIS7.0 基本のき(補講1)

先週の土曜日、.NETラボ http://dotnetlab.net/ で勉強会をしたのですが、資料が間に合わなくて、プレゼンテーションは最初の1頁しか作れませんでした(笑…っている場合ではないけど)。

それで、.NETラボの勉強会では「毒舌モード」でお話しましたが、ここでは「スマイル営業モード」で語らせて頂きます。別途「毒舌モード」や、懇親会でお話した不思議なブログの話は、またの機会にでも。怪しいブログのほうは、別の機会にちょろっとリンクしておきます。あ、.NETラボのブログのリンクから辿っても ok です。

そんな訳で、資料をラボのほうにアップできないので、ブログで補講をします。
内容は、ラボの勉強会でお話した内容ですね。語り口が違うだけです。多分。

数回にわたって書いていく予定なので、先に目次だけ。

1.IISマネージャの起動
2.IISの機能を追加する
3.仮想ディレクトリを追加する
4.アプリケーションプールとは
5.Appcmd.exeとは
6.Web Platform Installerとは
7.URL書き換え(URL rewrite)とは

という内容です。

.NETラボの勉強会ではノートブックを使ったので vista 環境での説明でしたが、ここでは Windows Server 2008 の説明をします。

ネタ元としては、「ひと目でわかる IIS 7.0」なので、
http://www.amazon.co.jp/dp/4891006129

立ち読みするなり、買うなりして貰うということで。

~~

さて、補講1ですが、IISを導入した後に、最初に何をするかと言えば「IISマネージャ」ってのを立ち上げます。IIS 6 の頃から使っているとそのインターフェースの違いに驚きを感じますが、まぁ、そのあたりは「慣れ」ということでしょう。

IIS 6 の頃は、ASP.NETが後から入ってきたので、IIS(.ASP管理を含む)の管理と、ASP.NETで作成したWebアプリケーションの管理が分離されてしまって、ちょっとややこしい感じになっていました。

IIS 7 の場合は、IIS自身の機能とASP.NETの機能が統合されているので、IISマネージャでは、次のように同じ画面で扱えます。

<001>
20100303_001

グループ化がされていて、「ASP.NET」と「IIS」に分かれています。
ASP.NETグループのほうは、.NETユーザーを始めとして、ASP.NET で扱う情報を、
IISグループでは、従来通り IIS で管理するツールが含まれます。SE の方は、主に IIS グループのほうを扱うことになりますね。

さて、IISマネージャを起動する場合、Windows Server 2008 の場合は

【すべてのプログラム】→【管理ツール】→【インターネットインフォーメーションサービス】

で起動します。

<002>
20100303_002

Vista の場合は、ちょっと厄介で「管理ツール」が表示されていません。

【コントロールパネル】を開いた後に、【クラシックモード】にして「管理ツール」のアイコンをクリックするか、

<003>
20100303_003

スタートメニューの「検索」で「iis」と入力すると「IISマネージャ」が検索されるので、これを使います(私は専ら、これですね)。

カテゴリー: 設計 | IIS7.0 基本のき(補講1) はコメントを受け付けていません

多重定義の罠(自動キャストに注意)

関数の多重定義ってのは、非常に便利な機能で、同じ名前でも引数の数や型が違うと別の関数として判別してくれる、っていう技です。

オブジェクト指向言語は、大抵これを利用しています。

# オブジェクト指向的には必須って訳ではないんだろうけど、引数の数が異なる度に
# 関数名を考えないと駄目ってのもアレなわけで。

# あと、C++/C# に限って言えば、コンストラクタの多重定義ができないと言語的に
# 成り立たないってのがあります。

class A
{
private:
 int _x ;
public:
 // 引数のないコンストラクタ
 A() { _x = 0; }
 // 引数のあるコンストラクタ
 A( int x ) { _x = x; }
};

ここで多重定義ができないと、A(x) ってのができません。
仕方がないので、A::CreateX( int x ) なんて云うスタティッククラスを使うような
ファクトリーパターンを使うようになる訳です。Java の場合は、Factory パターンが
主流ですが、C++のほうはコンストラクタの多重定義が多いですね。

# objective-c の場合は、このあたり中途半端(っぽく見える)なので、
# Aクラスに initWithX というメソッドを作ります。

さて、この多重定義を突き詰めていくと、出来るだけ短い名前で表現したいという欲望に駆られます。勿論一方で、elementById という名前も主流でもあるわけですが。

ひとまず、ざっと次のコードをご覧ください。

using System;

public class RGB {
 private double _r;
 private double _g;
 private double _b;
 
 public RGB() {
  _r = _g = _b = 0.0;
 }
 public RGB( double r, double g, double b ) {
  _r = r;
  _g = g;
  _b = b;
 }
 public RGB( byte r, byte g, byte b ) {
  _r = ((double)r)/255.0;
  _g = ((double)g)/255.0;
  _b = ((double)b)/255.0;
 }
 public override string ToString() {
  return string.Format("r:{0} g:{1} b:{2}", _r, _g, _b );
 }
}

public class Test {
 
 public static void Main( string[] args ) {
  Console.WriteLine("RGB check");
  
  RGB col = new RGB();
  Console.WriteLine("RGB {0}", col );
  // 実数で指定
  col = new RGB(1.0, 1.0, 0.0);
  Console.WriteLine("RGB {0}", col );
  // WindowsのRGB値(0-255)で指定
  col = new RGB(0,255,255);
  Console.WriteLine("RGB {0}", col );
  // 実数で指定したつもり
  col = new RGB(1, 1, 0);  // byte型とみなされてしまう。
  Console.WriteLine("RGB {0}", col );
  col = new RGB(1.0, 1, 0); // ひとつでもdouble型にしておけばok
  Console.WriteLine("RGB {0}", col );
 }
}

RGB値を扱う関数なのですが、Mac の場合、RGB値は1.0から0.0の実数を取るんだよね~、ってことが分かって、まあ画像解析がてら double 型に組んでいたいのです。
(実際は、float 型なのですが、キャストが面倒なのと説明の関係で double 型にしてあります)

ご存じの通り、Windows の RGB 値は 0 から 255 の整数値を取ります。ですが、これはディスプレイに表示するときには便利なのですが、色相を変えたりするときは、結局実数で扱うので、そのまま扱うと不便です。

なので、内部的には double 型で扱う。けれども、RGB 値を整数値(byte型)でも渡せるよ、というクラスを作ってみたわけです。

RGB( double r, double g, double b )
RGB( byte r, byte g, byte b )

この2つのコンストラクタ(関数でもいいけど)は多重定義を使っていて、一方は double 型、もう一方は byte 型で初期化できるものです。

多重定義ができないと、

RGBByDouble( double r, double g, double b )
RGBByByte( byte r, byte g, byte b )

な感じになるんですが、まあ、RGB コンストラクタのほうがスマートでしょう?

ですが、ここに落とし穴があるんですねぇ。
先のプログラムを実行すると、こんな感じになります。

RGB check
RGB r:0 g:0 b:0
RGB r:1 g:1 b:0
RGB r:0 g:1 b:1
RGB r:0.00392156862745098 g:0.00392156862745098 b:0 ★
RGB r:1 g:1 b:0

★の部分が、意図しなかった動きです。

// 実数で指定したつもり
col = new RGB(1, 1, 0);  // byte型とみなされてしまう。
Console.WriteLine("RGB {0}", col );

実は、上記のように即値で指定する場合、「1」や「0」は整数とみなされるために、byte 型で初期化するコンストラクタが呼び出されます。勿論、C言語を習ったときのように、

「実数を指定するときは、明示的に 1.0 としないと駄目」

ってことを忘れずにいればいいんですが。

そんな訳で

col = new RGB(1.0, 1, 0); // ひとつでもdouble型にしておけばok
Console.WriteLine("RGB {0}", col );

こんな風に、即値の場合は明示的に指定するのが吉です。
自動キャストは、データ型の小さいところから判断されるので、

byte -> int -> long -> float -> double

の順番にキャストされています。先の例では byte 型なので、見当が付きそうですが、

int型とlong型の混在なんかやると、もう駄目ですね。意図通りに動きません。
なので、そういう風な場合は、「やめましょう」ってのが筋です。
そうそう、C言語ならば typedef、C# ならば型を継承するってのもひとつの方法です。
標準で定義されている typedef unsigned long size_t ; のように、しておけば型が厳密に判断されて、先の自動キャストの範囲外になり、混乱が少なくなります。

カテゴリー: 開発 | 多重定義の罠(自動キャストに注意) はコメントを受け付けていません

意外と画面が狭いぞ!ネットブック

ネットブックで業務アプリを動かそう、なぞと構想しているのですが、それってユーザーに使いやすい画面になるのでしょうか? ってなわけで「ドックフード」してみました。

ネットブックの画面サイズは、大抵は 1024×600 だそうです。
ブラウザで表示、タスクバーなんかが表示されると、結構画面が狭くなります。

「ネットブック」には何が出来て、何が出来ないのか?

まぁ、ネットブックの基本はメール送受信とブラウザ閲覧なわけなので、そんなに大きな
画面は必要ないのですが、意外と縦が狭い!意外とどころじゃなくて、狭すぎる!

<016>
20100219_161

画面キャプチャの、上のIE部分が実際に表示できるところです。
次なるスクリプトを書いて、タスクバー分(50ドットぐらい)減らしています。
# XPのタスクバーは30ドットです。

on error resume next
set fso = CreateObject("Scripting.FileSystemObject")
txt = ""
for each br in CreateObject("Shell.Application").Windows
  pname = ""
  pname = fso.GetFileName( br.FullName )
   if br.LocationURL <> "about:blank" then
    br.top = 0
    br.left = 0
    br.width = 1024
    br.Height = 600 - 50
  end if
next

このブログを表示させると、タイトルしか表示されませんね。。。
XPにIE8を乗せて、

・メニューバー
・お気に入り等のショートカット
・タブ
・ステータスバー

を全て表示させるとこんな感じです。
更に、google ツールバーやら yahoo ツールバーやらが入るとえらいことになりそうです。
業務系の場合は、タスクバーを消すように設定して全画面表示で使う、という技、あるいは、ツールを使って画面の解像度を高くする、という荒業もできますが、一般の場合はそうもいきません。特に、ブラウザで表示する場合は、相手にどんな状態で使ってくれと要求することはできませんから、この画面でなんとか操作性を上げる努力をしないと駄目なわけです。

ただし、業務系に限って言えば、解像度が低いことが問題にはならない。ネットブック用にフォントを小さくしたり、画像を小さくすればいい訳で、小さな画面の視認性を上げるための限界を知っておくのと、画面が横長になることに配慮すればいいだけです。

カテゴリー: 設計, 雑談 | 意外と画面が狭いぞ!ネットブック はコメントを受け付けていません

Expression Blend 3 のサンプルプロジェクト

訳あって Silverlight の機能を網羅的に調べているので、そのお裾分け。
「Expression Blend 3 にはデモプロジェクトが付いているので、見てね~」と言っていたのは、MSの大西さんだったか?なのですが、ネットを見ても情報がないので晒しておきます。

# Blend 3 の試用版を入れれば見れると思うのだけど、「インストール」という高い敷居があるからね。

Blend 3 のサンプルプロジェクトは、7つあります。

<001>
20100219_01

・ShowboardSketch
・PCGameingSketch

の2つは、Blend 3 から導入されたスケッチフローという機能のサンプルです。
スケッチフローは、簡単にいえば、Web サイトの構想を紙に書く変わりに、電子的に書く、というものです。紙で書いたものをスキャナで取り込んだり、鉛筆で書いたようなスタイルのボタンやリストボックスが用意されています。

Expression Blend 3+SketchFlowを使ってみた
http://www.atmarkit.co.jp/fwcr/design/tool/expressionblend3/03.html

なところを参照してください。

■Zune3D

携帯電話のデザインを変えられるサイトのデモです。
flash を使って商品で色を変えたり、柄を変えたりするパターンですね。

<002>
20100219_02

<003>
20100219_03

■Wall3D

写真を閲覧できるサイトのサンプルです。
ajax を使って、3Dやポラロイド風に写真を並べられますが、それと同じパターンです。

<004>
20100219_04

<005>
20100219_05

■SnowboardSketch

商品サイトのスケッチフローです。
手書き風のフォントと手書き風のボタンを配置して、「制作途中」を演出します。
かつて、mac のインターフェースに、そういうアイデアがあったのですが、それと似たようなものです。

<006>
20100219_06

<007>
20100219_07

日本語の場合は、みかちゃんフォントなどを使うと、フォントも含めて手書き風をアレンジできますよ。

みかちゃんフォント
http://www001.upp.so-net.ne.jp/mikachan/

SketchFlow は専用のビューアやブラウザで表示できます。

■PCGameingSketch

WEBサイトではなくて、ゲーム作成途中のバージョン別によるスケッチです。
画面切り替えがあるアプリケーションは、ボタンをクリックして次の画面へ、なんてことができるので紙芝居が楽にできますね。

<008>
20100219_08

<009>
20100219_09

Visio や、VB 6.0、Excel で作ったりしますね。
画面遷移ができるので、私は VB6 をよく使っていました。

■PCGaming

WEBサイトのサンプルです。先ほどの、スケッチを利用して作った、という想定です。

<010>
20100219_10

<011>
20100219_11

■ColorSwatchSL

flash や ajax でも作れる、カラーチャートのサンプルです。

<012>
20100219_12

<013>
20100219_13

■BeeHive

Blend 3 で作ったブロック崩しです。
「Blend 3 のみで作れる」という謳い文句になっていますが、内部ではコードビハイドというC#のコードがぎっしり詰まっています。なので、これだと、素直に C# で作ったほうが楽そうですね。

ただし、ちょっとしたイベントや計算などを、プログラマが提供して、デザイナが使うってことができます。実は、ボタンのbluer機能なんかは、C# のライブラリとして提供されています。

<014>
20100219_14

<015>
20100219_15

ちなみに、BeeHive のブロックやバーは、画像ファイルです。。。どうせならば、xaml で作って欲しかった。

あと、Blend は、Adoble の Photoshop、Illuastratorのデータをインポートできます。このあたりは便利ですね。
ちなみに、ドロー系のIllustrator の代替としては、Expression Desine が用意されていますが、ペイント系のPhotoshop の 代替は

Graphic Designer
http://www.microsoft.com/products/expression/ja/graphic_designer/gd_features.mspx

みたいですね。Expression Studio 3 には、Desiner というドロー系のアプリが入っているのですが、Graphic Desinger とは別ものなのかな?
こんなわけで、Blend 3 に入っているサンプルプロジェクトの一覧にでも。

カテゴリー: 開発 | Expression Blend 3 のサンプルプロジェクト はコメントを受け付けていません

GNUstepでobjective-cを学ぶ(4)

objective-cを使うと、「id」という型がよく使われます。どうやら、smalltalkがそうらしいのですが、メソッド(あるいはメッセージ)を実行時にチェックしているために、このid型が使われます。
所謂、voidポインタのように使えるわけですが、objective-cのnilポインタ(NULLポインタのようなもの)に対してメソッド呼び出しをしても、「何も起こらない」という特徴があります。

ええとですね。C++やJavaとobjetive-cのメソッド呼び出し方が違うんですね。

C++の場合は、vtbl構造体に配置されている関数ポインタを直接呼び出します。
つまり。

obj->func( ... );

な形になるわけです。

ですが、objective-c の場合は、次のように「func」という関数名を探し出した後に、メソッド呼び出しをするんですね。

Func *func = obj->seekMethod( "func" );
if ( func != NULL ) {
 func( ... );
}

当然、実行時にはC++やJavaのほうが早いのですが(更にC言語の呼び出しのほうがアセンブラ的には早い。単純な call 命令だからね)、まぁ、色々便利な機能ではあるのです。

C#では「デリゲート」という機能がありますが、これは、主として windows gui のイベント駆動をうまく動かすための仕組みです。デリゲートがない場合は、java ではリスナー、C++ では関数ポインタなどが使われます。

いわゆる、インターフェースを定義して呼び出す、というリスナーパターンです。

// インターフェースを定義する
class Listener {
public:
 void func( void );
};
// 実装クラス
class Window : public Listener {
 void func( void ) {
  ...
 }
}

int main( void )
{
 Listener *win = new Window();
 // ここで func メソッドを呼ぶ
 win->func();
}

C++ の場合は、もっと直接的に、関数ポインタを使う方法もあります。

class Window {
 void func( void ) {
  g_func();
 }
}

// グローバルな関数
static void g_func( void ) {
 ...
}

int main( void )
{
 Window *win = new Window();
 // ここで func メソッドを呼ぶ
 win->func();
}

長い前置きでしたが、これからが本題。
オブジェクト指向の便利なところは、クラス(カテゴリ)に分けておいて、同じメソッド名を使えるというところです。文法でいえば、メソッドが「動詞」で、オブジェクトが「主格」あるいは「目的格」ですね(このあたり、昔から議論がありますが、省きます)。

なので、A クラスと B クラスという2つのクラスに、同じ print というメソッドを使うと、

A a;
B b;

a.print();
b.print();

のような形で、同じメソッド名を使えます。この print メソッドは、基底クラスから継承するようにして、

class Base {
public:
 void print( void );
}
class A : public Base {
public:
 void print( void ) {
  ...
 }
};
class B : public Base {
public:
 void print( void ) {
  ...
 }
};

のように定義しておいて、実行時に切り替えることが可能なのです。

Base *a = new A();
Base *b = new B();

a->print();
b->print();

これは、それぞれの print メソッドが呼び出されます。これはリスナーパターンの基本ですね。

さて、このインターフェースの機能ですが、メソッド名に制約を付ける、という恩恵があるのですが、逆に言えば「基底クラス/インターフェースにあらかじめ、メソッドを用意しないといけない」という制限があります。
当たり前と言えば、当たり前なのですが、インターフェースにを作成するときに「未来の機能を予測しないといけない」というジレンマが発生します。このために、基底クラスが膨大になってしまったり、やたらに仮想関数の多いクラスが作成されてしまいます。
# 残念ながら、デリゲートも同じ制限があります。

残念ながら、我々は予知力がありません(笑)ので、これから作成されるサブクラスの機能を完全に予測することはできません。つまり、同時期に作ればよいのですが、数年後に拡張される機能を、基底クラスに盛り込むことは不可能なのです。

そこで、objective-c の(一見すると)不思議なメソッド呼び出しが功を奏します。

@interface A
- (void)print ;
@end
@implementation A
- (void)print {
 ...
}
@end

@interface B
- (void)print ;
@end
@implementation B
- (void)print {
 ...
}
@end

のように基底クラスを「共有しない」で定義しておいて、id 型で受けます。

id a = [A new];
id b = [B new];

[a print];
[b print];

こういう風にすると、まるで「あらかじめメソッド定義している」ように見えるんですね。
まぁ、コンパイル時にチェックが入らないので、インターフェースを使った型の厳密性は損なわれるのですが、あたかもRubyのようにメソッドが追加できるのが面白いです。

と言う訳で、基底クラスを使わないリスナーパターンということで。サンプルを晒しておきます。

#import <stdio.h>
#import <Foundation/Foundation.h>
#import <Foundation/NSObject.h>

@interface A : NSObject
- (void)print ;
- (void)printX:(int)x ;
@end

@interface B : NSObject
- (void)print ;
- (void)printX:(int)x y:(int)y ;
@end

@implementation A
- (void)print {
 printf("in class A\n");
}

- (void)printX:(int)x {
 printf("in print A: %d\n", x );
}
@end

@implementation B
- (void)print {
 printf("in class B\n");
}
- (void)printX:(int)x y:(int)y {
 printf("in print B: %d %d\n", x, y );
}
@end

id CreateObject( int type )
{
 id obj ;
 switch ( type ) {
 case 0:
  obj = [A new];
  break;
 case 1:
  obj = [B new];
  break;
 default:
  obj = nil;
 }
 return obj;
}

int main( void )
{
 printf("hello4.m\n" );
 
 A *a = [A new];
 [a print];
 [a printX:10];
 [a release];

 id x = [A new];
 [x print];
 [x printX:10];
 [x release];
 // 同じidを使える
 x = [B new];
 [x print];
 [x printX:10 y:20];
 [x release];
 
 // こんなこともできる
 x = CreateObject(0);
 [x print];
 [x release];
 x = CreateObject(1);
 [x print];
// [x printX:10]; // 間違えてもコンパイルエラーにならない。
 [x printX:10 y:20];
 [x release];
 
 // nilに対しては何も反応しない
 x = CreateObject(10); // nil を返す場合
 [x print];
 [x release];
 
 return 1;
}
/**
実行結果

hello4.m
in class A
in print A: 10
in class A
in print A: 10
in class B
in print B: 10 20
in class A
in class B
in print B: 10 20
**/
カテゴリー: 開発 | GNUstepでobjective-cを学ぶ(4) はコメントを受け付けていません

Silverlight Sample Browser

Home – Silverlight SDK Sample Browser
http://samples.msdn.microsoft.com/Silverlight/SampleBrowser/#/?sref=HomePage
Silverlight
http://msdn.microsoft.com/ja-jp/library/cc838158(VS.95).aspx
Silverlight SDK
http://blogs.msdn.com/silverlight_sdk/
ダウンロードの詳細 : Silverlight 3 ドキュメント
http://www.microsoft.com/downloads/details.aspx?FamilyID=0a9773a7-c854-41fa-b73d-535abfb73baf&displaylang=ja
Silverlight ダウンロード
http://msdn.microsoft.com/ja-jp/silverlight/bb187452.aspx

備忘録的に、Silverlightのドキュメントを記録しておきます。
Silverlight 4 がベータ版が出てきているので、
http://msdn.microsoft.com/ja-jp/silverlight/bb187452.aspx

近々変わるとは思うのですが、まぁ一応。

~~

microsoft社の戦略はさておき、私としては、flashに代替するものになるか?がポイントですね。.NET Framework でプログラミングできるのも魅力的なのですが、巷の flash アニメーションやメニュー操作、異なったところでは Curl に匹敵するものができないと、「機能が実現できない」という本末転倒なことになります。

silverlight の場合、ブラウザ上で動作するにせよ、最初はインストールが必要です。ただし、flash を動かす場合にも最初のインストールが必要なので、あまり障壁になりません。

flash からの代替ポイントは次なものです。

・手軽に動的なチャート/グラフが書けるか?
・手軽に flash アニメーションが作成できるか(トップ画面のCMみたいなの)
・プログラマがデザイナの力を借りられるか?

なところです。基本、flash のプログラミングは actionscript を使うところもあるのですが、デザイナが一人で作るものが多いのです。なので、silverlight のような、プログラマ主導のものを、デザイナが受け付けるか?デザイナと共同作業ができるか? がプロジェクト単位では重要になります。

となれば、flash で作れるような、アニメーション効果やチャートが、手軽にできるのか。手軽じゃなくてもいいけど、デザインセンスが発揮できるもの、デザインの作業を妨げないようにできるか、がポイントになりますね。

チャートに関しては、silverlight SDK ブログを見ると
http://blogs.msdn.com/silverlight_sdk/archive/2009/12/07/getting-started-with-the-charting-controls.aspx

円グラフ等が加わっています。デモを見る限り、それなりに揃っているようですが、flash の代替とするならば、google analytics のマイレポートのように、マウスでポイントしたところにメッセージを出す機能を「標準で」欲しいところです。
# まあ、そのあたりは売り物に期待するっていのもアリなんですが。

flash アニメーションについては、Expression Blend を使うのでしょうが、ここの情報が不足し過ぎています。flash アニメーションの書籍は多いのですが、Blend で作るアニメーションの書籍は皆無です。基本は Blend のストリーボードを使えばいいのですが、その説明すら、公式のドキュメント以外には良いものが見当たりません。これでは、flash アニメーションの代替にはなりません。

そんな訳で、現段階では代替するのは無理、と思うのですが如何でしょう?

~~

「代替しない」という方法もあるんですけど、どうなんでしょうねぇ?
トップ画面のアニメーション/ナビゲーションは flash で作って、内部の業務的なものを silverlight で作るとか?

カテゴリー: 開発 | Silverlight Sample Browser はコメントを受け付けていません

Zaku認識(2)

前回のZaku認識(1)の続きです。
http://www.moonmile.net/blog/archives/576

物体/動体認識をするときに、白黒を使うことが多いのですが、残念ながら、これでは「シャアザク」と「ザク」の区別がつきません。何故、この2つを区別しなければいけないのか、、、は脇に置いて、区別できる方法で、認識をさせます。

RGB(赤/緑/青)の3値から、白黒画像を作る場合は、YCbCr(YIQ)画像に変換して、Y値だけ残します。

まず、次の画像を見てください。

<001>
20100208_001

真ん中にあるガンダムの左上にシャアがいますね。
これをグレー色調にすると、

<002>
20100208_002

こんな風に、シャアがザクに隠れてしまいます。
これでは、シャアザクだけを攻撃することはできませんね(笑)。

そんな訳で、YIQからHSV表示に変換して、H値(色相)だけ残します。

<003>
20100208_003

サーモグラフィのような画像になりますが、シャアザクの位置が、なんとなくわかります。

同様に次の3つを見比べると、ガンダムの右にシャアがいそうな感じ、ってくぐらいは分かります。

<004>
20100208_004

<005>
20100208_005

<006>
20100208_006

色が単純化されるのは、色相のみ残して、輝度、彩度を一定値にしているからです。
これを使うと、緑の量産ザクと、赤のシャアザクが区別できるんですね。
グレーの場合は、赤緑色盲と一緒で、輝度が同じなので区別がつきません。

RGB/YIQ/HSV表示の相互変換は、こちら

namespace zaku.monoeye
{
 // RGB表示系クラス
 // r: 赤
 // g: 緑
 // b: 青
 public class RGB
 {
  public double r;
  public double g;
  public double b;
  
  public RGB()
  {
   r = g = b = 0;
  }

        // 正規化されたRGB値(0.0-1.0)
  public RGB( double r, double g, double b )
  {
   this.r = r;
   this.g = g;
   this.b = b;
  }
        // ディスプレイのRGB値(0-255)
        public RGB(Color col)
        {
            this.r = ((double)col.R) / 255.0;
            this.g = ((double)col.G) / 255.0;
            this.b = ((double)col.B) / 255.0;
        }

        public Color ToColor()
        {
            int r, g, b;
            r = (int)(this.r * 255);
            g = (int)(this.g * 255);
            b = (int)(this.b * 255);
         if ( r < 0 ) r = 0;
         if ( g < 0 ) g = 0;
         if ( b < 0 ) b = 0;
            if (r > 255) r = 255;
            if (g > 255) g = 255;
            if (b > 255) b = 255;

            Color col = Color.FromArgb(255, r, g, b );
            return col;
        }

  
  public YIQ ToYIQ()
  {
   YIQ yiq = new YIQ(
    0.2990 * r + 0.5870 * g + 0.1140 * b,
    0.5959 * r - 0.2750 * g - 0.3210 * b,
    0.2065 * r - 0.4969 * g + 0.2904 * b );
   
   return yiq;
  }
 }
 
 // YIQ表示系クラス
 // y: 輝度
 // i: 青み成分
 // q: 赤み成分
 public class YIQ
 {
  public double y;
  public double i;
  public double q;
  
  public YIQ()
  {
   y = i = q = 0.0;
  }
  public YIQ( double y, double i, double q )
  {
   this.y = y;
   this.i = i;
   this.q = q;
  }
  
  public RGB ToRGB()
  {
   RGB rgb = new RGB(
    1.001 * y + 0.955 * i + 0.622 * q,
    0.999 * y - 0.272 * i - 0.648 * q,
    1.004 * y - 1.106 * i + 1.704 * q );
   return rgb;
  }
  public HSV ToHSV()
  {
   HSV hsv = new HSV();
            hsv.h = Math.Atan2(i, q);
            hsv.s = Math.Sqrt(i * i + q * q);
   hsv.v = y;
            return hsv;
  }
 }
 
 // HSV表示系クラス
 // h: 色相
 // s: 彩度
 // v: 輝度
 public class HSV
 {
  public double h;
  public double s;
  public double v;
  
  public HSV()
  {
   h = s = v = 0.0;
  }
  public HSV( double h, double s, double v )
  {
   this.h = h;
   this.s = s;
   this.v = v;
  }
  public YIQ ToYIQ()
  {
   YIQ yiq = new YIQ();
   yiq.y = v;
   yiq.i = s * Math.Sin( h );
            yiq.q = s * Math.Cos(h);
            return yiq;
  }
 }
}

次回は、背景から動体抽出ですね~。

カテゴリー: 雑談 | Zaku認識(2) はコメントを受け付けていません