Visual Basic の変数を解説するよ(技術メルマガ編)のメモ

青木「今日から、いよいよ変〇の解説をするぞッ!!!」
田中「ええ、あの、変…なんですか???」
青木「変〇の解説だッ!!!」
田中「変…というと、奥浩哉さんの漫画のアレですか?」
青木「変〇というとそうかもしれないな」
田中「あの、HEN…とかいう漫画のアレですか?」
青木「そうかもな、変〇というと、アレかもな」
田中「でも、あの、Visual Basic と何か関係あるんでしょうか?」
青木「そりゃ、変数が無いと困るだろう、Visual Basic 2010 でプログラミングできないじゃんッ!!!」
田中「…」
青木「何考えてんだ、君は???」

とかいう前振りを考えたのだけど、技術メルマガでは却下することにしました。アレだし。沼正三や天野哲夫の話をしても困るだろうし。でも、澁澤龍彦は良さそうだったり。

というのはさておき、Visual Basic では変数の扱いが意外とややこしくて、主な使い方が以下の通り。

' オブジェクト型
Dim obj As Object
' オブジェクト型(型指定をしない)
Dim obj2

' 数値型
Dim num As Integer
' 文字列型
Dim str As String

' 配列型
Dim array() As Integer
Dim array2 As Integer()

' クラスオブジェクト
Dim cn As SqlConnection
' コンストラクタを利用
Dim cnx As New SqlConnection

' コレクション
Dim lst As List(Of Integer)

' 推論
Dim var = From n In lst Select n

' 同時に初期設定する
Dim n1 As Integer = 10
' 同時に初期設定する(推論を利用)
Dim n2 = 10

Dim cn1 = New SqlConnection
Dim cn2 As Object
' オブジェクト型に代入
cn2 = cn1
Dim cn3 As SqlConnection
' オブジェクト型から代入
cn3 = cn2
' 明示的にキャスト(CType)を使って代入
cn3 = CType(cn2, SqlConnection)

' for で使う一時変数
For i As Integer = 1 To 10

Next

' for each で使う一時変数
For Each n In lst

Next

' リソースを解放させる
Using bmp As New Bitmap

End Using

If str = "" Then
	Dim temp As String = ""
End If
' ここでは使えない
' temp = ""

VB6.0 の頃に object 型だったり、Variant 型だったりしたものが、初期値で型推論に変わったので、このあたりが微妙に異なっていたり、string 型から object 型にキャストをするときに暗黙のキャストが定義されていたり。

関連としては、For 文と For Each 文と同時利用が必須ですね。ブロック内の局所変数とかも。

カテゴリー: VB, 技術メルマガ | Visual Basic の変数を解説するよ(技術メルマガ編)のメモ はコメントを受け付けていません

Visual Studio 2010 の Windows Azure Tools 1.4 は日本語版が無い

ちょっとメモ的に、

http://windows.azure.com/

にアクセスすると、Azure の管理ポータルが出て来ます。いつの間にか日本語化されているので便利ですね(ちょっと前までは英語版だけだった)。

で、Visual Studio 2010 で Azure のプログラミングをする場合は、Windows Azure Tools を入れればよい訳で、右側にある「Windows Azure Toolsのインストール」をクリックして、

Download Windows Azure SDK
http://www.microsoft.com/windowsazure/sdk/

なるところから「Get Tools & SDK」をクリックすると Web Platform Installer が実行されて IIS とかの設定もやってくれるので便利…とか思っていたわけですが、これでインストールされるバージョンが Azure Tools の「1.4」でして、このバージョンは日本語化がされていないんですよね。

  1. 3 のバージョンじゃないとだめなので、

ダウンロード詳細 Windows Azure SDK および Windows Azure Tools for Microsoft Visual Studio (2011 年 3 月)
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=7a1089b6-4050-4307-86c4-9dadaa5ed018

なところからダウンロードしてインストールすることになります。

Azure Tools のバージョンは Visual Studio 2010 の「ヘルプ」→「Microsoft Visual Studioのバージョン」で開くと見れます。

書籍の発売までに、Web Platform Installer のバージョンでも日本語が通るといいんですけどね。

カテゴリー: 雑談 | Visual Studio 2010 の Windows Azure Tools 1.4 は日本語版が無い はコメントを受け付けていません

Visual Basic のリファクタリングポイント(上海編)

名著「リファクタリング」に沿って、リファクタリングせよッ!!! というのは難しいので、具体的なポイントを出します。

この前に前提条件があって、

1.NUnit で程よく、テストコードが書かれていること。
2.バージョン管理ツール(VSSやSVNなど)が導入されていること。

が条件になります。

「程よく」Nunit が使われているというのは、関数の中身を弄るので NUnit のテストコードを通しながらリファクタリングしたい、ということです。注意深くやれば特にテストコードはいらないのですが、手順を間違えたとき(人為的なミスですね)の発見が早くなります。

同時に、間違えたソースを元に戻すのにバージョン管理ツールが必要です。実はこれも必須というわけではなく、自前でバッグアップを取りながらでもよいのですが、修正前の差分や、一気にバージョンを戻してしまうことも可能なので、バージョン管理ツールがあると安全になります。

どちらも、【セーフティネット】の役割が強いです。

さて、リファクタリングと言えば、普通は関数の共通化が主な作業になるのですが、今回は【コード自体の質】を上げることに注力します。と言うのも、ぽろぽろと妙な書き方をされているところが多く、コードが統一されていないので、後からの保守が大変かつシステム試験時に顧客要望を取り入れにくい(コードを早急に改修しないといけない場合に、時間が掛かってしまう)という欠点があります。

・デバッグしやすいコードに直し、デバッグ時間を減らす。
・保守し易いコードに書き直し、保守可能なコードにする。

のが主目的です。

という訳で、リファクタリング対象の中で、公開しても差し支えないところをいくつか晒しておきましょう。コードは Visual Basic なのですが、C# にもあてはまります。

■if 文に not を使わない

関数が Function Method() As Boolean で作成されているときに、True/False で返すものだから、

if obj.Method() Then
  ...
end if

とやりたくなるのですが、

if not obj.Method() Then
  ...
end if

のコードが散見されたので、True/False 付きに変えることにしました。

if obj.Method() = True Then
  ...
end if

あるいは

if obj.Method() = False Then
  ...
end if

にして、明示的に boolean と比較します。こうすることで、デバッグ時にどちらで比較しているのか一瞬で分かるようになります。

まぁ、主原因は↓なコードがあって、何をやっているやら…って感じだったのが本音です。

if not obj.Method() <> 1 Then
  ...
end if

■if 文内で end sub/function した時は else を書かない

具体的には、

if param < 0 Then
  ' 異常系
  ...
  end sub
else
  ' 正常系
  ...
end if

よくある、if 文でパラメータなどをチェックしてエラーをはじくという処理なのですが、else の前で exit sub(return なども) をして関数を抜けています。なので、else のところって意味がないですよね。

普通に↓な風に書きましょうよ、という話です。

if param < 0 Then
  ' 異常系
  ...
  end sub
end if
' 正常系
...

実は、これ、えらいコードがあって、↓なコードがありました。

if param1 < 0 then
  ' 異常処理
  end sub
else
  if param2 < 0 then
    ' 異常処理
    end sub
  else
    if param3 < 0 then
      ' 異常処理
    else
      ' 正常処理
      ...
    end if
  end if
end if

正常系の処理をやりたいのやら、異常処理がやりたいのやら分かりません…ってな具合。

■関数の戻り値は意味のある場合だけチェックする

ちょっとローカルルール臭いのですが、こんなコードになります。

function Method() as Boolean
  ...
  if ... then
    ' エラーの場合、例外を発生させる
    throw new Exception(...)
  end if
  return true
end function

という関数があります。戻り値が True しかないのに、Function にしているのがおかしい、のは確かに言えて、本来は sub にしますね(C# ならば void型)。

これを利用するときに、律儀に、

if obj.Method() = false then
  ' 異常系
  ...
  end sub
end if

しているコードが結構あるのですが、まぁ、Function だし戻り値を確認しないといけないのは筋なんですが…。これをいざ、保守しようとしたときに Method が True/False を返すのか? って調べないと駄目なんですよね。

なので、内部で例外しか発生させていないし、その例外は catch しているわけではないので、単純な処理の記述として書き換えます。

obj.Method()

実は、今回のソースコードのローカルルールで「基本的に例外を発生させない」というものを作りました。DB を扱うので、SqlCommand 関係のエラー(タイムアウト等)しか発生しないので、この手の例外はもっと外部のほうで取っています。
という理由があって、例外処理をごちゃごちゃやりたくなかった、というのがあってのリファクタリング対象です。

まぁ、本来は Fuction じゃなくて、Sub にするのが正式ですかね。

■DataTable.Rows(0) を直接参照しない

今回は、DAO という形でデータベースアクセスをするクラスを必ず作りました。
O/R マッピング的に言えば、DAO 自体にメソッドを追加するのですが、設計時間的に余裕がなかったので、そのあたりは飛ばして、DataTable を直接扱うところが多々あります(実際には、自作の型付DataTableに自動マッピングさせていますが)。

この中で、主キーなどで検索した場合、必ず1件あるとう想定で書かれているコードが結構あったので、これをリファクタリング対象にしています。

dim dt as new datatable
da.fill( dt )

dim id as integer = dt.rows(0)("ID")
dim name as string = dt.rows(0)("NAME")
...

データベース的に整合性があっていれば、1件は取得できるためここで落ちることはないのですが、初期データの絡みもあって(現状のコードの品質も加味して)、Rows.Count をチェックします。

dim dt as new datatable
da.fill( dt )
if dt.Rows.Count = 0 then 
  exit sub
end if

dim row as datarow = dt.rows(0)
dim id as integer = row("ID")
dim name as string = row("NAME")
...

一時変数の row を使うのは、dt.Rows(0) があちこちに出てこないようにするためです。
元のコードのほうが、dt.Rows(0) を参照していることが明確になるのは確かなのですが、保守するときに「それは、Rows(1) ではないのか?」という迷いがなくなります。
なので、VB の場合は With 構文を使っても ok です。

dim dt as new datatable
da.fill( dt )
if dt.Rows.Count = 0 then 
  exit sub
end if

With dt.Rows(0)
	dim id as integer = .Item("ID")
	dim name as string = .Item("NAME")
end with

■トランザクションの範囲は短くする

これはバグ含みなので、リファクタリングというよりも修正ですね。

dim trans as new SqlTransaction
try
	dim cn as new SqlConnection("")
	...
	trans.Connection = cn.BeginTransaction()
	if パラメータチェック Then
	  ' 異常処理
	  return False
	end if
	...
	trans.Commit()
catch ex as SqlException
    trans.RollBack
    return False
end try
return true

というコードが散見されているのです。実際には、SqlTransaction, SqlConnection は別のクラスで実装していますが、これの書き方では駄目ですね。パラメータチェックで異常処理をした後に Rollback ができていない…というか、パラメータチェックの前でトランザクションを開始しては駄目でしょう。

if パラメータチェック Then
  ' 異常処理
  return False
end if

dim trans as new SqlTransaction
try
	dim cn as new SqlConnection("")
	...
	trans.Connection = cn.BeginTransaction()
	...
	trans.Commit()
catch ex as SqlException
    trans.RollBack
    return False
end try
return true

こんな風に、データベースアクセスとは関係ないものは try の前に書かないと駄目です。例外が発生されない訳だし。

これはコードを量産するときに起きる間違いで、

– まずは、関数を始めたら try – catch で囲む
– データベースを更新するときは、begintransaction を書いてしまう

という思い込みが問題になっています。本来は、

– データベースアクセス時には例外が発生するので、try-catch する。
– データを更新する範囲だけを、トランザクションで囲む

という書き方にしないと…。

そんなリファクタリングの日々だったり。

カテゴリー: 開発 | Visual Basic のリファクタリングポイント(上海編) はコメントを受け付けていません

宣言ッ!!! 技術メルマガを作るよ(´・ω・)ス

なんか、アレ、人のやる気を殺いではいけない、という意味で公開宣言しておきます。

.NET 技術系のメルマガ(有料)を製作中です。

全130回(週5回配信、26週間)をひと区切りにして、ラジオ講座のように学べるのが売りです。

・基礎VB講座
・基礎C#講座
・応用VB講座
・応用VB講座

と以下続く。

書きかけど、サンプルはこんな感じで↓

1.3 Visual Basic 2010 をインストール

■今日のトピック

Hello Everybody !!! こんにちは、Tonny マスダです。
第2回では定番の Hello World を作ったので、今度はメッセージボックスを使ってみますよ。小さいことからコツコツと、たまにはドーンと大きくやりますけど、今のところはコツコツと地道に進めてくださいねッ!!!

さて、Visual Basic 2010 を使って最初の定番プログラミング「Hello world.」を表示させたものの、その次の一手がわからない田中君。お次は何をするのでしょうか?

田中「先輩、ほら、Hello world ができましたよ(えへん)」
青木「おお、ああ、当たり前だな」
田中「え?」
青木「あのなぁ、Hello world が出たぐらいで喜んでちゃいけないのよ。次の一手ってのがあるだろう?」
田中「(あの、ちょっと、それって)」
青木「ほら、世の中 Hello world ばかりじゃ、Hello world プログラミングで溢れかえってしまう。そういうときは・・・」
田中「そういうときは?」
青木「昼にはこんにちは、夜にはこんばんわプログラミングだろうがッ!!!」
田中「ええッ???」

というわけで、いきなり、こんにちは or こんばんわプログラミングということになった田中君。さてはて、どうすればいいのでしょうか?

■今日のサンプルコード

今日は昨日使った Hello world のプログラムを修正して使います。
ボタンをクリックした時のコードは次の通りです。

If 9 <= Date.Now.Hour And Date.Now.Hour <= 17 Then
    MessageBox.Show("今日は")
Else
    MessageBox.Show("今晩は")
End If

さあ、これで準備は完了です。動作確認をしてみましょう。
そのまま動かす場合は「F5」キーを押せば ok です。

よく分からないと思いますが、そのままコードを打ち込むか、メールマガジンからコピー&ペーストしてくださいね。

■サンプルの解説

今回は条件分岐をするための if 文を使っています。
Visual Basic では Date.Now で現在の時刻が使えます。時計の「時」の部分をとるためには「.Hour」を付けます。これで、9 時から 17 時(午後5時)までの時間を示すことができます。

最初の「今日は」を表示するのが、9 時から 17 時。それ以外は「今晩は」を表示させています。

■構文の解説

If 条件 Then
  実行文
End If

If 条件 Then
  条件にマッチした場合
Else
  条件にマッチしなかった場合
End If

If 条件1 Then
  条件1にマッチした場合
ElseIf 条件2 Then
  条件2にマッチした場合
Else
   その他の場合
End If

■練習問題

問題1

 メッセージボックスの表示を、「お早う」「今日は」「今晩は」の 3 つに分けて変更してみましょう。「お早うは」5 時から 10 時。「今日は」は 11 時から 18 時。「今晩は」は 19 時から次の日の 4 時まで、にしてください。

■ワンポイントレッスン

価格は未定ですが、ラジオ講座よりも安いかなぁと。

独習として使うのもよし、新人研修に使うのもよし、ベテランの復習に使うのもよし、という感じで。

ちなみに、建設予定地はこちら

協力者は、こちら↓

飲む(´・ω・)ス|WEB系技術電脳日記
http://ameblo.jp/konica/entry-10970423610.html

カテゴリー: 仕事 | 宣言ッ!!! 技術メルマガを作るよ(´・ω・)ス はコメントを受け付けていません

Visual C++ 2010 では DataSet が作れない…ので C# から借用する

Visual C++ 2010 の C++/CLI を使うと、ADO.NET を扱うことができるのですが、なぜか Visual C++ 2010 では型付の DataSet が作れないという…へんな具合です。

試しに、Visual C++ 2005 を使ってみると DataSet を作れるので、故意に落としてしまったが、忘れてしまったかという感じ。
ちなみに、C# で作った DataSet のファイル(DataSet1.xsd)を、VC++ のプロジェクトにインポートするとうまく動きます。

ただし、インポートしたままだと、ビルドする時に DataSet1.h というファイルを自動的に作成したときに接続文字列が解決できません。
これは、もう一度 DataSet のデザイナを開いて、テーブルを作り直すか、*.xsd のファイルを開いて、接続文字列のところを直接書き換えます。C# では、アプリケーション設定から持ってきているのですが、VC++ の場合は直接、接続文字列を書くようにします。

<Connections>
 <Connection ConnectionStringObject="Data Source=.\SQLEXPRESS;Initial Catalog=sampledb;Integrated Security=True" IsAppSettingsProperty="False" Modifier="Assembly" Name="sampledbConnectionString" ParameterPrefix="@" Provider="System.Data.SqlClient">
 </Connection>
</Connections>

こうすると、型付の DataAdapter と DataSet が作られるので、次のようにバインドします。

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

			 DataSet1TableAdapters::t_personTableAdapter ^da =
				 gcnew DataSet1TableAdapters::t_personTableAdapter();
			 DataSet1::t_personDataTable ^dt =
				 gcnew DataSet1::t_personDataTable();
			 da->Fill( dt );
			 this->dataGridView1->DataSource = dt ;
		 }

Windows XP 上ですが、一応実行例ということで。

カテゴリー: 開発, C++ | Visual C++ 2010 では DataSet が作れない…ので C# から借用する はコメントを受け付けていません

小学1年生でも7月中に夏休みの宿題を終わらせる方法(続)

小学1年生でもわかる7月中に夏休みの宿題を終わらせる方法 | Moonmile Solutions Blog

の続き。

夏休み帳ですが、昨日学童に行った時に【全て】終わらせたそうです。
計画通りというか、計画倒れというか、計画無視というか、まぁ、早くやる分にはそれでOK。

さて、手早く済ませたのですが、実はいくつか残りがあります。

・答えが間違っているもの
・わからないので飛ばしたもの

IT の PG 工程で言えば、

・コーディングしたけど、間違っている(不具合の混入)
・コーディング抜け。

ですね。

■コーディング抜けの対処

これをどのように対処するかというと、「分からないの飛ばした」に関しては、ざっと見ると分かります。
答えが空欄になっていますからね。
PG で言えば、設計に書かれているけど、コーディングされていない、という【抜け】の問題です。
夏休み帳の場合は、あらかじめ答えを書く空欄が用意してあるので、ざっと見ただけで分かります。
なので、PG 工程の場合も似たようなことをすれば

・あらかじめ、クラス設計などでメソッドだけを用意しておく。
・あらかじめ、xUnit を作って、仮メソッドだけを用意しておく。

という方法です。箱だけ用意しておくと抜けがわかります。

前提条件として、コーディングの前にざっとですがクラス設計をしないといけません。
また、コーディング前のクラス設計が間違っていると修正が困難になります。

なのでオブジェクト指向設計なりデータ指向設計なりの構造設計をしておきましょうという話です。

■コーディングミスの対処

夏休み帳の答えが間違っている場合は、ざっと見ただけでは分かりません。
答えあわせをしないと駄目ですよね。

これがいわゆる単体試験の工程です。
答え合わせは、逐次やってもよいし、あとでまとめてやっても良いわけで、

・あとでまとめてやるのが、ウォーターフォールの従来型の工程
・逐次テストするのが、xUnit を使った工程

ってことです。

■クリア条件があるもの

さて、実はもうひとつの試験方法があります。

先の逐次テストの場合は、ホワイトボックス的に、期待値が明確である時に使います。
夏休み帳のような、答えが明確になっているものは、このタイプです。

もうひとつ、絵日記のような答えが明確ではないものがありますね。
絵日記の場合は、「ある程度の絵と文書が入っていること」がクリア条件になるのです。
これが、丁度、xUnit のブラックボックステストになります。

とある期待値をクリアしているかどうかということで、性能試験や受け入れ試験に使います。
受け入れ試験の場合は、実際のコードを使って xUnit でエミュレートをします。この場合、MVC モデルなどを利用して xUnit 使いやすくしておくことがベストですね。View/GUI 部分は手作業になることが多いので、xUnit に向きません。

絵日記の場合はどうでしょうか。見た感じ、できているかなぁ、というのもアリですが、もう少し期待値を決定してみると、

・絵の部分で、50% 以上、色が塗ってあること。
・日付が書いてあること。
・天気が書いてあること。
・文章が、50% 以上書いてあること。

のような感じで、View/GUI から切り離してテストが可能です。
まぁ、そんな厳密ではないけれど、こんな風なクリア基準があるはずです。

カテゴリー: プロジェクト管理 | 小学1年生でも7月中に夏休みの宿題を終わらせる方法(続) はコメントを受け付けていません

小学1年生でもわかる7月中に夏休みの宿題を終わらせる方法

「小学1年生」と銘打っているのは、うちの娘が小1になったからなんです。
最近の小学校は、8月末までの夏休みではないそうで、中途半端に8月20日頃(正確な日付は忘れました)から2学期が始まります。

まぁ、それはさておき。

夏休みの宿題を8月末まで引っ張らないためには、【計画を立てて】そして【計画通り】に実行する、というのが定番ですが、プロジェクトの考え方で言うと、全く駄目です。絶対に遅れがでます。なので計画通りに終わることはありません(計画に忠実な、妙に厳しいマネージャ=親がいれば別ですけど)。

そんな訳で、アジャイルに、と言いますか、TOC で、と言いますか、私が小学生の頃にやっていた方法を公開します。
# 基本的な方法は、今でも変わっていなかったりして。

以下が、今回の計画の手順。

1.夏休みの宿題が全体で、どれだけなのか確認する。
 → 朝顔の観察が3枚
 → 絵日記が2枚
 → 夏休み帳が32ページ
 
2.7月中に終わらせるものをピックアップする。
 → 朝顔の観察で、2枚は7月中、1枚は8月
 → 絵日記は、1枚は7月中、1枚は8月
 → 夏休み帳は、7月中に
 
3.夏休み帳を7月に終わらせるために、毎日何ページやれば良いか計算する。
 → 娘自身が数えたところ、毎日3ページやれば、8月1日に終わるそうです。
 → 土日もやるらしいが、黙っておく(後で、土曜日に聞いてみます)
 
4.夏休み帳を毎日、【最低限】3ページやる。
 → 気が向いたら、3ページ以上やってもよい。
 

こんな感じです。

このスケジューリングのミソは、

・【最低限】3ページずつやる。
・気が向いたら、3ページ以上やってもよい。

の組み合わせです。

ひとつ目は、最低ラインを決めておいて、最低限スケジュールが守れるようにします。
ふたつ目は、余力があればタスクを先に進めるということです。

現状の IT 系のスケジューリングで一番まずいのは(ウォーターフォールでもアジャイルでも)、ひとつ目の縛りを守らないのもそうなのですが、ふたつ目を行うための余裕を持たせないことで、失敗する例が非常に多いのです。
タスクをこなす量は、日々ムラが出るのは仕方がないので、ひとつ目の縛りが多少上下しても構いません。ただし、その上下分を後からフォローできるようなバッファを取ることが大切です。それが、ふたつ目の余力になります。

だから、親のアドバイスとして、良くない例は、子供が更に夏休み帳をやろうとしているときに

「もう、3ページやったから、明日また3ページやろうね」
「既に3ページやったから、また明日にすればいいんじゃない」

とスケジュール通りに運ぼうとするのが間違いで、余力を削ってしまっています。
やる気なりモチベーションなりやれる時間なりがあるときは、

「3ページやったのだから、あとは自由にやっていいよ」
「3ページやったから、後は疲れないようにやっていいよ」

という余力で進めます。

こうすると、夏休み帳を7月中に終わらせる、という【目的】に沿って行動ができるようになります。
最低限、毎日3ページというノルマがあるので、計画通りにも終わります。

【目的】を忘れて【計画】に沿わせようとすると失敗しますよ、という話です。

カテゴリー: プロジェクト管理 | 7件のコメント

2つの MPMediaPickerController を配置すると片方が真っ黒になる

iPad で mpeg などの動画を表示するためには、MPMediaPickerController を使います。

MPMediaPickerController Class Reference
http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMediaPickerController_ClassReference/Reference/Reference.html

NSString mpegFile = @"douga";
MPMoviePlayerController *movie = 
	[[MPMoviePlayerController alloc] 
		initWithContentURL:
    	[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:mpegFile ofType:@"mp4"]]];

movie.shouldAutoplay = YES; // auto で開始
movie.controlStyle = MPMovieControlStyleNone; // コントローラーを非表示
movie.scalingMode  = MPMovieScalingModeFill; // サイズに合わせる
movie.view.frame = CGRectMake(0,0,300,200);

これを viewDidLoad の時にでも記述します。

で、普通は1枚しか表示しないんですが、電子書籍上、サマリなんかで複数枚表示したいと思った訳です。

↓な感じに。

NSString mpegFile = @"douga";
for ( int x=0; x<2; x++ ) {
for ( int y=0; y<2; y++ ) {
MPMoviePlayerController *movie = 
	[[MPMoviePlayerController alloc] 
		initWithContentURL:
    	[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:mpegFile ofType:@"mp4"]]];

movie.shouldAutoplay = YES; // auto で開始
movie.controlStyle = MPMovieControlStyleNone; // コントローラーを非表示
movie.scalingMode  = MPMovieScalingModeFill; // サイズに合わせる
movie.view.frame = CGRectMake(x*300,y*200,300,200);
}}

なのですが、何故か最後の追加した movie だけが表示されて、後は真っ暗なのです。
この例だと、同じファイルを表示させていますが、実際は別々のファイル名を指定します。

理由はよく分からないのですが、英語のサイトでも multi MPMoviePlayerController では動かん、ってことなので仕様なんですかね。ちょっと対策を思案中。

カテゴリー: iPad | 1件のコメント

ankhsvn の sharpsvn を使ってコマンドライン版を作ってみる

Visual Studio では VSS を使えッ!!! ってのが定番ですが、「それってお高いんでしょう?」ってな具合に SubVersion を使うことが多々あります(最近は git なのか?)

ankhsvn: Subversion Support for Visual Studio
http://ankhsvn.open.collab.net/

これをインストールすると Visual Studio 上から VSS ライクに SubVersion のリポジトリを操作できるので便利です。

が、checkout をするのに、いちいち Visual Studio を立ち上げないと駄目ってのが面倒なのです。それで、別途

tortoisesvn.tigris.org
http://tortoisesvn.tigris.org/

なものを入れて、エクスプローラから直接操作できるようにするのが普通なのですが、これって 、

・SVN のクライアントが二重に入っているのが変
・コマンドラインで一発で checkout するほうが、バッチ処理的に便利

なわけです。

で、最近気づいたのですが、ankhsvn をインストールしたフォルダには SharpSvn.dll なんていう、それらしいファイルがあるじゃないですか。

探してみれば、

sharpsvn: Samples
http://sharpsvn.open.collab.net/servlets/ProjectProcess?documentContainer=c4__Samples&view

というサンプルがあったりして。

試しに下記のように、書いただけで checout と update が簡単にできます。

imports SharpSvn

Module Module1
	Sub Main()
		Dim addr As New Uri("svn://...")
		Dim outdir As String = Directory.GetCurrentDirectory
		Dim client As New SvnClient
		AddHandler client.Notify, AddressOf prog
		if Directory.Exists(".svn") = false then
			Console.WirteLine("svn checkout")
			client.CheckOut( addr, outdir )
		else
			Console.WirteLine("svn update")
			client.CheckOut( outdir )
		end if
	End Sub
	
	public sub prog( byval sender as object, e as SharpSvn.SvnNotifyEventArgs )
		Console.WriteLine(e.Path)
	end sub
	
End Module
カテゴリー: 開発 | 1件のコメント

Windows Azure SDK 1.4 をインストール

Windows Azure の執筆を初めて気づいたのですが、Windows Azure の諸々の設定関係、初期の頃のベータ版やら現在の Windows Azure Platform の画面が以前とは違っているやら、という訳で、それなりに苦労しました。

多分、以下な本家本元

Windows Azure Platform デベロッパーセンター: 開発 | MSDN
http://msdn.microsoft.com/ja-jp/windowsazure/default

から辿ればよいのでしょうが、なにかと便利なブログが google から引っ掛かるので、それをついつい見てしまいます。

で、開発者としては Visual Studio 2010 に Tools を入れるということで、

Windows Azure Tools for Microsoft Visual Studio 1.4
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=7a1089b6-4050-4307-86c4-9dadaa5ed018&displayLang=ja

をインストールすることになっていますが、実は、Windows Azure Platform から「Install the Windows Azure Tools」をクリックすると、WebPI(Web Platform Installer)経由で IIS の設定もろもろインストールしてくれます。

↓なところで、Get Tools & SDK
Windows Azure SDK and Tools | Windows Azure Platform
http://www.microsoft.com/windowsazure/sdk/

カテゴリー: 開発, Azure | Windows Azure SDK 1.4 をインストール はコメントを受け付けていません