投稿

ラベル(Coding)が付いた投稿を表示しています

C#で子クラスのTypeから継承元インタフェースのジェネリック引数を得る方法

外部で定義された型のインスタンスに対してアレコレするフレームワークを作っている時、 ジェネリクスで指定された型が知りたくなる時がある。 言語はC#。 "How to detect Type of generic property, in other words generic argument, from derived class" https://gist.github.com/kazyx/9cdc033dd3bf19724b5253c759705a8f

GitLab CIでUnityスクリプトのユニットテストがしたかった話 (2)

GitLab CIでUnityスクリプトのユニットテストがしたかった話 (1)   の続き。 前回は Unity アクティベーションの壁に阻まれたので、今回は Unity のクラスライブラリを DLL 参照のみで乗り切ろうとした。

GitLab CIでUnityスクリプトのユニットテストがしたかった話 (1)

作成中のUnityエディタ拡張のコード規模が徐々に大きくなってきて、まれにデグレが発生するようになってしまった。 私はプロジェクトの隅々まで超人的な気配りができるスーパーエンジニアにはなれなかったので、自動でユニットテストが実行される環境が無いとこのままでは精神の安定が保てない。

UWP 対応 Locana for Windows 10 をようやくリリース

イメージ
ソニー製 Wi-Fi デジカメ用リモコン撮影・コンテンツ転送アプリ 「Locana」 の Windows 10 版をようやく正式リリース。 Locana - Windows Apps on Microsoft Store Windows Phone 8.1 版に搭載されていた全ての機能を移植し、UI デザインは Windows 10 らしく刷新した。 もちろん UWP なので、デスクトップもタブレットもサポートしている。

Bintray のパッケージをマージしてみた

イメージ
Mavenアーティファクトのリネーム 思うところあって、とあるライブラリのバージョンアップ時に Maven のアーティファクト名を変更することにした。 すると当然だが Bintray の管理画面がこうなる。 実質同じなので古いほうが邪魔だ。消したい。

UWP アプリで Wi-Fi Direct プッシュボタン接続

イメージ
はじめに 何月だか忘れてしまったが、 Windows 10 が正式リリースされた時に公開されたこのページ。 What's new for developers in Windows 10 Wi-Fi Direct API update The device broker is updated to enable pairing with devices without leaving the app. Additions to the   Windows.Devices.WiFiDirect namespace also let a device make itself discoverable to other devices, and let it listen for incoming connection notifications. Note   In this release, the Wi-Fi Direct feature improvements are not built into the UX, and they support only push-button pairing. Also, this release supports only one active connection. 意訳すると、 アプリ画面を開いたままWi-Fi Directのペアリングができるようになりました プッシュボタン方式のペアリングだけがサポートされています 同時接続数は1本のみです という感じだった。 じゃあ試してみるかということで Xperia を相手に色々試していたのだが、何をやっても PIN 入力(相手が PIN 表示)方式でしかペアリングができなかった。自分が接続したい本命の相手はプッシュボタンしか受け付けてくれないのでこれは困る。 諦めていたのだが、11月30日に Windows 10 v1511 (Build 10586, Threshold 2) 向けのSDKが配布されていた。 What’s New for Developers in the Windows 10 SDK Build 10586 Update どうやらWi-Fi Direct関連でもAPI追加...

ButterKnife から Data Binding Library に載せ替える話

はじめに Google IO 2015 で Data Binding ライブラリが発表されました。 当時は他のサポートライブラリと同様に dependencies に追加して使う感じだったのですが、Android Plugin for Gradle 1.5.0 から Build tools 内に取り込まれたようです。 面倒なfindViewById()を楽にする方法といえば ButterKnife が一般的でしたが、公式でサポートツールが提供されるのであれば乗り換えるのも検討する価値はあります。 このエントリを作成している Android Plugin for Gradle 1.5.0 時点ではまだ ベータ版とのことなので、仕様はまだ変わる可能性があります。 Data Binding Guide Please note that the Data Binding library is a   beta release .

Java のライブラリを JCenter で公開する手順まとめ

イメージ
はじめに Android Studio から Android プロジェクトのビルドも Gradle で実行されるようになりました。 Gradle では Maven リポジトリで配信されているライブラリが非常に簡単に使えるので、自作のライブラリを JCenter や Maven Central で公開する効果はこれまで以上に高くなっていると思います。 そこで最近、Github で公開している Java のライブラリを JCenter で公開してみたので、その手順をまとめました。 下記の2ページ参考にしています。 GradleでBintrayにアップロードする手順 How to distribute your own Android library through jCenter and Maven Central from Android Studio 前提 Gradle でビルドできる Java プロジェクトであること。 やりたいこと Gradle でライブラリのアップロードをすること アップロードしたライブラリには署名がされていること 上記が可能な build.gradle を Github にそのまま置けること 自分だけが Bintray へのアップロードをできること 自分以外もビルドはできること

Android 6.0 Marshmallow (API Level 23) ではローカルデバイスIDが取得できない(確定)

Android M preview 2 で自分のMACアドレスとBDアドレスが取得できない  の続きです。 先日 Android SDK 6.0 の最終盤がリリースされました。 Build.VERSION_CODES.M のままで Build.VERSION_CODES.MARSHMALLOW になってなかったりするのでしれっともう一回更新されるかもしれませんが、まあ少なくとも仕様はほぼ最終版だと信じてもいいでしょう。 Android アプリ開発者が怯える Behavior Changes のページに、今回から Access to Hardware Identifier の項目が追加されました。 To provide users with greater data protection, starting in this release, Android removes programmatic access to the device’s local hardware identifier for apps using the Wi-Fi and Bluetooth APIs. The WifiInfo.getMacAddress() and the BluetoothAdapter.getAddress() methods now return a constant value of 02:00:00:00:00:00 . ユーザデータ保護の目的のため、ローカルデバイス ID はコード上から取得できなくなり、ダミーアドレスが返されます。(意訳) 回避手段はなし。

Android M preview 2 で自分のMACアドレスとBDアドレスが取得できない

先週、Android M preview のリビジョン2がリリースされました。 Support and Release Notes https://developer.android.com/preview/support.html Key changes の Remote Bluetooth/Wi-Fi MAC's now require either the   android.permission.LOCATION_FINE   or android.permission.LOCATION_COARSE   permission. が気になったので調べていたのですが、どうやらこのリリースノートは少し誤っているようです。 調べた結果を羅列すると、 Remote Bluetooth MAC (BT接続中の相手のBDアドレス) は Bluetooth 系の従来のパーミッションがあれば取得できる Remote Wi-Fi MAC が何なのかはよくわからないですが、接続先のMACアドレス?のことなら BSSID として取得できる 自分のMACアドレスとBDアドレスは取得できない  (固定の 02:00:00:00:00:00 が返ってくる) リリースノートにある、 android.permission.LOCATION_FINE と android.permission.LOCATION_COARSE は存在しない android.permission.ACCESS_FILE_LOCATION と android.permission.ACCESS_COARSE_LOCATION なら以前から存在するが、どちらをランタイムで取得しても自分のMACアドレスとBDアドレスは取得できない android.permission.LOCAL_MAC_ADDRESS というパーミッションがあるが、インストール時にもランタイムにも許可されない Issue トラッカーにも既に上がっていてステータスは Acknowledged です。 https://code.google.com/p/android-developer-preview/issues/detail?id=2427 Loca...

Windows Runtime アプリでの Wi-Fi to Cellular handover

Windows 10 Mobile で、「Wi-Fi接続が制限されている時にモバイルデータ通信を使う」という設定が追加されていました。 Android でも Lollipop 以降の Nexus ではデフォルトで同等機能が有効(ベンダーのカスタマイズによって挙動が違ったりする最悪な状況ですが)だったりしますが、API Level 21 で追加された Network 関連クラスを使用することで、通信に使われるネットワークインタフェースをアプリからバインドすることができます。 Windows 8.1 までの Windows Runtime 既存APIで、Android と同じようにインタフェースのバインドができるのか調べてみました。 UDP Windows Runtime API では、UDP 通信に Windows.Networking.Sockets.DatagramSocket を使用します。 BindServiceNameAsync(String, NetworkAdapter) メソッドを使えば NetworkAdapter を直接バインドできます。 var filter = new ConnectionProfileFilter { IsConnected = true, IsWwanConnectionProfile = false, IsWlanConnectionProfile = true }; var profiles = await NetworkInformation.FindConnectionProfilesAsync(filter); foreach (var profile in profiles) { var socket = new DatagramSocket(); await socket.BindServiceNameAsync("", profile.NetworkAdapter); ... // というわけで、こちらはデフォルトのインタフェースが Cellular に変更されても問題なし。(バインドした通りに動いてくれるなら。) TCP 生のTCP 通信には Windows.Networking.Sockets.Str...

Android の SharedPreferences データはオンメモリで保持されている

SharedPreferences 関連の不具合を調べていてAOSP のコードを見ていたら、 SharedPreferences の挙動について気づいたので Tips としてメモしておきます。 SharedPrefereces に保存した設定値は読み捨てでOK Androidアプリで設定等の小さいデータを保存するのに使用する SharedPreferences ですが、Android Framework 内では SharedPreferencesImpl   というクラスで実装されています。 SharedPreferencesImpl (Android 5.0.1) http://tools.oesf.biz/android-5.0.1_r1.0/xref/frameworks/base/core/java/android/app/SharedPreferencesImpl.java このクラスではコンストラクタでXMLファイルからデータを読み込み、 Map<String, Object>   で SharedPreferences の中身のデータを保持し続けています。 try { stat = Os.stat(mFile.getPath()); if (mFile.canRead()) { BufferedInputStream str = null; try { str = new BufferedInputStream( new FileInputStream(mFile), 16*1024); map = XmlUtils.readMapXml(str); } catch (XmlPullParserException e) { Log.w(TAG, "getSharedPreferences", e); } catch (FileNotFoundException e) { Log.w(TAG, "getSharedPreferences", e); ...

Universal Windows の GridView で特定のアイテムを選択不可にする方法

イメージ
WP8 の LongListMultiSelector で特定のアイテムを選択不可にする方法 の続き(?)です。 Universal Windows アプリへの移植 Universal Windows アプリケーション では、Phone アプリも Windows Runtime API (いわゆるMetro、Modern)アプリ用の API を使って実装します。そのため、今まで Phone アプリを開発していて Universal に移植する場合には多くのコントロールを置き換える必要があり、 LongListSelector や Toolkit の LongListMultiSelector を使用していた場合もこれに当てはまります。 前回と同じくやりたいことは、 「ViewModel の特定にプロパティの変化に応じて、既に表示済みであっても動的に GridViewItem の選択可不可が変わること」 です。 試したこと まず、試して効果がなかった方法を挙げておきます。 ViewModel に IsEnabled プロパティを追加する ItemContainerStyle で、GridViewItem の IsEnabled プロパティに IsSelectable をバインドする ItemContainerStyleSelector で、IsSelectable に応じて別のStyleを適用する 最初に気づきましたが、アイテムが選択できるかどうかは ItemContainer (GridViewItem) の IsEnabled でも制御できるようです。なので、上記の方法は IsEnabled にどのように ViewModel のプロパティをバインドするか、という観点で行っています。 ※ WP8 のときに LongListMultiSelector の中にまで手を加えたのはやり過ぎだったのかもしれません。今更ですが。 1番目の方法ですが、GridViewItem の IsEnabled は ViewModel の IsEnabled をバインドしていないので効果がありません。 2番目の方法ですが、XAMLで下記のような実装をしました。 <GridView.ItemContainerStyle> ...

WP8 の LongListMultiSelector で特定のアイテムを選択不可にする方法

イメージ
標準の Photos アプリで、複数コンテンツ選択モードに入った時の動画コンテンツのこの状態。 LongListMultiSelector を使っているようにしか見えないのだが、内部で使用されているLongListMultiSelectorItem には IsSelectionEnabled が true になった時に State.Closed (非選択モード)のままキープしてくれるようなプロパティは存在しない様子。 標準アプリなのに Toolkit カスタマイズして使ってるのか・・・ ということで、仕方がないので LongListMultiSelectorItem に IsSelectable プロパティを追加 セットされた DataContext に bool型の IsSelectable プロパティがあった場合にはそれを読み込む IsSelectable == false の場合には、State.Closed以外には遷移させない という修正を、 Toolkit に入れました 。 継承で乗り切ろうかと思いましたが、private と internal が多すぎて断念です。 それっぽく動いているように見えます。 終わり。

Xamarinを使ってみた

イメージ
今更ですが、Xamarinを使ってみました。 Xamarin: Build apps with C# and .NET for iOS, Android, Mac and Windows 簡単にいえば、C#で複数プラットフォームのネイティブアプリをコーディングできる開発環境です。 C#はJavaと比べてコードが簡潔に書ける傾向があるのでわりと魅力的です。 個人利用でサポートなし、アプリサイズ制限ありのSTARTERバージョンは無料です。 インストーラを起動するとJDKやAndroid SDK等の必要なコンポーネントが自動で全てインストールされます。 (もともとインストール済みであればスキップされます) で、とりあえずAndroidでHTTP GETするだけのアプリを書いてみました。 .NetのSystem.Net.HttpWebRequestと、JavaのJava.Net.HttpURLConnectionで指定したURLからHTTP GETするだけのアプリです。 C#だからコードが簡潔 var button = FindViewById<button>(Resource.Id.myButton); button.Click += (sender, e) => { GetDataByHttpWebRequest(input.Text); }; handler = new Handler(ApplicationContext.MainLooper); 何と言ってもイベントハンドラの実装がきれいです。 JavaでsetOnClickListener(new OnClickListener(){... と毎回書くのは実に面倒です。 また、プロパティが使えるのも大きいです。 getApplicationContext().getMainLooper() などと書く必要はありません。 HttpWebRequestとHttpURLConnectionで同じ動作を実装する private void GetDataByHttpURLConnection (string url) { var reqThread = new Thread (() => { var conn ...

C#でJSON配列のパースに苦労した話

JSONの記法では、Arrayの中に様々な型を含めることができます。 たとえば、 {"result":["str1", "str2", "str3"], "id":1} {"result":[1, 2, 3, 4], "id":1} {"result":[{"key":"val"}, {"key":"val2"}], "id":1} のような単純な配列形式であれば、 C#では次のような簡単な処理でオブジェクトへとデシリアライズできます。 C# [DataContract] class StringArray { [DataMember] public int id { get; set; } [DataMember] public string[] result { get; set; } } private void deserialize() { var json = "{\"result\":[\"str1\", \"str2\", \"str3\"], \"id\":1}"; var stream = new MemoryStream(Encoding.Unicode.GetBytes(json)); var serializer = new DataContractJsonSerializer(typeof(StringArray)); var obj = (StringArray)serializer.ReadObject(stream); Debug.WriteLine("id: " + obj.id); foreach(var str in obj.result) { Debug.WriteLine("result: ...

BuilderパターンのコードをEclipseフォーマッタにかけても見やすくする方法

イメージ
Builderパターン コンストラクタに大量の引数をセットする代わりに初期値セットするためだけのクラスを用意してそいつにインスタンス生成させる方法です。 便利なのですが、これを使って書いたコードをEclipseでフォーマッタにかけると改行位置がひどくて頭を抱えたくなります。 StringBuilderを使って適当に書いたコードです。意味はまったく無いです。 見づらくて耐えられなかったので少し考えたところ、無理やり改行させる方法があったようです。 それだけです。 おわり。