2016年10月18日火曜日

Xamarinを使った開発でNuGetのパッケージを作るならWindows側で行う方がよさそう

Xamarinを使ったアプリ開発で「共通ライブラリ」的なものを作ることになりました。

複数のアプリで同じコードを使い回せるようにしたかったからです。

  • 自作のネイティブライブラリ(Binding Library)のDLL(iOS, Android)
  • Binding Libraryを使うXamarin.NativeのDLL(iOS, Android)
  • PCLのDLL
これらのファイルをnuspecに書いて、JenkinsからXamarin Studio(Mac)側のNuGetでpackしました。

そして出来たnupkgファイルをローカルにおいてVisual Studioで読み込ませてみようとしました。

・・・が、できません。表示されないのです。

Simple NuGet Severで構築したサーバにPushするとインストールはできるのですが、アンインストールや更新ができません。(metadataが読めない的なエラーが出る)

別に作った、Binding Libraryがないnupkgだと普通にアンインストールも更新もできます。

ちょっとワケが分からなかったのですが、色々試した結果、Windows側のNuGetでpackすると多少マシになりました。

「インストール済み」を見ようとするとエラーが表示されるのですが、とりあえずパッケージを選んでアンインストールしたり更新したりはできるようになりました。

Macで作成したnupkgとWindowsで作成したnupkgを展開してdiffしてみると、テキストファイルの改行コードが一部異なったりして(これはGitの影響かもしれないけど)、まぁ違うんだなーと。

あとNuGetのバージョンもMacのほうは2.12で、Windowsのほうは3.4と異なるので、とりあえずWindowsでpack, pushするようにしました(Jenkinsおじさんが)

なんというかMSDN付きで良かったと思う、今日この頃です。


2016年10月4日火曜日

ファーウェイの端末はFLAG_ONGOING_EVENTやsetOngoingしても通知が消せる

最近HUAWEIのhonor 8をメイン端末にしました。

そこで気づいたのですが、愛用しているアラームアプリが通知領域からすぐに消えてしまっています。

アプリを起動すると通知が表示されるのですが、フリックすると消えてしまうのです。

あれ?と思って実際に作って試してみたのですがNotificationにFLAG_ONGOING_EVENTをセットしても消せました。

それならとNotificationCompat.BuilderでsetOngoing(true)してみましたが同様です。

もしかしてAndroid 6.0あたりで変わったのか?とも思いましたが、Galaxyなどでは普通に消せません。

ここで気づいたのですが「すべて消去(ごみ箱ボタン)」では消えません。
通知すべてがsetOngoingしてある場合はごみ箱も表示されません。

というわけで、とりあえずの結論としては「ファーウェイの端末だと手動で通知が消せてしまう」ようです。

なお手元のHuawei MediaPad T1 7.0(4.4.2)で通知を消そうとすると『この通知を消去すると、送信中のアプリケーションで例外が発生します。消去しますか?』という警告ダイアログが表示されました。

honor 8だと表示されないので、例外も出ていないのでしょうか。

2016年9月9日金曜日

『実践としてのプログラミング講座』のレシピ8をちょっと改造

実践としてのプログラミング講座』という本を買いました。
Kindle向けではないですが、スマホで読んでいます。

月2回程度のボランティアとはいえ私もプログラミングを教えている身なので、Chapter 4の冒頭に書かれていたような「タブとインデントをおろそかにする」のはよく分かります。

さて、レシピ8に載っていた「爆弾回しゲーム」を次回の教材にしようとして微調整しました。

ちょっとずつ増築していこうと思っているネタを少し盛っただけですが、ここにあります。



改造したのはこのあたりです。
  • 「ばくはつ」の音の前に、ばくだんが大きくなるたびに「ポヨン」を鳴らす
  • 時々「少し小さくなる」ことで単調さを減らす
  • 爆発しっぱなしもナンなので、爆発してしばらくしたら「ゲームオーバー」で終わらせる
写経では何も学ばない風なので、おそらく次回も「小さなものからコツコツと足していく」パターンで進めようと思います。

  1. 先に爆発を作る(「ひとつだけでる」を入れて動きを見る)
  2. 爆弾の「ひとつだけでる」を消して、大きくなる爆弾を作る
  3. 爆発をクローンさせて、いったん完成。
  4. 微調整1:「ポヨン」を入れる
  5. 微調整2:確立で大きくなるようにする
  6. 微調整3:確立の「それ以外」で少し小さくなるようにする
  7. 爆発を4秒後に消してゲームオーバーとする
本当は赤い導線 or 青い導線みたいなゲームになると良いのだけど、それはさらに次の改造にしたいと思います。

ちなみに『「時間が進んだ」とき』というのは、初心者にはなじみのない概念なのかなと良く思います。頭の中で「あとで」「しばらくしたら」みたいなところまで分かっていても、このブロックにはたどり着かないことが多いです。

2016年9月8日木曜日

Xamarinを使うならMacはほぼ必須になるし、おそらくMSDN付きのVisual Studioを買うハメになる

Xamarinの入門記事を読むとたいていモヤモヤします。

これなんかも丁寧に書かれていて良いと思うのですが、『Macが必要なのはXamarin.iOSでiOSアプリを開発する場合だけ』とか言っちゃうあたりが引っかかるのです。

Androidアプリだけ開発したいなら素直にAndroid Studioを使う方がラクです。
IDEとしても優秀だし、Gradleも多機能で慣れれば快適です。

Xcodeは・・・嫌いですが無料だし、iOSアプリだけ開発したいならそれで良いのです。

そして、なんなら別々にAndroid版とiOS版のアプリを開発するほうがたいていラクです。
ググれば解決することが多いから。

今からXamarinを使う場合、普通はXamarin.Formsを使いたくなると思います。
これはかなりイバラの道です。

あまりノウハウもありませんし、そもそも部品が少ないのですぐにRendererやEffectの出番となります。
何しろフリックの検知すらできないのです。フリックするならそれぞれのNativeのViewにGestureDetector的なやつをセットしてイベント拾ってジェスチャー判定してそれをXamarin側に返す・・・というコードを書かなければなりません。

つまりiOSとAndroid両方の知識が必要になってくるのです。そのうえXamarin.FormsやC#の都合が出てくるのです。よほどの超人あるいは分業ができなければムリです。

それでもXamarinを使いたいのは、何かしらのロジック部分をC#で書いて共通化したいからだと思います。

前振りが長くなりましたが、Xamarinを使うケースはたいていAndroidとiOSのアプリを開発することになると思います。

つまり、Macは必須です。

さらに個人(正確には5人以内だっけ)でやっているのであれば無料のCommunity Editionを使えますが、そうでない組織ならVisual StudioのProfessional、しかもMSDN付が必要となります。

iOS向けのビルドをしないのであれば、MSDNは不要なので、分業してiOS担当の割合を下げれば全員がMSDN付きでなくても構いません。

こうして、私の職場でもン十万支払ってライセンスを何本か買いました。

MSDNがあれば開発用にWindowsマシンいっぱい作ったり、Azureでそこそこ何かできるな・・・と企んでいます。

2016年8月10日水曜日

Xamarin.Formsでアニメーション

個々のアニメーションはこれで必要十分そう。
Xamarin.Froms でビューをアニメーションさせる - mattsuDev’s blog

ただリファレンスを見る限り、これViewのメソッドじゃないんですよね。
親クラスとかインターフェースとか見てもなさそうだし。

おそらくはViewExtensionsから来てるようなんだけどstaticメソッドだし、どんな魔法でViewクラスのメソッドとして使うようになってるのでしょうか。

ちなみにキャンセルもここにstaticメソッドとして定義されていますが、サンプルは普通にViewのインスタンスメソッドとして呼んでいます。不思議。

・・・と思って調べたらC#の拡張メソッドという仕組みだそうです。
何コレ便利。

そして、あるViewに対して単発でなくていくつかのアニメーションをまとめて発動するには、前後でBatchBegin/BatchCommitを呼ぶと良いようです。

例(たぶん):
Xamarin.Forms Manual Carousel : A custom implementation of a carousel view without platform dependency | Rocca. Creative thinking

アニメーションのメソッドはそれぞれTaskを返すようなので、完了待ちなどはこれを使うことになるのでしょう。

ただちょっと分からなかったのが、例えばViewを右に移動してから戻す、ような連続して実行する場合

boxView.TranslateTo(100, 0, 250(ms), Easing.Linear).ContinueWith(
  t1 => boxView.TranslateTo(0, 0, 250(ms), Easing.Linear));

みたいな感じにするのが良いのか、

boxView.BatchBegin();
boxView.TranslateTo(100, 0, 250(ms), Easing.Linear);
boxView.TranslateTo(0, 0, 500(ms), Easing.Linear);
boxView.BatchCommit();

のほうが良いのか・・・。

前者だと数が多いとカッコだらけでワケわからなくなりそうだし、後者だとアニメーションにかける時間を足し算しないといけないので変更に弱そうだし・・・。

Xamarin.Formsにおけるマージンとパディングについて

この2ヶ月くらいXamarinを触っています。
ちょっと前までXamarinにはマージンがなく、Layoutのパディングで頑張るしかない、という状態でした。
ところがいつのまにか追加されたようです。
Layoutクラスにパディングが、Viewクラスにマージンがあるようです。
LayoutはViewから派生しているのでLayoutには両方あるということですね。
値はいずれもThicknessというクラスです。
とりあえずは「ある」ということですが、冒頭の記事を見ると使い勝手には癖があるのかもしれません。

2016年5月7日土曜日

【予想】iPhone7に搭載される「想像もつかないような機能」は「視線検出」

永江一石さんのこちらのエントリを読みました。

iPhone7に搭載される「想像もつかないような機能」を大胆に推測する(さすがに大胆すぎ ww) | More Access! More Fun!

AppleのCEOさん、必死だなーという印象しかないのですが、おそらく何か出すのでしょう。

永江さんの予想はソーラー電池のバッテリーでしたが、それじゃーねー。

で、僕も考えてみました。

Appleっぽさを考えると2つ条件があります。

1.枯れた技術であること

iPodやiPhoneがそうであったように、枯れた技術をうまいこと仕上げて売るのがAppleです。

2.大事だと思っていたものがなくなること

iPodやiPhoneにSDカードを付けなかったように、ずっと決済チップを載せなかったように「それがないとかあり得ない」レベルのものをわざと外して、それでも「ないことが逆に良かった」的に賞賛されるのがAppleの製品です。

そう考えるとこれしかないと思うのです。

タッチパネルをなくして視線検出(+音声認識)で操作する


今までユーザをさんざんタッチパネルに順応させておきながら、それを無くすのです。

それだけだと操作できないので、ユーザの視線の動きで代替します。

Apple、視線でデバイスを操作する特許を取得!Apple TVなどに活用か - iPhone Mania









全く知りませんでしたがそれなりに研究されているようですし、Appleもすでに特許を取っているようなので、これしかないでしょう。

なお、せっかくSiriさんがいるので視線だと逆に面倒っぽいところは音声で補佐します。

たとえば「自宅までの経路!」「30分後にアラーム!」などとSiriに叫べば良いのです。

これなら「iPhoneをお持ちの誰もが買い替えを決意したくなる、素晴らしいイノベーション」に思えるし、「後から振り返った時に『これなしでどう生きていたんだ?』と思うようなもの」と感じます。

いかがでしょう。
当たるかな?

---
(追記)

公開してからググったら以下のような記事を見つけました。

iPhone 7、これまでの噂のまとめ - TeachMe iPhone

ここで「アイトラッキング」が紹介されてますね。
使わないんじゃないかと否定的っぽいですが「イノベーション」ならこれっきゃないと思うんですよねー。