本を買いました。


前は本なんか買わなくてもネットで調べればいいやと思ってあまり買わなくなっていたのですが、iPhoneのプログラムを作ってみて、書籍での学習の効率のよさを見直しました。
とはいえ、ちょっと買いすぎました。
全部をマスターする時間は無さそうですが、少しずつでもかじっておきたいです。

ひかりTVがハイビジョンチャンネル拡充



半年くらい前にひかりTVに加入しました。NTTがやってるIP通信で見られるテレビサービスです。ハイビジョンチャンネルが少ないので、スカパーHDが拡充されるまでのつなぎと思っていました。ところが今月からハイビジョンチャンネルが増えました。
ひかりTV、4月にハイビジョンチャンネルを拡充
特に、ヒストリーチャンネルナショナルジオグラフィックは嬉しいです。毎日、どのチャンネルを見ようか悩んでいます。
しかも、以前はAAC5.1chが私のサラウンドアンプ(ONKYO BASE-V10)では再生できなかったのが再生できるようになっていました。新しいアンプを買おうと思っていたのが必要なくなってしまいました。
2ヶ国語放送だと音声が混じってしまう番組があるのが玉に傷です。
(4/22 9:00追記
よく見たら、ひかりTVAAC出力は2chばかりでした。5.1chの映画配信が再生できるかは今度試してみます。
)


フレッツネクストというのにすると地上デジタルも見られるようになるらしいので、変更の申し込みをしてみました。今月末に工事が来ます。

実機で動作しました


アクティベーションの件は、jdevprog@asia.apple.comに問い合わせたらすぐに返事が来て、注文確認メールの内容ではなく、注文詳細画面の「ご請求、ご連絡先」と注文番号を送って欲しいとのこと。
送ったらすぐに手動でアクティベーションの準備をしてもらえました。


アクティベーション後は、Provisioningというのをして秘密キーだの公開キーだのをMaciPhoneに設定すれば、X-CodeのDeviceを切り替えるだけで動きました。
参考→http://www.codeanimato.com/blog/archives/2008/10/iphone-2.html
ミュージックライブラリもMacに移動しないといけないのかとドキドキしましたが、SDKの動作設定と音楽はまったく関係がなかったのでほっとしました。


一応、加速度センサーの内容をテキストボックスに表示してみましたが、フォントサイズを大きくしたりしたかったのですが、分からないことばかりであきらめました。Objective-Cも良く分からないし、本を買った方が時間の節約になりそうです。
ついでにWPFの本も買おうかな。

iPhone SDKでHello World


Hello Worldがやっと動きました。
いやあ、結構苦労しました。



IDEXcodeとInterface Builderというのに分かれているのですが、
イベント処理の書き方が分からなかったです。
しかも、VNC経由でやっているのでCommand+ドラッグや右ドラッグが働かなくて往生しました。
まだInterface BuilderのオブジェクトとXcodeのクラスの結びつきが良く分かっていません。


しかし、iPhoneのアプリは充実してるみたいですね。
Objective-CCocoaというレアな組み合わせでプログラム書ける人がたくさんいるなんてちょっと信じられません。少なくとも私の周りには一人もいませんので。



さて、早速実記で動かそうとしたのですが、アクティベーションコードを入力したのに、
> Program Activation On Hold.
> Your credit card and enrollment information do not match.
> For ID verification purposes, please downloadd and complete this form....
と表示されて、うまくいきません。
検索すると、同じ症状の人が結構いっぱい出てきます。
Apple Storeで購入するときに住所を日本語で入れないと進まないので変更したのがよくなかったのでしょうか。(そんな馬鹿なことってある!?)
devenroll@apple.com にメールを送ってありますが24時間経過しても応答がありません。
返事がなければ国際FAXを送ってみます。でも、日本の免許証のコピーなんて送っても読める人がいるんでしょうか。
jdevprog@asia.apple.com に送って返事があった人がいたので私も送ってみます。


(4/16 0:30追記
メールの返信が来ました。注文確認メールの内容ではなく、注文詳細の画面の「ご請求、ご連絡先」と注文番号を送って欲しいとのこと。送ったらすぐに手動でアクティベーションの準備をしてもらえました。
)

Messengerのメールアドレスを変えろとのメッセージが来た



メッセンジャーにログインしたらMessenger Serviceスタッフから上のようなメッセージが来ました。
「サービスに関する重要なお知らせ : 最近行われたシステム強化の一環として、引き続きWindows Live(TM) Messenger Service にサインインするために、お客様に電子メールアドレスを変更していただく必要があります。」とのことです!?
電子メールアドレスを変えるってことは、Xbox Liveなどに登録しているのも直さないとだめですよね。メッセンジャーのコンタクトリストは自動的に移行されるそうですが、それにしたっていったいどんなシステム強化をすれば、ユーザーの電子メールアドレスを変更する必要が出るのでしょう。


言われたとおり変更しようとしたのですが、どこから変更するのか分からないので放置中です。いまのところは普通に使えてます。


(4/10 追記
誤送信だったようです。
http://welovewindowslive.spaces.live.com/blog/cns%216029A5A1C44FA6D3%21422.entry
orz_skyworkerさんに教えていただきました。ありがとうございました。
)

Silverlight2 + ADO .NET Data Services 動いた

Data Servicesでデータを取得しようとすると謎の例外が出てしまっていたのですが、原因が分かって動きました。
エラーメッセージは「callOpen の呼び出しに失敗しました。」「場所 System.Data.Services.Http.ScriptXmlHttpRequest.Open」という感じでした。
検索するとクロスサイト呼び出しがどうのとか出てきますが、ローカルでデバッグしてるのにクロスサイトも何もないだろうと無視したのがよくありませんでした。実際にはSilverlightをスタートアッププロジェクトに指定して実行すると、自動的にホストするページが生成され、その上で実行されるので、Data Serviceにアクセスするとクロスサイト呼び出しになってしまうのです。



Silverlightをスタートアッププロジェクトにして実行すると
デバッグしようとしているSilverligntプロジェクトは、Webサービスを使用しています。サービスを含むWebのコンテキストでプロジェクトを実行しない限り、Webサービスの呼び出しは失敗します。」という警告が出ていたのですが、関係ないだろうと思って消してしまっていました。


プロジェクトを作るときに以下の手順が必要でした。

  • Silverlightのプロジェクト(とソリューション)を作る
  • Silverlightをホストするプロジェクトを作るか聞かれるので作る。(SilverlightApplication1とSilverlightApplication1.Webというプロジェクトができる。)
  • SilverlightApplication1.Webプロジェクトを右クリックして「項目の追加」-「新しい項目の追加」で「データ」-「ADO .NET Entity Data Model」を指定。
  • SilverlightApplication1.Webプロジェクトを右クリックして「項目の追加」-「新しい項目の追加」で、今度は「Web」-「ADO .NET Data Services」を指定。
  • WebDataServices1.svc.csに作ったEntityData名(NorthwindEntitiesとか)を書く。
  • WebDataServices1.svc.csに以下の修正もする。

config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
config.UseVerboseErrors = true;

  • WebDataServicesが動くかhttp://localhost:ポート番号/WebDataServices.svc/Customers などを指定してテスト。
  • 今度は、SilverlightApplication1の方を右クリックしてサービス参照の追加。「探索」ボタンを押してWebDataService1.svcを指定
  • Page1.xamlにButtonでも追加して、実行して動作チェック。
  • Page1.xamlにDataGridとButtonを追加して、以下のようなコードを書く。
  • 動作チェック




動いた!!
けど、右クリックしても「Silverlight」としか表示されない。


Silverlight2の感想ですが、ホイールでの操作や右クリックの操作が考慮されていないというのがダメダメです。どこかのブログで読みましたが、責任者の人が対応させるつもりはないというような発言をしているらしいです。通常のWebページより操作性を悪くしてどうするつもりなんでしょうか。非同期通信しかサポートしていないというのもどうなんでしょ。非同期を使うかどうかは我々が決めることであって、あんたらはどちらも使えるように作るのが筋だと思うんですがね。
Silverlight3はまだ試してませんが、責任者が変わらない限りあまり期待できないかも。


私の場合は特定の人向けのシステムがメインなのでMacintoshで動くかどうかということは重要ではありません。WPF Browser Applicationはあまり流行っていないようですが、こっちのほうが魅力的に見えてきました。


[Page1.xaml]


<UserControl xmlns:basics="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
x:Class="SilverlightApplication1.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="800" Height="600"
KeyDown="UserControl_KeyDown"
>
<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="100"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBox Grid.Row="0" Grid.Column="0" x:Name="TextBox1" Text=""></TextBox>
<Button Grid.Row="0" Grid.Column="1" x:Name="Button1" Content="検索" Click="Button1_Click"></Button>
<data:DataGrid Grid.Row="1" Grid.Column="0" x:Name="DataGrid1"></data:DataGrid>
<Button Grid.Row="1" Grid.Column="1" x:Name="Button2" Content="更新" Click="Button2_Click"></Button>
</Grid>

</UserControl>


[Page1.xaml.cs]


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using System.Data.Services.Client;
using System.Collections.ObjectModel;
using System.Windows.Browser;
using SilverlightApplication1.ServiceReference1;

namespace SilverlightApplication1 {
public partial class Page : UserControl {

DataServiceContext m_context = null;

public Page() {
InitializeComponent();
}

private void Button1_Click(object sender, RoutedEventArgs e) {
m_context = new DataServiceContext(new Uri("AdoDataService1.svc", UriKind.Relative));

string sSerach = this.TextBox1.Text;

DataServiceQuery query = null;
if (sSerach == "") {
query = m_context.CreateQuery("Customers");
} else {
query = (DataServiceQuery)(from c in m_context.CreateQuery("Customers") where c.ContactName.StartsWith(sSerach) select c);

}
query.BeginExecute(loadCategoryCallback, query);

this.Button1.Content = "検索中";
}

private void loadCategoryCallback(IAsyncResult result) {

DataServiceQuery query = (DataServiceQuery)result.AsyncState;
if (query == null) {
Console.WriteLine("query == null");
} else {
//いったんObservableCollectionに移す方法もある
List customers = query.EndExecute(result).ToList();
this.DataGrid1.ItemsSource = customers;

this.Button1.Content = "検索";
}

}

private void Button2_Click(object sender, RoutedEventArgs e) {

//TODO: 更新中ダイアログ的なものを出す
this.Button2.Content = "更新中\n 触ってはダメ";

List col = (List)this.DataGrid1.ItemsSource;

//全部の行を更新対象に設定
// 編集した行だけにするのはめんどくさそう
// RC0でCommitChangingイベントがなくなったのでTextBoxのLostFocusを使う
// http://www.onteorasoftware.net/post/Silverlight-2-RC0-DataGrid-CommittingEdit-work-around.aspx
foreach (Customers c in col) {
//Console.WriteLine("ContactName=" + c.ContactName);
m_context.UpdateObject(c);

}

m_context.BeginSaveChanges(SaveChangeCallback, m_context);
}
private void SaveChangeCallback(IAsyncResult result) {
m_context.EndSaveChanges(result);
MessageBox.Show("更新完了 SaveChangeCallback context=" + m_context);
this.Button2.Content = "更新";
}

private void UserControl_KeyDown(object sender, KeyEventArgs e) {
//PerfomClick が無いのでボタンの押し方が分からない
/*
if (e.Key == Key.F3) {
Button1_Click(this.Button1, null);
} else if (e.Key == Key.F8) {
Button2_Click(this.Button1, null);
}

if (Keyboard.Modifiers == ModifierKeys.Alt) {
if (e.Key == Key.S) {
Button1_Click(this.Button1, null);
}
}
*/

}

}
}

Ado .Net Data Services は IE6では動作しない(勘違いでした)



Silverlightが面白そうなので、DBのデータを読ませようとしてAdo .Net Data Servicesを勉強していたのですが、解説の通りに作っても動作しないので困ってしまいました。
Northwind.svcは開けるのですが、Northwind.svc/Customers などを開こうとするとInternetExplorerがダウンロードできませんというエラーになってしまいます。
ためしにIE7をインストールしてみたらあっさり動作しました。
ネットを検索しても同じような人はいなかったので、みんなとっくにIE7か8に移行していたんですねえ。ツールバーまわりが微妙に使いづらいんですけど、みんな文句も言わずに偉いなあ。


だいぶ時間を浪費してしまったけど、とにかく一歩前進。
(4/7追記
動かなかった原因はIE6ではなく、SilverlighApplication1の方から実行していたからでした。
クロスサイトになってしまうので動かなかったようです。
後日詳しく書きます。
)