Microsoft.ServiceBus.dllのバージョンをあげすぎるとMobileServiceが「Unhealthy」になる
2014.06.07.Sat.01:02
.NETバックエンドのモバイルサービスにプッシュ通知の送信を実装すると「Unhealthy」になるので、いろいろ調べたところ、nugetでパッケージをすべて更新した時に「Microsoft.ServiceBus.dll」のバージョンが"2.3.3.0"になってしまっていたのが原因っぽい。
一つずつバージョンを下げていったところ、"2.2.7.0"まで下げたところで動くようになりました。
パッケージマネージャーコンソールで、既定のプロジェクトを [プロジェクト名]Service に変えて、2.2.7.0に更新します。
なお、
とのことなので、単にパッケージの更新をしたいときは、
一つずつバージョンを下げていったところ、"2.2.7.0"まで下げたところで動くようになりました。
パッケージマネージャーコンソールで、既定のプロジェクトを [プロジェクト名]Service に変えて、2.2.7.0に更新します。
PM> Install-Package WindowsAzure.ServiceBus -version 2.2.7.0
なお、
@yukilab つ[Update-Package -Safe]
— しばやん (@shibayan) June 6, 2014
とのことなので、単にパッケージの更新をしたいときは、

スポンサーサイト
.NETバックエンドのモバイルサービスにプッシュ通知の送信を実装すると「Unhealthy」になる
2014.06.05.Thu.02:01
Azure Mobile Services の.NETバックエンドでプッシュ通知を送る方法をまとめていたところ、モバイルサービスプロジェクトをAzureに発行した時、"Unhealthy"になってしまいました。
追記:ひとまず解決しました
手順
1.Azure Mobile Servicesで.NETバックエンドのモバイルサービスを作成
2.クイックスタートからWindowsストアアプリのC#のテンプレートプロジェクトをダウンロード
3.テンプレートプロジェクトを解凍し、VSで開く
4.モバイルサービスプロジェクトのnugetパッケージ管理画面を開き、すべて最新に更新
5.「Controllers/TodoItemController.cs」の「PostTodoItem」関数の中を下記のように変更
4.の段階で発行すると問題なく :-) になりますが、5.の変更を加えたうえで発行すると、 :-( になってしまいます。

なぜなんだぜ?
参考:
Get started with push notifications in Mobile Services
追記:ひとまず解決しました
手順
1.Azure Mobile Servicesで.NETバックエンドのモバイルサービスを作成
2.クイックスタートからWindowsストアアプリのC#のテンプレートプロジェクトをダウンロード
3.テンプレートプロジェクトを解凍し、VSで開く
4.モバイルサービスプロジェクトのnugetパッケージ管理画面を開き、すべて最新に更新
5.「Controllers/TodoItemController.cs」の「PostTodoItem」関数の中を下記のように変更
public async Task<IHttpActionResult> PostTodoItem(TodoItem item)
{
TodoItem current = await InsertAsync(item);
#region プッシュ通知登録
WindowsPushMessage message = new WindowsPushMessage();
message.XmlPayload = @"<?xml version=""1.0"" encoding=""utf-8""?>" +
@"<toast><visual><binding template=""ToastText01"">" +
@"<text id=""1"">" + item.Text + @"</text>" +
@"</binding></visual></toast>";
try
{
var result = await Services.Push.SendAsync(message);
Services.Log.Info(result.State.ToString());
}
catch (System.Exception ex)
{
Services.Log.Error(ex.Message, null, "Push.SendAsync Error");
}
#endregion
return CreatedAtRoute("Tables", new { id = current.Id }, current);
}
4.の段階で発行すると問題なく :-) になりますが、5.の変更を加えたうえで発行すると、 :-( になってしまいます。

なぜなんだぜ?
参考:
Get started with push notifications in Mobile Services
Visual StudioでGitリポジトリをつくると困ったファイルが作られる件
2014.05.28.Wed.20:47
久しぶりにすごい広島に参加出来たので、先日はめられた件について調べてみた。
というのが、Visual Studio 2013でWPFなプログラムを作っていて、それをGitで管理していたところ、何かの拍子に変更した覚えのないファイルが変更されたことになっていて、しかもリセットしても変更が消えないという謎な現象。
何度リセットしてもmodified状態。
一度リポジトリを消して、もう一度クローンしなおしても、いきなりmodified状態。
マジ困った。
diffを見ると改行コードの変更のみっぽいけど、リセット直後でもmodifiedなのが謎。
で、調べたところ、どうも「.gitattributes」というファイルの中にある「* text=auto」という記述が原因くさい。
私の環境では「core.autocrlf = false」に設定していて改行コードは変換しないことにしているんだけど、.gitattributesではautoになっているので、この辺がカチ合っているんじゃないかという予想。
とりあえず、.gitattributesはなにか特別に設定しいていなければ消して大丈夫です。
まとめ。
・Visual StudioでGit管理のプロジェクトを作ると、.gitattributesというファイルが作られる。
・core.autocrlfの設定をしている人は要注意
・.gitattributesは特別設定していなければファイルごと消してOK
というのが、Visual Studio 2013でWPFなプログラムを作っていて、それをGitで管理していたところ、何かの拍子に変更した覚えのないファイルが変更されたことになっていて、しかもリセットしても変更が消えないという謎な現象。
何度リセットしてもmodified状態。
一度リポジトリを消して、もう一度クローンしなおしても、いきなりmodified状態。
マジ困った。
diffを見ると改行コードの変更のみっぽいけど、リセット直後でもmodifiedなのが謎。
で、調べたところ、どうも「.gitattributes」というファイルの中にある「* text=auto」という記述が原因くさい。
私の環境では「core.autocrlf = false」に設定していて改行コードは変換しないことにしているんだけど、.gitattributesではautoになっているので、この辺がカチ合っているんじゃないかという予想。
とりあえず、.gitattributesはなにか特別に設定しいていなければ消して大丈夫です。
まとめ。
・Visual StudioでGit管理のプロジェクトを作ると、.gitattributesというファイルが作られる。
・core.autocrlfの設定をしている人は要注意
・.gitattributesは特別設定していなければファイルごと消してOK
AndroidのGeofenceの制限とか調べてみた
2013.11.07.Thu.00:41
すごい広島の第25回に行って、もくもく調べたことのまとめ記事です。
○ Geofenceとは
位置情報を使って仮想的な柵を作成し、その柵の中に入ったらアクションを起こすというものです。
例えば、会社の近くに移動したら○○するといったことができる機能です。
APIリファレンス
利用ガイド
このGeofenceAPIを利用するにあたり、どんな制限があるのか調べてみました。
○ 登録できるGeofenceの数
登録できるGeofenceの数は最大100個です。
http://developer.android.com/reference/com/google/android/gms/location/LocationStatusCodes.html#GEOFENCE_TOO_MANY_GEOFENCES
これは、各アプリ毎の制限らしいです。
(全ユーザーの合計ではない。デバイスにインストールされたアプリ毎の制限)
○ フェンスの大きさ
フェンスの大きさが小さすぎると、基地局を使った測位時にうまくフェンスが働かないことがある。
http://stackoverflow.com/questions/16851795/android-creating-geofence-not-working-in-the-3g-network
別の回答によると「半径100m以上にしといた方がいいよ」とのこと。
○ Geofenceの登録時はネットワーク接続が必要?
調査中ですが、ネットワークに接続できていない状態ではGeofenceの登録ができない?
逆に、オフライン状態でGeofence内に入った時にどうなるのかも不明。
いろいろと便利そうな機能なので、もう少し調べて使いこなせるようになりたいですね。
○ Geofenceとは
位置情報を使って仮想的な柵を作成し、その柵の中に入ったらアクションを起こすというものです。
例えば、会社の近くに移動したら○○するといったことができる機能です。
APIリファレンス
利用ガイド
このGeofenceAPIを利用するにあたり、どんな制限があるのか調べてみました。
○ 登録できるGeofenceの数
登録できるGeofenceの数は最大100個です。
http://developer.android.com/reference/com/google/android/gms/location/LocationStatusCodes.html#GEOFENCE_TOO_MANY_GEOFENCES
Your app has registered more than 100 geofences. Remove unused ones before adding new geofences.
これは、各アプリ毎の制限らしいです。
(全ユーザーの合計ではない。デバイスにインストールされたアプリ毎の制限)
○ フェンスの大きさ
フェンスの大きさが小さすぎると、基地局を使った測位時にうまくフェンスが働かないことがある。
http://stackoverflow.com/questions/16851795/android-creating-geofence-not-working-in-the-3g-network
別の回答によると「半径100m以上にしといた方がいいよ」とのこと。
○ Geofenceの登録時はネットワーク接続が必要?
調査中ですが、ネットワークに接続できていない状態ではGeofenceの登録ができない?
逆に、オフライン状態でGeofence内に入った時にどうなるのかも不明。
いろいろと便利そうな機能なので、もう少し調べて使いこなせるようになりたいですね。
Windows8.1でJoystickの状態を取得する 2
2013.09.12.Thu.01:19
久しぶりに余裕ができたので、すごい広島の第17回に行ってきました。
(あれ、この書き出し、前回もやったぞ…)
さて、今回もJoystickの状態を取得する方法の調査です。
前回はボタンの現在の押下状態などをバイト列から推定しましたが、ボタンの数などが分かっていないと、いろいろなコントローラに対応できません。できれば、何もわからない状態からボタンの数などを取得したいので、その方法について調べました。
デバイスのボタンの数などを取得する方法ですが、HIDデバイスではレポートディスクリプタによってデバイスが持っている機能を表しているそうなので、このレポートディスクリプタを取得する方法を探してみます。
まず、HID APIを眺めてみます。
HidDeviceクラスを見てみると、GetBooleanControlDescriptions関数とGetNumericControlDescriptions関数があります。名前から考えるとこのあたりが怪しいです。
前回の調査で、方向キーはX軸とY軸がそれぞれ0~255であらわされていることが確認できました。これはNumericControlだと思われるので、GetNumericControlDescriptionsで取得できるはずです。
GetNumericControlDescriptions関数の引数を見てみると、
となっています。
reportTypeはInputReportで間違いないでしょう。
問題はusagePageとusageIdです。JoystickのUsagePage(0x01),UsageId(0x04)を指定してみましたが、nullが返ってきます。HID Usage Tablesを確認してみると、"Table 6:Generic Desktop Page"の表の中にX,Y,Zの文字があります。あやしいです。
こんな感じで取得すると、numericControl.LogicalMaximumが255とか、それらしい値が取得できます。
ただ、あくまでUsageIdを指定して取得することしかできないため、どの軸に対応しているかは取得してみてnullじゃなかったら…みたいな処理になると思われます。つまり、ある程度、対象デバイスについて知っておく必要があります。
まぁ、デバイスの列挙時にUsagePageとUsageIdでJoystickに制限していますので、大して問題ないでしょう。
ここにたどり着くのに少し時間がかかりました。
ボタンが何個ついているかは、GetBooleanControlDescriptions関数で調べられそうです。
関数の引数は先ほどと同様です。
問題はまたもusagePageとusageIdです。JoystickのUsageIdにはそれらしい値がありません。
先ほどのHID Usage Tablesをずーっと見ていくと、UsagePage(0x09)にButtonという項目があります。あやしいです。
UsageIdが0x01から順番にボタン番号となるようなので、10個ボタンのあるコントローラーなら、UsageIdが0x01~0x0AまでHidBooleanControlDescriptionが取得できるはずです。
GetNumericControlDescriptions関数とGetBooleanControlDescriptions関数を使えば、コントローラーのボタン数などは推定できそうだということが分かりました。
次回は、コントローラーについているスティックとボタンの数を推定し、画面に表示できるよう実装します。
(あれ、この書き出し、前回もやったぞ…)
さて、今回もJoystickの状態を取得する方法の調査です。
前回はボタンの現在の押下状態などをバイト列から推定しましたが、ボタンの数などが分かっていないと、いろいろなコントローラに対応できません。できれば、何もわからない状態からボタンの数などを取得したいので、その方法について調べました。
□ レポートディスクリプタを取得する
デバイスのボタンの数などを取得する方法ですが、HIDデバイスではレポートディスクリプタによってデバイスが持っている機能を表しているそうなので、このレポートディスクリプタを取得する方法を探してみます。
まず、HID APIを眺めてみます。
HidDeviceクラスを見てみると、GetBooleanControlDescriptions関数とGetNumericControlDescriptions関数があります。名前から考えるとこのあたりが怪しいです。
□ GetNumericControlDescriptionsで方向キーの対応を確認する
前回の調査で、方向キーはX軸とY軸がそれぞれ0~255であらわされていることが確認できました。これはNumericControlだと思われるので、GetNumericControlDescriptionsで取得できるはずです。
GetNumericControlDescriptions関数の引数を見てみると、
GetNumericControlDescriptions(
HidReportType reportType,
ushort usagePage,
ushort usageId
)
となっています。
reportTypeはInputReportで間違いないでしょう。
問題はusagePageとusageIdです。JoystickのUsagePage(0x01),UsageId(0x04)を指定してみましたが、nullが返ってきます。HID Usage Tablesを確認してみると、"Table 6:Generic Desktop Page"の表の中にX,Y,Zの文字があります。あやしいです。
var numericControl = device.GetNumericControlDescriptions(
HidReportType.InputReport,
0x01,
0x30);
こんな感じで取得すると、numericControl.LogicalMaximumが255とか、それらしい値が取得できます。
ただ、あくまでUsageIdを指定して取得することしかできないため、どの軸に対応しているかは取得してみてnullじゃなかったら…みたいな処理になると思われます。つまり、ある程度、対象デバイスについて知っておく必要があります。
まぁ、デバイスの列挙時にUsagePageとUsageIdでJoystickに制限していますので、大して問題ないでしょう。
□ GetBooleanControlDescriptionsでボタンが何個ついているか確認する
ここにたどり着くのに少し時間がかかりました。
ボタンが何個ついているかは、GetBooleanControlDescriptions関数で調べられそうです。
関数の引数は先ほどと同様です。
問題はまたもusagePageとusageIdです。JoystickのUsageIdにはそれらしい値がありません。
先ほどのHID Usage Tablesをずーっと見ていくと、UsagePage(0x09)にButtonという項目があります。あやしいです。
UsageIdが0x01から順番にボタン番号となるようなので、10個ボタンのあるコントローラーなら、UsageIdが0x01~0x0AまでHidBooleanControlDescriptionが取得できるはずです。
□ まとめ
GetNumericControlDescriptions関数とGetBooleanControlDescriptions関数を使えば、コントローラーのボタン数などは推定できそうだということが分かりました。
次回は、コントローラーについているスティックとボタンの数を推定し、画面に表示できるよう実装します。