aspxのインライン式がどうしても覚えられない。。。

どうしても覚えられないので本からの抜粋。

表記 種類 意味
<% ~ %> 埋め込みコードブロック 任意のコードを記述可能
<%= ~ %> 式表示 式の値を表示する
<%:= ~ %> 式表示(HTMLエンコード付) 式の値をHTMLエンコードして表示する
<%@ ~ %> ディレクティブ ページの設定を行う
<%# ~ %> データバインディング データバインドを行う
<%#: ~ %> データバインディング データバインドを行う。値はHTMLエンコードする
<%$ ~ %> 式ビルダー アプリケーション構成などの値を取得する
<%-- ~ --%> サーバー側コメントブロック コメント

式ビルダーではアプリケーション構成ファイルのappSettings要素とconnectionStrings要素、リソースファイルを参照することが可能らしい。
それぞれプレフィックスはAppSettings、ConnectionStrings、Resources。<%$ ConnectionStrings:dafaultConnection %>のような感じ。

RIAアーキテクチャ研究会 第5回勉強会参加メモ

僕自身はまだXAMLデビューしてないのにRIAアーキテクチャ研究会の勉強会に参加しました。
最大の目的は尾上さんのセッションを聴くことでした。

  • Blendの便利機能振り返り 大田一希さん

RIAアーキテクチャ研究会第五回セミナーで発表してきました
最初はVisual StudioXAML編集画面でできることの説明とデモ、続いてBlendを使うとさらにできることの説明とデモでした。XAML初心者の僕としてはすべて「ほ~、そんなことできるのか」と感心するばかりの内容でした。

ただし、当然ながら自分で実際に体験して使えるようにならないと意味がありません。
これからXAMLデビューするので実際に体験します。ちょっとだけVisual StudioXAMLを使った画面の編集を触ってみた感触としては「ものすごく柔らかい」というものでした。お絵かきをしているくらいの柔軟性があるので、Windows Formしか触ったことない人間としては慣れるまで大変そうだな、というのが率直な感想です。

  • XAML/C#を使ったWindowsストアアプリ(LOB)構築TIPS 鈴木章太郎さん

スライド
すみません、ちょっと消化不良で認識違いがあるかもしれません。もっとも認識違いはこのセッションに限ったことではありませんが。

メインはPatterns & Practices の「Kona」というプロジェクトの説明でした。
Prismというプロジェクトがありますが、これはストアアプリ向けではなく、その点ではKonaプロジェクトを勉強したほうがよいらしいです。
Konaも巨大なプロジェクトで、どのあたりでどんなことをやっているかの概説をしていただきました。

さらに詳しい説明をCommunity Open Dayでしてくださるそうです。それまでにスライドを再読してソースをダウンロードして自分なりに調べてからまた鈴木さんのセッションを聴きたいです。

注意点としては、(そのうち修正されるかもしれませんが)Konaプロジェクトのダウンロードページからexeをダウンロードすると解凍に失敗するかもしれないので、その場合はソースコードタブのダウンロードでZIP形式でダウンロードすればよい、ということでした。

  • WindowsストアアプリでのMVVM・MVPVMパターン 児玉宏之さん

グリッドアプリケーションを中心に、そのような構成になっていてどのように動くかを基本から、概略とかHow to的にではなく仕組みといった面を説明していただきました。これも自分で実際にやってみなければなりません。

「関心事を分離する一刀一刀が設計パターン」
とこれだけ書くと「うまいこと言うなぁ」と感心するだけで終わってしまいますが、尾上さんのセッションからはこの言葉にだどり着くまでにいろんなところにぶつかったりした体験だったり議論だったり頭を振り絞って考えたりした経験を通過してきた迫力というかエネルギーというか、なんかそんなものが伝わってきて、すごく感動します。

勿論セッションから学ぶことも沢山あります。僕としては特にDomain Logic Patternの議論のところは、いつも悩むところでもあり、いつも妥協してしまったりするところで勉強になります。僕が勘違いしていたもの部分もありました。が、やはりそれよりも、自分の設計について見よう見まねだったり安易な妥協だったりしないでもっと自分の頭で考えて、理由のある納得できるものにしなさいというメッセージが強く伝わってきます。

やはり聴きに来てよかった。

  • その他

予定してなかったけど懇親会がありました。
予定してなかったのでお金が足りるか不安だったけど一次会は何とかなりました。とても楽しくて、本当に「懇親会も含めて勉強会」ということを実感しました。
「 if(財布.IsEmpty) { 家に帰る(); }」に従い、2次会は不参加でした。

VC++2012で.NET2.0のクラスライブラリを作ると

VC++2012で.NET2.0用のクラスライブラリを作ろうと思いました。

なのでプロジェクトを作るときに.NET2.0を選択します。
C++のプラットフォームツールセットは「Visual Studio 2012」です。一部でもC++11が使いたいからです。)

プロジェクト生成後、外部依存関係を確認すると
・mscorlib.dll
・System.Data.dll
・System.dll
・System.xml.dll
への参照があり、これは.NET2.0のものです。


が、しかし実際に参照されているモジュールは

のように.NET4.0のmscorlibと.NET2.0のmscorlibです。
この状態では、このクラスライブラリを.NET2.0のプロジェクトから参照して使うことはできません。.NET2.0からでも使えるようにプロジェクトを.NET2.0にしたのにこれでは使えません。

なにか解決方法はないものか?
プラットフォームツールセットを「Visual Studio 2008」にするしかないのか?
C++11は使えないということか。

プロジェクトを.NET2.0にした状態でも、をインクルードすると、プラットフォームツールセットが「Visual Studio 2012」または「Visual Studio 2010」であれば外部依存関係にしっかり.NET4.0のmscorlibが現れやがります。

上が2.0のmscorlib、下が4.0のmscorlibです。

激しく残念です。
結局VC++2012のコンパイラを使う場合は.NET4.0(または4.5)にするしかない、と。

Visual Studio 2012とWinDbgの統合

かなり遅くなりましたがVisual Studio 2012とWinDbgの統合を試してみました。
といっても単にWDK 8をインストールだけですが。

WDKをインストールする前はデバッガとして選択できるのは以下のようになっていました。

インストールすると次のように増えます。

実際に"Debbuging Tools for Windows"を選択すればWinDbgデバッグしている状態になるようです。

F5を押してデバッグ開始。

ブレークポイントはVS上で張れるのでbpコマンドを使うする必要はありません。
もちろんコマンドは使えます。
素晴らしいのはWinDbgコマンドでインテリセンスが効くことです。

また、Crush Dumpを開くメニューが追加され、WinDbgでクラッシュダンプを解析するのと同じことがVSでできるようになります。

WinDbgを直接立ち上げることなくVSでできるので便利になりました。

Default template arguments for function templatesを試す

November CTP of the C++ compilerのお試しの最後です。
Default template arguments for function templatesを使ってみます。
といっても「C++ Primer 第5版」のサンプルが簡単でわかりやすいのでそのまま入力です。

template <typename T, typename F = std::less<T>>
int compare(const T &v1, const T &v2, F f = F())
{
    if(f(v1, v2)) return -1;
    if(f(v2, v1)) return 1;
    return 0;
}
int main()
{
    int compResult = compare(0, 42);
    std::cout << comp << std::endl;
    return 0;
}

これがVC++のNovember CTPでもコンパイルできるようになります。
VC++2012の標準のコンパイラですと

error C4519: 既定のテンプレートの引数をクラスのテンプレート以外で使用することはできません

というエラーになります。

Visual C++2012でExplicit conversion operatorsを試す

VC++2012のNovember CTP of the C++ compilerお試しその4。
Explicit conversion operatorsを試します。
というか、「Explicit conversion operators」ってどんな機能なのよ?
そのままの意味でconversion operatorsをexplicitにできるということでよいのかしら。

#include <iostream>

class Int
{
	int value_;
public:
	explicit Int(int val = 0) : value_(val) {};
	int value() const { return value_; }
	explicit operator int() const { std::cout << "operator int" << std::endl; return value_; }
	operator double() const { std::cout << "operator double" << std::endl; return value_; }
};

void printi(int val) { std::cout << val << std::endl; }
void printd(double val) { std::cout << val << std::endl; }

int main()
{
	Int a(1);
	//printi(a);  // explicitなのでInt → intの暗黙変換できません。
	printi(static_cast<int>(a));
	printd(a);  // Int → doubleの暗黙変換は可能
	return 0;
}

Int → intの変換はexplicitをつけてあるので暗黙変換はできず、Int → doubleの変換はexplicitをつけてないので暗黙変換可能です。
同様のことをC#でやると以下。

class Int
{
	public Int(int val) { value_ = val; }
	public static explicit operator int(Int val)
	{
		Console.WriteLine("operator int");
		return val.value_;
	}
	public static implicit operator double(Int val)
	{
		Console.WriteLine("operator double");
		return val.value_;
	}
	private int value_;
}
class Program
{
	static void printi(int val) { Console.WriteLine(val); }
	static void printd(double val) { Console.WriteLine(val); }
	static void Main(string[] args)
	{
		var val = new Int(1);
		//printi(val);	// Int → intは暗黙変換できません。
		printi((int)val);
		printd(val); // Int → doubleの暗黙変換は可能
	}
}

Visual C++2012でDelegating constructorsを試す

VC++2012のNovember CTP of the C++ compilerお試しその3。
Delegating constructorsを試しましょう。

#include "stdafx.h"
#include <iostream>
#include <string>

class Test
{
	int data_;
	std::string msg_;
public:
	Test() : Test(123)
	{
		std::cout << "Test()" << std::endl;
	}
	Test(const char* pMsg) : Test(123, pMsg)
	{
		std::cout << "Test(const char* pMsg) " << pMsg << std::endl;
	}
	Test(int val, const char* pMsg = "data") : data_(val), msg_(pMsg)
	{
		std::cout << "Test(int val, const char* pMsg) "  << val << ',' << pMsg<< std::endl;
	}
	int getData() const { return data_; }
	const std::string getMsg() const { return msg_; }
	void disp() const
	{
		std::cout << getMsg() << ":"  << getData() << std::endl;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	Test t1, t2("value"), t3(999), t4(111, "test");
	t1.disp();
	t2.disp();
	t3.disp();
	t4.disp();
}

で、

Test(int val, const char* pMsg) 123,data
Test()
Test(int val, const char* pMsg) 123,value
Test(const char* pMsg) value
Test(int val, const char* pMsg) 999,data
Test(int val, const char* pMsg) 111,test
data:123
value:123
data:999
test:111

と表示されます。

これも残念なことにIDE上はDelegating constructorの部分にエラーマークがでます。
実際には問題なくビルド可能です。

追記

class TestのコンストラクタをexplicitにするとVCではコンパイルエラーになります。

explicit Test() : Test(123) { /* 中身は変更なし */ }
explicit Test(const char* pMsg) : Test(123, pMsg) { /* 中身は変更なし */ }
explicit Test(int val, const char* pMsg = "data") : data_(val), msg_(pMsg) { /* 中身は変更なし */ }

error C2664: 'Test::Test(const Test &)' : cannot convert parameter 2 from 'int' to 'const Test &'
error C2660: 'Test::Test' : function does not take 2 arguments

なぜダメなの?