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

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

2015年12月9日水曜日

開発業務のチーム内チャットツールとしてZulipを導入してみた感想

最近Dropboxがオープンソースとして公開した「Zulip」というチャットアプリ(サーバとクライアント)を社内に試験導入してみました。

もともとIRCを使っていたのですが、周知したいメッセージを送ったのに誰かが接続されてなくて「それ知らない」が発生したり、過去ログがなくて「あのときどう言ったっけ?」みたいなのを探せなかったりして不満があったからです。

ざっくり使ってみた感想としては、悪くもなく、良くもなく、といったところです。

サーバ構築

Ubuntu 14.04.3を仮想サーバとして用意しました。
その上で公式の手順をコピペでセットアップしました。

すると5番目の黒四角「su zulip -c /home/zulip/deployments/current/scripts/setup/initialize-database」で失敗しました。

下の説明を読むと「Zulip in production READMEを読んで/etc/zulip/settings.py」を編集しろ、と。
以下のように編集しました。※カッコは設定値の例
シングルサインオンは使わず、メールサーバも暗号化なしの25番ポートです。

  • EXTERNAL_HOSTにホスト名をFQDNで(zulip.myoffice.co.jp)
  • ZULIP_ADMINISTRATORに自分のメールアドレス(hypermiod@myoffice.co.jp)
    ※後述しますが、管理者用のメールアドレスを用意しておく方が良いかもしれません。
  • ADMIN_DOMAINにドメイン?(myoffice.co.jp)
  • AUTHENTICATION_BACKENDSは先頭のEmailAuthBackendの行をコメントアウト
  • EMAIL_HOSTには社内のメールサーバをFQDNで(smtp.myoffice.co.jp)
  • EMAIL_PORT = 25
  • EMAIL_USE_TLS = False
  • DEFAULT_FROM_EMAILは適当にドメイン部分を置き換え(Zulip <zulip@zulip.myoffice.co.jp>)
  • NOREPLY_EMAIL_ADDRESSも同様(noreply@zulip.myoffice.co.jp)
なお最初ERROR_REPORTINGをFalseにしておくのを忘れてしまいましたが、後から変更できました。

設定を変更してから再度5番目の「initialize-database」を実行するとうまくいき、続いて最後の「su zulip -c /home/zulip/deployments/current/scripts/restart-server」で起動しました。

ユーザ登録

Chromeで「http://zulip.myoffice.co.jp/」へアクセスすると、自動的にhttpsへ転送されます。
証明書の警告画面を強行突破すれば、ログイン画面が表示されます。

Registerへ進み、ZULIP_ADMINISTRATORに設定したアドレスで登録すると、「Activate your Zulip account」というタイトルの確認メールが届くので、本文中のリンクからアクティベートします。

これでログインできました。

ぱっと見の印象は「分かりづらい」でした。
英語と言うこともありますが、画面に見えている要素が何なのか知識がなかったからです。

要素

  • ストリーム(Stream)
    チャットのグループです。購読(Subscribe)できるユーザを制限できたりします。
    基本的には管理者がプロジェクトごとなどの単位で作成しておくと良いでしょう。
     
  • トピック(Topic)
    ストリームの中で会話を分けるためのものです。
    画面左のストリームを開くと、トピックの一覧が表示されます。
    トピックを削除することはできません。ミュート(Mute)することはできます。
    ただトピックへの投稿が減れば一覧末尾の(more topics)へ押しやられるので普段目にすることはなくなります。

初期設定

右上の歯車メニューから色々と変更しました。

  • Manager Streams
    チーム共通、プロジェクトごとのストリームを作りました。一応すべてPrivateとし、メンバを制限しています。
     
  • Settings
    Display Settingsで24時間表記にしました。
     
  • Administration
    Your organization's nameを「○○チーム」と変更しました。
    ブラウザのタイトルに反映されます。

気づいたことなど

  • 最初は自分が管理者です。「Administration」設定で他のユーザも管理者にできます。
     
  • 管理者のみに有効な項目は一般ユーザには見えません。
    当然と言えばそうなのですが、管理者からするとどの項目が一般なのか分かりづらいです。事前に管理者専用のメールアドレスを作成しておいて、常用するメールアドレスをそのまま管理者としないほうが良い気がします。 
     
  • IEはダメなようです。IE11だとログイン後の画面でずっと「Loading」が終わりません。
     
  • 後から参加したユーザは、それまでのやりとりが見えないようです。つまりStreamに「使い方」みたいな投稿をしても、肝心な人に届きません。
     
  • 検索がダメっぽいです。日本語だと何も見つかりませんし、英語も見つかったり見つからなかったり。というか"topic"や"stream"でもBotのメッセージしか見つかりません。
     
  • ブラウザではなくWindowsやMacのクライアントもあるのですが、動作しませんでした。インストール後起動時にドメインを指定しろ、とあるので「zulip.myoffice.co.jp」を指定したのですがいつまでも画面が真っ白でした。
    自己証明書だからか、とこのページにあった--allow-insecureオプションも指定してみましたが変わらず。
というわけで「なんかイマイチ」感が漂いますが、そのうち良くなるかなと思いながら使ってみることになりました。できればコントリビュートとかしたいのですが時間が・・・。


2015年11月27日金曜日

build.gradleの依存ライブラリのバージョンが勝手に変更されてしまう

Android Studioでアプリ開発をしています。

アプリのbuild.gradleとライブラリのbuild.gradleでそれぞれdependenciesに

compile 'com.google.android.gms:play-services-maps:8.1.0'

と書いているのですが、気づくとアプリ側だけ

compile 'com.google.android.gms:play-services-maps:8.3.0'

と勝手に書き換わっています。

このままではそれぞれに含まれるバージョンが違うせいか実行しようとすると

AGPBI: {"kind":"simple","text":"com.android.dex.DexException: Multiple dex files define Lcom/google/android/gms/ads/identifier/AdvertisingIdClient$Info;","sources":[{}]}

というエラーが表示されてしまいます。

(adsで問題がでているのは、おそらくライブラリ側でanalyticsを依存に書いていて、それがadsに依存しているから)

これは最新版を使えという思し召しなのでしょうか・・・なぜ片方だけ・・・謎です。

古いアプリを移行してきたので当面はバージョンを変えたくないのですが。

2015年11月7日土曜日

[解決]Playストアで「サーバーからの情報の取得中にエラーが発生しました」が出るときの対策

先日、古いAndroidタブレットを初期化したら使い物にならなくなったことで大変困りました。

これが意外なことで解決したのでご報告します。

やったことはズバリ『「Google Play開発者サービス」を強制的に上書きインストール(更新)すること』です。

「Google Play開発者サービス」のアプリ本体(APK)を取得できさえすれば後は簡単です。

手順は以下の通り。


  1. WebブラウザでAPK Downloader(http://apps.evozi.com/apk-downloader/)を開く
  2. 先頭の入力欄を1回クリックする
  3. ↑で別のタブが開いたり別のページへ遷移したら戻る(ただの広告です)
  4. 再び入力欄をクリックして「com.google.android.gms」と入力する
  5. すぐ下の「Generate Download Link」を押す
  6. 「Click here to download com.google.android.gms now」ボタンが表示されたら押してAPKをダウンロードする
  7. なんとかしてAndroid端末へAPKファイルを転送する
  8. Android端末でAPKファイルを開いてインストールする

5まで実行したときの画面はこんな感じです。

7については、私はBluetoothで転送しました。
メールに添付したり、microSDカードなどを使ったりするのも良いと思います。

ページ内の「QR Code」の「View」を押すと別タブでQRコードが開くので、おそらくそこからダウンロードできるかと思います。Android端末にQRコードリーダが付いている場合これが一番簡単かもしれません。

「Google Play開発者サービス」さえ更新してしまえば、Playストアも普通に使えるようになりました。

お困りの方は、是非試してみてください。