SqlBulkCopy では、Decimal 型で桁落ちをする

SqlBulkCopy のスピードは 20 倍ぐらい早い | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/2234

なところで、SQL Server へのインサートを高速化したのですが、実はちょっとした落とし穴があります(落とし穴、というよりも「仕様」っぽいのですが)。

SQL Server で Decimal 型を使うと、Oracle の nameric 型のように精度を指定できます。たとえば decimal(18,4) と設定すると、小数点以下第4桁までの精度になります。

この場合、「0.12345」という値を入れようとすると、クエリでは「0.1235」のように最後の桁で四捨五入されるのですが、SqlBulkCopy を使うと「0.1234」のように切り捨てになる、という違いがあります。

CREATE TABLE [dbo].[t_dec](
	[dec] [decimal](18, 4) NULL,
	[dbl] [float] NULL
) ON [PRIMARY]

のようにテーブルを作成しておいて、データベースに書き込みます。

''' <summary>
''' BulkCopy で書き込み
''' </summary>
''' <param name=&quot;sender&quot;></param>
''' <param name=&quot;e&quot;></param>
''' <remarks></remarks>
Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click

	Dim dec As Decimal = 0.1234567890123456789012345679D
	Dim dbl As Decimal = 0.12345678901234559
	Dim dt As New DataTable

	dt.Columns.Add(&quot;dec&quot;, GetType(Decimal))
	dt.Columns.Add(&quot;dbl&quot;, GetType(Double))
	Dim row As DataRow = dt.NewRow
	row(&quot;dec&quot;) = dec
	row(&quot;dbl&quot;) = dbl
	dt.Rows.Add(row)

	Dim cn As New SqlConnection(CNSTR)
	Dim bc As New SqlBulkCopy(cn)
	cn.Open()
	bc.DestinationTableName = &quot;t_dec&quot;
	bc.WriteToServer(dt)
	cn.Close()
	bc.Close()

	' decimal(18,4) で指定していると、dec = 0.1234 となり切り捨てとなる

	Dim dt2 As New DataTable
	Dim da As New SqlDataAdapter(&quot;SELECT * FROM t_dec&quot;, cn)
	da.Fill(dt2)
	DataGridView1.DataSource = dt2


End Sub

''' <summary>
''' SqlCommand で書き込み
''' </summary>
''' <param name=&quot;sender&quot;></param>
''' <param name=&quot;e&quot;></param>
''' <remarks></remarks>
Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click

	Dim dec As Decimal = 0.1234567890123456789012345679D
	Dim dbl As Decimal = 0.12345678901234559

	Dim cn As New SqlConnection(CNSTR)
	Dim cmd As New SqlCommand(&quot;INSERT INTO t_dec values ( @DEC, @DBL )&quot;, cn)
	cmd.Parameters.Add(New SqlParameter(&quot;@DEC&quot;, dec))
	cmd.Parameters.Add(New SqlParameter(&quot;@DBL&quot;, dbl))

	cn.Open()
	cmd.ExecuteNonQuery()
	cn.Close()

	' decimal(18,4) で指定していると、dec = 0.1235 となり四捨五入される

	Dim dt2 As New DataTable
	Dim da As New SqlDataAdapter(&quot;SELECT * FROM t_dec&quot;, cn)
	da.Fill(dt2)
	DataGridView1.DataSource = dt2
End Sub

こうすると、SqlCommand の場合は「0.1235」のように四捨五入されるのですが、SqlBulkCopy の場合は「0.1234」のように切り捨てられます。

なので、仕方がないので(?)、四捨五入されるように「0.00005D」を加算します(末尾の「D」は、decimal 型の印です)

''' <summary>
''' decimal の精度に合わせて 0.00005 を加算する
''' </summary>
''' <param name=&quot;sender&quot;></param>
''' <param name=&quot;e&quot;></param>
''' <remarks></remarks>
Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click

	Dim dec As Decimal = 0.1234567890123456789012345679D
	Dim dbl As Decimal = 0.12345678901234559
	Dim dt As New DataTable

	dt.Columns.Add(&quot;dec&quot;, GetType(Decimal))
	dt.Columns.Add(&quot;dbl&quot;, GetType(Double))
	Dim row As DataRow = dt.NewRow
	row(&quot;dec&quot;) = dec + 0.00005D	' 四捨五入させる
	row(&quot;dbl&quot;) = dbl
	dt.Rows.Add(row)

	Dim cn As New SqlConnection(CNSTR)
	Dim bc As New SqlBulkCopy(cn)
	cn.Open()
	bc.DestinationTableName = &quot;t_dec&quot;
	bc.WriteToServer(dt)
	cn.Close()
	bc.Close()

	' BulkCopy だと切り捨てになるので、
	' decimal(18,4) の場合は 0.00005D を加えて、
	' dec = 0.1235 のように四捨五入にする

	Dim dt2 As New DataTable
	Dim da As New SqlDataAdapter(&quot;SELECT * FROM t_dec&quot;, cn)
	da.Fill(dt2)
	DataGridView1.DataSource = dt2

End Sub

さて、これを組み込みかどうかを思案中。

カテゴリー: 開発, VB | SqlBulkCopy では、Decimal 型で桁落ちをする はコメントを受け付けていません

データベースアクセスのパフォーマンスチューニング例

2000件のデータ登録で2時間程掛かっている処理を、10分程度に短縮する方法を紹介…ができたらいいなぁ。ってのを、考察も交えて紹介します。

■擬似コード

・20回ほどの SELECT 文が呼び出されている(らしい)。
・1件のデータ登録で、20件のデータ挿入がある。

for i = 1 to 2000 
	
	何かと SELECT 処理がある。
	前の SELECT の結果を利用して、次のパラメータとする...らしい。
	時には if 文などがある。
	SELECT1
	SELECT2
	...
	SELECT20

	帳票用のテーブルから該当レコードを DELETE する。
	DELETE1
	DELETE2
	...
	DELETE20

	帳票用のテーブルに 20 件データ出力する
	INSERT1
	INSERT2
	...
	INSERT20
next

この1回のループが4秒ぐらいなので、4秒×2000回 = 8000秒 ≒ 2時間超 という具合。

■考えられる対策

1.
データベースに SELECT を何度も呼び出しているが、これが毎回 SqlCommand 呼出となっている。なので、毎回データベースに接続する手間が掛かっているのでは?これを、できれば一回の SqlCommand 呼出にする。ただし、SELECT1 から SELECT20 までの間は if 文が入ったり、動的に SQL 文を作っていたりするので、必ずしもひとつにまとめられるとは限らない。
出来る限り、まとまることにする。

2.
帳票テーブルに関しては、DELETE のあとに INSERT している。INSERT を単独で呼び出すと遅くなるので(総計4万件になる)SqlBulkCopy を使って一括挿入する。

3.
その前に DELETE を何度も呼び出しているが、これは無駄なので、該当する ID をまとめるなどして1回だけの DELETE 呼出にする。

4.
実は、所々 DataTable を使っているので VB 側の処理が重たくなっている可能性もある。このあたりは、実測した後に、どちらのチューニングに重きをおくのか?あるは、アクセスチューニングによって、どのくらいの効果が見込めるのか、をあらかじめ考察しておく。

■実験用テーブル

プロジェクト案件テーブル
 親子の案件があるので、親案件(parent_id)が自分自身を示す。
 (これが今回の SQL を複雑にしている原因でもあるので、実験テーブルにいれておく)

CREATE TABLE [dbo].[t_anken](
	[id] [int] NOT NULL,
	[name] [varchar](50) NOT NULL,
	[parent_id] [int] NULL,
	[userid] [varchar](10) NOT NULL,
	[updatedate] [datetime] NOT NULL
) ON [PRIMARY]

出力用の帳票テーブル

CREATE TABLE [dbo].[t_report](
	[id] [int] NOT NULL,
	[name] [varchar](50) NOT NULL,
	[data] [varchar](500) NOT NULL,
	[userid] [varchar](10) NOT NULL,
	[updatedate] [datetime] NOT NULL
) ON [PRIMARY]

■データ挿入用コード

20万件のデータ挿入は10秒弱ぐらいで終わります。

private string toMD5(string s)
{
	//文字列をbyte型配列に変換する
	byte[] data = System.Text.Encoding.UTF8.GetBytes(s);

	//MD5CryptoServiceProviderオブジェクトを作成
	System.Security.Cryptography.MD5CryptoServiceProvider md5 =
		new System.Security.Cryptography.MD5CryptoServiceProvider();
	//または、次のようにもできる
	//System.Security.Cryptography.MD5 md5 =
	//    System.Security.Cryptography.MD5.Create();

	//ハッシュ値を計算する
	byte[] bs = md5.ComputeHash(data);

	//byte型配列を16進数の文字列に変換
	System.Text.StringBuilder result = new System.Text.StringBuilder();
	return BitConverter.ToString(bs).ToLower().Replace(&quot;-&quot;, &quot;&quot;);
}

// 接続文字列
const string CNSTR =
	@&quot;Data Source=.\sqlexpress;Initial Catalog=stress;Integrated Security=True;Pooling=False&quot;;
const int ANKENMAX = 200000;

private void button1_Click(object sender, EventArgs e)
{
	SqlConnection cn = new SqlConnection(CNSTR);

	// テーブル内容を削除
	SqlCommand cmd = new SqlCommand();
	cmd.CommandText = 
		&quot;DELETE FROM t_anken \n&quot; + 
		&quot;DELETE FROM t_report&quot;;
	cmd.Connection = cn;
	cn.Open();
	cmd.ExecuteNonQuery();
	cn.Close();

	// データ作成
	SqlDataAdapter da = new SqlDataAdapter(&quot;SELECT * FROM t_anken WHERE 1 = 0&quot;, cn);
	DataTable dt = new DataTable();
	da.Fill(dt);
	for (int i = 0; i < ANKENMAX; i++)
	{
		DataRow row = dt.NewRow();
		row[&quot;id&quot;] = i;
		row[&quot;name&quot;] = toMD5(i.ToString() + DateTime.Now.ToString());
		row[&quot;parent_id&quot;] = DBNull.Value;
		row[&quot;userid&quot;] = &quot;masuda&quot;;
		row[&quot;updatedate&quot;] = DateTime.Now;
		dt.Rows.Add(row);
	}
	SqlBulkCopy bc = new SqlBulkCopy(cn);
	bc.DestinationTableName = &quot;t_anken&quot;;
	cn.Open();
	bc.WriteToServer(dt);
	cn.Close();
	bc.Close();

	MessageBox.Show(string.Format(&quot;t_anken に {0} 件データ挿入しました&quot;, ANKENMAX));
}

続きは明日以降で

カテゴリー: 開発, C# | データベースアクセスのパフォーマンスチューニング例 はコメントを受け付けていません

プチロボで4軸構成にしてみる

キーボードをぽちぽち打つのであれば、3軸でもいいような気もするのだが、土台に2軸、間接に1軸の3軸の自由度にだけだと指先がキーボードに届かなくて困るのでは?と思い、指先部分に1軸加える。

何で腕の部分を作ろうかと思案した挙句、そうだレゴがあるじゃないか、という具合で作ってみたのがこれ↓

手元にはレゴ(大)(苦笑)しかなくて、レゴ(大)で組み合わせてみたものの、レゴ(大)の重さがサーボには重すぎて…倒れてしまう、ってな感じで後でやり直すことにしよう。

写真を見ても分かる通り、一番向こうのキーに届かないし、腕(というか指の関節)を最大に伸ばした時にはコードが届かなそうだし。

ちなみに、両面テープでくっ付けたので、その後しばらくするとカタンと落ちてしまうのが悲しい。

カテゴリー: プチロボ | プチロボで4軸構成にしてみる はコメントを受け付けていません

プチロボ事始め

Amazon.co.jp: プチロボ改(ロボット素材キット): おもちゃ
http://www.amazon.co.jp/dp/B001IWNE0C/

amazon からプチロボが届いたので、サーボモータを繋げてみる。
2足ロボットを組み立てる予定はない(苦笑)なので、9個のサーボをどう組み合わせるかというと。

例えば、

■キーボードを打たせる

最初は、iPhone か iPad ですりすりさせる、というのを考えたいたのだが、このサーボにはフィードバックがないので(パソコンからの送信のみ)、スライドという動作が結構大変そうなことが判明。

なので、昔の万博で出ていたようなキーボードを打たせるところから始めようと思う。ロボットの腕を制御するときに3つの自由度があればよいのだが、サーボが動いたとき(あるいはモーター位置決めをしたとき)の後のフィードバックがないと、どこに腕を置いたのかがわからなくなる。

なので、

  1. 指を降ろす。
  2. キーが打てたかを、視覚的に確認する。

というフィードバックが必要になる。ある程度キーボードの配置を覚えれば、ブランドタッチ(って何がなんだか)が可能なのだが、初心者のうちはキートップの文字を見ながら指を降ろしていくことになる。この動作が、

  1. 視覚的に、キートップの印字を識別。
  2. 目的のキー目指して、指を降ろす。
  3. 目的のキーが押せるか判別する。

ってな、視覚的なフィードバックが必要になる。

視覚的な部分は通常の WEB カメラを使って、差分検出か最初はマーキングあたりで指先を検出。最終的にはキートップのマークをテンプレートマッチングさせて、未知のキーまで押せるように、かな。適当な学習器を挟み込んで、ローレゾの WEB カメラとサーボの誤差に対応させる予定。

カテゴリー: プチロボ | 4件のコメント

ComboBox の選択後のイベントは、TextChanged イベントで拾う

落とし穴、と言いますか、やっぱり ComboBox コントロールの落とし穴っぽい動きの話です。

■問題

単純にフォームに ComboBox コントロールを貼り付けて、項目を選択した直後のイベントを拾いたい。
さてどうするのか?

という要件があって、なんか手元のコードでは、SelectedIndexChanged イベントを拾っていた訳です。
SelectedIndexChanged イベントでも悪くはないのですが、ComboBox で項目を選択している途中のイベントも拾ってしまうので、【最後のイベントだけを拾う】ってのがなかなかでき難い、というか、これでバグっているので。

■イベントは4種類ある

あらためて ComboBox のイベントを見ると、それらしいものが4つほどあります。

・SelectedIndexChanged イベント:選択項目が変更されるたびに発生する
・SelectionChangeCommitted イベント:項目がコミットするタイミングで発生する
・DropDownClosed イベント:ドロップダウンのリストが、閉じられるタイミングで発生する
・TextChanged イベント:ComboBox のテキストが変更されるタイミングで発生する

■試行錯誤してみる

↓なコードを書いて、発生するイベントを見てみます。

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    Debug.Print("ComboBox1_SelectedIndexChanged")
End Sub

Private Sub ComboBox1_SelectionChangeCommitted(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectionChangeCommitted
    Debug.Print("ComboBox1_SelectionChangeCommitted")
End Sub

Private Sub ComboBox1_DropDownClosed(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.DropDownClosed
    Debug.Print("ComboBox1_DropDownClosed")
End Sub

Private Sub ComboBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged
    Debug.Print("ComboBox1_TextChanged")
End Sub

動かし方は、

・マウスで選択する。
・マウスでスクロールバーを動かす。
・キーボードでリストを選択する。
・リストを閉じたままで、キーボードで動かす。

のパターンがあります。

一見すると、SelectedIndexChanged イベントで良いような気もするのですが、リストを選択している途中もバシバシとイベントが発生するので駄目です。
マウスで動かしているときは発生しないのですが、キーボードの矢印キーで動かすと連続して発生します。

じゃあ、SelectionChangeCommitted でもいいのかな、と思っていると。
リストを閉じる時に、右にある▼をクリックすると、SelectionChangeCommitted イベントが発生しないという落とし穴…なんじゃそりゃ?状態なので、ちょっと使えません。

そうなると、DropDownClosed イベントでリストが閉じられるタイミングを拾えばよいのでは?と思うのですが、
きちんと▼を押して、リストから選択するときは良いのですが、リストを出さずに上下のカーソルキーで直接動かすときには、実は DropDownClosed イベントが発生しないのです。えぇ SelectionChangeCommitted イベントは発生するんですけどね。

そんな訳で、素直に TextChanged イベントを使うのが無難ですね…という結論でした。

ただ、TextChanged イベントの場合は、編集可能な ComboBox のときにはイベントがややこしいんですよね…悩ましい、という話

カテゴリー: 開発, VB | 4件のコメント

アリスの鞄は作った人を知っている

ちょっとアリスシリーズ風に書き下し。
要は、デバッグ用に呼び出し元のクラス名を取得したいのですが、デバッグ用なので new 時にインスタンスやクラス名を渡したくない、のですね。なので、呼び出されたクラス/メソッドのほうから、こっそりと StackFrame を使って、呼び出し元のクラス名を取得するという技です。

' 参考
' 自分自身のクラス名とメソッド名:Gushwell's C# Dev Notes
' http://gushwell.ldblog.jp/archives/50715142.html

Public Class Form1

	''' <summary>
	''' アリスを作成
	''' </summary>
	''' <param name=&quot;sender&quot;></param>
	''' <param name=&quot;e&quot;></param>
	''' <remarks></remarks>
	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

		Dim alice As New Alice
		alice.Check()

	End Sub

	''' <summary>
	''' ロリータを作成
	''' </summary>
	''' <param name=&quot;sender&quot;></param>
	''' <param name=&quot;e&quot;></param>
	''' <remarks></remarks>
	Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

		Dim lolita As New Lolita
		lolita.Check()

	End Sub
End Class

Public Class Person

	Protected _bag As Bag

	''' <summary>
	''' コンストラクタ
	''' </summary>
	''' <remarks></remarks>
	Public Sub New()
		' バッグを作成(作成者名はバッグの内部で保存される)
		_bag = New Bag
	End Sub
	''' <summary>
	''' 作成者を表示
	''' </summary>
	''' <remarks></remarks>
	Public Sub Check()
		MessageBox.Show(&quot;class in &quot; + _bag.GetClassName)
	End Sub

End Class

''' <summary>
''' アリスクラス
''' </summary>
''' <remarks></remarks>
Public Class Alice
	Inherits Person
End Class

''' <summary>
''' ロリータクラス
''' </summary>
''' <remarks></remarks>
Public Class Lolita
	Inherits Person
	' ※本来は、クラス名を渡すべき
	Public Sub New()
		_bag = New Bag(&quot;LOLITA&quot;)
	End Sub

End Class

Public Class Bag

	Protected _cname As String

	''' <summary>
	''' コンストラクタ
	''' </summary>
	''' <remarks></remarks>
	Public Sub New()

		Dim st As New StackTrace(False)
		' Bag -> Person -> Alice の順で 2 を指定する
		Dim sf As StackFrame = st.GetFrame(2)
		' 呼出元を保存しておく
		_cname = sf.GetMethod.ReflectedType.FullName

	End Sub

	''' <summary>
	''' 本来はクラス名を渡すべき
	''' </summary>
	''' <param name=&quot;cname&quot;></param>
	''' <remarks></remarks>
	Public Sub New(ByVal cname As String)
		_cname = cname
	End Sub

	''' <summary>
	''' 設定されているクラス名を取得
	''' </summary>
	''' <returns></returns>
	''' <remarks></remarks>
	Public Function GetClassName() As String
		Return _cname
	End Function
End Class

Alice クラス内で、new Bag をしています。この Bag を生成したのは誰か?というのは、本来ならば Alice のインスタンスか、クラス名を渡す、あるいは、Bag プロパティに設定する、ということをやる必要があるのですが、これをスタックフレームを使って呼び出し元のクラス名を取得するようにします。

Bag クラスのコンストラクタの部分が少しトリッキーなことになっています。

	Public Sub New()

		Dim st As New StackTrace(False)
		' Bag -> Person -> Alice の順で 2 を指定する
		Dim sf As StackFrame = st.GetFrame(2)
		' 呼出元を保存しておく
		_cname = sf.GetMethod.ReflectedType.FullName

	End Sub

StackTrace クラスでスタックトレースを取得した後、GetFrame メソッドで呼び出し元を取得します。このときに、スタックの状態が、Bag -> Person -> Alice になっているので「2」を指定しています。
間に Person クラスが挟まるのは、Alice クラスとの継承関係があるからです。なので、フォームからの呼び出しをチェックする場合も、Form クラスを継承していることを考慮にいれて、GetFrame メソッドに渡す値を調節しないといけません。ややこしいですね…というか、実装依存になるので、ピンポイントでしか使えない技です。なので、素直にクラス名を渡したほうがよさそうです。

こういう場合、XmlDocument クラスのようにファクトリーパターンを使います。コンストラクタにクラス名を渡すよりは自然かも。

Dim bag = Bag.CreateInstanceWithName("Lolita")
'あるいは
Dim bag As New Bag("Lolita")

■参考

自分自身のクラス名とメソッド名:Gushwell’s C# Dev Notes
http://gushwell.ldblog.jp/archives/50715142.html

カテゴリー: 開発, VB | アリスの鞄は作った人を知っている はコメントを受け付けていません

参照設定しているアセンブリからクラスを動的にロードする方法

Assembly.LoadFrom を使って別のアセンブリにあるフォームを起動する | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/2312

上記なところで、Assembly.LoadFrom メソッドを使うと動的にアセンブリをロードすることができる、って話をしましたが、実はプラグインでなければ【動的】である必要はないわけで、あらかじめ【参照設定】などでアセンブリを指定しておく方法もあります。

つまりは、

Dim cname as string = "クラス名"
Dim t as Type = Type.GetType( cname )
Dim f as Form = System.Activator.CreateInstance(t)

な感じで、Type から直接作ればよいわけです。

実は前回、なんでわざわざ動的ロードにしたのかなぁ、と思っていたら、この cname が参照設定先の別のアセンブリにあると、単純にクラス名(例えば、FormSub とか)だけではオブジェクトを作成できなかったからなのです。

アセンブリの構成が、

SampleMain.exe
+ FormMain

のように単一のアセンブリに入っていれば、そのまま Type.GetType(“FormMain”) でロードができるのですが、

SampleMain.exe
+ FormMain
SampleSub.exe
+ FormSub

のように、Main.exe から Sub.exe を【参照設定】している場合は、Main.exe の中では、Type.GetType(“FormSub”) ができません。
別アセンブリの場合は、【修飾名】が必要って訳です。

で、この修飾名はどうやって取り出すかというと、AssemblyQualifiedName で取り出します。

Type.GetType メソッド (String) (System)
http://msdn.microsoft.com/ja-jp/library/w3f99sx1(v=VS.80).aspx
Type.AssemblyQualifiedName プロパティ (System)
http://msdn.microsoft.com/ja-jp/library/system.type.assemblyqualifiedname(v=VS.80).aspx

なにやら、ややこしいことが書いてありますが、要は試しのプログラムを作って AssemblyQualifiedName プロパティで取り出してみればば良いわけです。下記のように試してみます。

Dim frm as new FormSub
Debug.Print( frm.GetType.AssemblyQualifiedName )

すると、「FormSub, SampleSub, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null」のように修飾名が取れるので、そのままクラス名として利用します。

Dim cname as string = "FormSub, SampleSub, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
Dim t as Type = Type.GetType( cname )
Dim f as Form = System.Activator.CreateInstance(t)

ロードする対象のクラスを切り替えたいとき(画面を切り替えたいとき)は、クラス名の「FormSub」を変えれば ok ですね。

カテゴリー: 開発, VB | 1件のコメント

Windows 8 Preview に色々インストールしてみる

まずは、Firefox。インストール時に「対応していないよ」と警告がでるが動く。

おつぎは Eclips. 久しく eclips を使っていないので java のプロジェクトが手元にないw。 android の開発には必須ですね。

OpenOffice も入れてみる。メニューのフォントが変なのは、前からなのか?多分、フォントが決め打ちになっているのかな。

色々インストールすると、windows 8 のスタートページはごちゃごちゃになります。まあ、「すべてのプログラム」のアイコンがぶちまけられるので仕方がない?

IE のタブレット版(だっけ)では、Windows Azure Platform が動かないので、

通常版の IE10 で動かすとか

ちなみに、Visual Studio 11 + Windows 8 では、Windows Azure Template がインストールされない…のです。Visual Web Developer 2010 Express を要求するのでインストール中。

カテゴリー: 開発, 雑談 | Windows 8 Preview に色々インストールしてみる はコメントを受け付けていません

iOS 本の共著してくださる方を募集します

なかなか、皆さんタイミングが合わないようで(意味不明)、広くブログで募集してみます。
# 今月末ぐらいまでは募集したいのですが、都合によっては早く締め切るかも。

某社の「iOS 逆引き」本(って伏字になってない気もしますがw)を書くために、iOS/iPhone/iPad のプログラミングができる方かつ執筆できる方を募集します。iPhone/iPad のプログラミング本です。
全体が、500 個ぐらいの tips を作る予定なので、はじめての執筆であれば 100 tips とか、あるいは元気な方(謎)であれば 200 tips かというところでしょうか。そのあたりは、調節したいと思います。内容は、これから決める、という泥縄方式ですから。

逆引きの本の場合は、ひとつひとつが単発なので1冊の本を書き続けるよりは(執筆)初心者向き、と言いますか分担がしやすいんですよね。

そんな訳で、

■募集内容

某社の iOS 逆引きの共同執筆を手伝ってくださる方(平たく言えば「共著者」)を1名募集します。
tips 数は、100 から 200 の間ぐらい。

■締め切り

来年の2月末ぐらい。

■募集期間

今月末ぐらい(9月末)まで。
応募者多数の場合は、早めに締め切ることがあります(というか、応募者0名の場合は、それはそれで早く締め切るかもw)

■応募先

メール masuda_at_moonmile.net(_at_ を @ に変えてください)や、ツイッター @moonmile までお願いします。
このブログのコメントや問い合わせフォームでも構いません。
連絡先(メールでokです)と執筆への意気込み、を書いてくださればOKです。

カテゴリー: 開発 | iOS 本の共著してくださる方を募集します はコメントを受け付けていません

WebMatrix 再見…というか、テンプレートからサイトを作成してみる

2011-09-17 – まめしば雑記
http://d.hatena.ne.jp/shiba-yan/20110917

なところで、WebMatrix 2 のベータ版が出たそうで、というのを知って、そういえば WebMatrix ってどこまで使えるんだろうと既にインストール済みの(苦笑)WebMatrix を立ち上げてみて、ちょっと驚き。

WebMatrix を起動して、「テンプレートからサイトを作成する」をクリックします。

[ベーカリー]を選択

どうやらテンプレートで出来たらしいので、[実行]ボタンをクリック

ブラウザが立ち上がって、ベーカリーサイトが出来上がっているという具合。

いや、中身は空っぽなんでしょうけど、「今すぐ注文」ボタンで遷移するところまでできています。

で、改めて、どんなファイルができているかと覗いてみると、

Razor テンプレートを使っていて、データベースにアクセスしていて、という出来上がり具合。素直にすごいッ!!!

で、何が驚きなのかというと、

Rasor なのに ASP.NET MVC 3 を使っていない。なるほど、通常の *.aspx の代わりに Razor 部分を使うっていう手もあるんですね…と言いますか、これ本家(?)の Visual Studio 2010 では簡単には作れないのです。空の ASP.NET アプリケーションを作ってから Razor を使うように設定して、という具合に、いくつかの手順を踏まないと作れない。だけど、WebMatrix のほうは、一気に作ってしまう、という反則技(笑)。

で、ASP.NET MVC でややこしいのは(CakePHPでも同じですが)、コントローラーやらビューやらという仕組みを覚えないといけない。PHP や *.aspx で直接がしがし書くほうが手軽だったりする。でも、このベーカリーのテンプレートだと、Razor の文法だけ流用して MVC のところが無い、ってのが潔いのです。その手があったか、という感じ(今更ですが)。

WebMatrix 2 になるとインテリセンスが効くので、結構コーディングがしやすそう。Visual Studio や Web Developer と使い分けながら PHP 絡みでコーディングすると有効なのかも、と考えたり。

カテゴリー: 開発, ASP.NET | WebMatrix 再見…というか、テンプレートからサイトを作成してみる はコメントを受け付けていません