2017年9月29日金曜日

職場にOffice 365が展開されて見かけた不思議な反応

Office 2007のサポート期限間近と言うことで、とうとう職場にもOffice 365の波がやってきました。

でインストール大会が繰り広げられたのですが同僚の反応に軽くショックを受けました。

■選択インストールできないの?Access要らないんだけど
たいした容量じゃないんだし、別に入っても良いのでは。
バックグラウンドで動くわけでもなし。

■インストールが遅いんだけど
数台同時にインストール開始したらそりゃ通信ひっ迫して遅いでしょうよ。
オフラインインストールとか考えようよ。
てか未だにHDDとかやめようよ。

■Word起動しないんだけど
セーフモードで起動することで解決。
2007で入れていたアドオンのせいでWordだけ起動しなかった模様。

■OneDriveが気持ち悪いんだけど
基本的には利用しないので「使わない」なら良いんだけど、気持ち悪いって何?
裏でずっと動いてて重いとか、メモリ食ってるとかそういう反応ではなく、気持ち悪いって何?

■Officeにサインインしていると裏で設定とか同期していそうで気持ち悪いんだけど
だから気持ち悪いって何?

コレが事務職の人なら「へ~」で済むんだけど、一応IT技術屋なんだから、ちゃんとしようよ。

2017年8月4日金曜日

Xamarinのソリューションを読み込んでVisual Studioが固まるときの対処方法

.slnをダブルクリックしてVisual Studioが起動したあと固まることが何回かありました。

とりあえずbin, obj, packagesフォルダを削除したら動きました。
ついでにnuget restoreもVisual Studioでやるよりコマンドラインのほうが速いような気がするのでそうしておきました。

つまりこんなバッチファイルを作りました。

rmdir /s /q App\App\bin
rmdir /s /q App\App\obj
rmdir /s /q App\App.Droid\bin
rmdir /s /q App\App.Droid\obj
rmdir /s /q App\App.iOS\bin
rmdir /s /q App\App.iOS\obj
rmdir /s /q packages
nuget.exe restore App.sln

現場からは以上です。

2017年7月12日水曜日

Visual StudioでXamarin.Androidのリソースを追加削除するときはaapt.exeを実行しないようにしておくと速い


Visual StudioでXamarin.Androidのリソース、例えば画像をプロジェクトへ追加したり削除するとき、やけに、ものすごく時間がかかる事があります。
というか、ほぼハングしているようにしか見えません。

このときタスクマネージャの詳細を見ると「aapt.exe」がCPUを食いまくっています。

これをKillすれば少し速くなるのですが、画像の数だけ順にaapt.exeが起動されるようで50個とか追加しようとしているときは発狂します。

というわけで、プロジェクトを開いた後で冒頭の画像のようにAndroidのbuild-toolsのフォルダ名を変更し、この中にあるaapt.exeが実行されないようにするといいです。

画像の追加が終わったら元に戻せばOKです。

なおaapt.exeはbuild-toolsの中のバージョンごとのフォルダに存在するですが、実行中の1バージョンのフォルダ名だけ変更しても、次にまた別のバージョンのaapt.exeが実行されるようです。
どうせ変更するなら最上位を、ということです。

気が向いたらお試しください。

Xamarinでアプリ開発して良かったこと悪かったこと

業務でXamarin.Formsを使い、iOSとAndroid向けに同じアプリを作るということをしました。

以前はiOSとAndroidの担当が数名ずつで2チームだったのですが、仕様や実装に関する知識が分断しやすく、結果的に実装の都合を互いに押しつけあうなど問題があったのでその解決をXamarinに求めたのです。(その後他にも色々対策はしましたが)

「どうだった」と聞かれがちなので、良かった点と悪かった点を書いておこうと思います。随時追記もするつもりです。

■どんな感じだったか
  • Xamarin.Formsをベースに、たとえばPageの切り替えアニメをiOSとAndroidで同様にするなど、独自のUIフレームワークを作りました。
  • UIが絡まなくてNative機能を使いまくるところはPCL+BindingLibraryな共通ライブラリを作り、UIからはあまりNativeを意識せず実装できるようにしました。
  • UI側でNative機能を使いたいときはDependencyServiceやRendererを使いました。
  • NuGetサーバやCI環境など色々必要になりました。

■良かった点
  • 仕様に関する知識が分断しづらくなりました。
    ある画面がiOSだとこういう仕様でAndroidだと違う仕様というのが激減しました。もちろんXamarin.Formsの中で実装が異なるので挙動が違うというのは良くありましたがたいていはRendererなどで回避・調整可能でした。
  • UIフレームワークやライブラリを使う「だけ」のNative分からない人も開発に参加できるようになりました。人の融通がしやすくなるという意味で良かったです。
  • GitやiOS、Macなど今まで「食わず嫌い」だったものが少し浸透しました。
    SubVersionで止まっている人にGitを使わせたり、AndroidやWindowsしか触ったことのない人に多少なりともiOSやMacを触らせることができました。
    GitはMergeコミットだらけになったり色々アレですが、そこは具体的な悪影響が出るまで我慢です。

■悪かった点
  • 開発環境を人数分揃えるのにかなりコストがかかりました(詳しくはココ)。
    XcodeやAndroid Studioだけなら無料なのに。
  • 実装に関する知識は分断したままでした。
    Nativeを分かる人が独自のUIフレームワークやライブラリを作る担当になり、画面を作る人は別となることが多かったです。結果iOS、Android、C#それぞれで担当部分しか触らないという人はそれなりに残りました。うまく分担できたという気もしますが、もう少し「誰でも触れる」状態が作れればと思います。ただMacやMSDN付きでないとやりづらくコストもより増えてしまうので敬遠されました。
  • 問題の原因を探る階層が増えました。
    例えばUI部品を思うように配置できなかったとき、Nativeならそれらの範囲を調べれば良いのですが、Xamarin.Formsの場合はそちらの挙動も見る必要があったりして手間を感じました。
  • なにかとiOSはズルいです。
    普通に作るとどうしてもiOSアプリの方が安定しています。処理中にホームボタンを押したりしたときもiOSはただサスペンドしている感じですが、Androidは動き続けてヌルポで死ぬとか。画像を読み込む速度もiOSの方が早いです。
    さらには独自ライブラリのほうで依存関係が増えたとしても、iOSの方は簡単に取り込めるのに、Androidはアプリ側でイチイチBinding Libraryを作成してjarを取り込まないとClassNotFoundExceptionになったり。Androidはやりづらさがありました。
  • Mac Agentがアテにならない
    Windows(Visual Studio)からMacへ接続してリモートビルドをかけるための仕組みですが、Visual Studioからのデバッグ実行などは頻繁に切れて失敗します。コマンド(msbuild)からなら割と安定しているのですが。
  • Xamarinの更新がドキドキ
    XcodeやAndroid Studioであれば更新しても問題にあうことはさほど頻繁ではなかったように思いますが、Xamarinは毎回心臓に悪いです。特に今回のXamarin.Android 7.3のようにGCやMonoが変わって実行時に原因不明でクラッシュするとかやめてほしいです。
  • 依存関係が難しい
    例えば今のプロジェクトはFormsの2.3.3.180を使っているのですが、2.3.4に上げるのは難しいかもしれません。
    というのもこれと合わせてXamarin.Android.Support.v4の23.3を使っていて、AndroidのBinding Libraryのほうも同じバージョンで、と揃えた状態で、これまたバージョンを上げるとどうなるか分からないというのがあります。ただモバイル開発は基本的にバージョン上げていかないとシンドイので、近いうちに、せーの、でやることになるのだと思います。

■その他

  • 計測していないのですが、コードを共通化できた部分はさほどないと思います。
    前述の通りBindingLibraryやRenderer、DependencyServiceなども結構書きましたし。

というわけで、Xamarinは(目的と手段とスキルと制限などとコストが折り合いつけば、わりと)いいぞ。

Visual Studio for MacのmsbuildでビルドするとDEBUG定数がなくなる

ちょっと不思議な現象です。

あるXamarin.iOS(+PCL)プロジェクトを、Visual Studio for MacのIDEでビルドするとDEBUG定数があるのに、同じMac上のmsbuildでビルドするとDEBUG定数がなくなるのです。

ソース内で
#if DEBUG
#pragma warning DEBUG is defined.
#else
#pragma warning DEBUG is not defined.
#endifと書き、またmsbuildに/v:diagを付けてログをみたところ、やはり"is not defined"と出力されましたし、DefineConstantsにTRACEしか付いていないみたいでした。

Ad-Hoc|iPhone構成にDEBUGを付けたのが悪かったのだろうか。

もうしばらく調べてみます。

MacでもWindowsと同じようにNuGetパッケージを作成しPushできる

以前、Xamarinを使った開発でNuGetのパッケージを作るならWindows側で行う方がよさそうというエントリを書きました。

その後Macの環境もVisual Studio for Macになり、何となく思いつきで「sudo nuget update -self」してみました。

すると2.xだったnugetが4.xになり、Windows(nugetは3.x)でpackしたNuGetパッケージと同じようなものが生成できるようになりました。
(ZIP展開して、中身がIDっぽい値以外ファイル構成や中身が同じでした。2.xの時はだいぶ違いました)

pushも問題なくできたので、そのまま使っています。

もともとこのMacはJenkinsのいちスレーブで、nuget pack/pushするためにWindowsスレーブも使っていたのですが、Macだけで済むようになりました。

めでたしめでたし。

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

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

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ストアも普通に使えるようになりました。

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

2015年10月28日水曜日

[解決]60秒以上かかる定期処理にWakefulBroadcastReceiverは使えない

Androidで定期的にバックグラウンド処理する場合、従来はPARTIAL_WAKE_LOCKなWakeLockを使う必要がありました。

AlarmManagerでタイマーを仕掛け、タイマーで起こされたBroadcastReceiverがWakeLockでCPUをスリープしないようにしてからServiceを呼んで、Serviceでバックグラウンド処理をし、完了したらBroadcastReceiverが持っているWakeLockを解除してCPUがスリープできるようにする、という流れです。

ここでWakeLockが若干面倒なので処理を簡素化するためにできたのがWakefulBroadcastReceiverです。

公式のトレーニングにも説明が載っています。

WakefulBroadcastReceiverからstartWakefulService()でServiceを起動し、Serviceは処理が済んだらWakefulBroadcastReceiver.completeWakefulIntent()を呼ぶ。
その間はCPUがスリープしないと。

完璧です。

そう思って僕も早速これに置き換えましたが、どうもServiceの処理に時間がかかってしまいます。

もともと2分くらいなのですが、10分とか1時間とかかかっているケースもあります。ただ充電中(開発者オプションで画面付けっぱなし)は2分くらいで済んでいます。

どうも、CPUがスリープしてしまっているように思えます。が、そんなハズはとWakefulBroadcastReceiverのソースを読んでみたところ・・・

wl.acquire(60*1000);

60秒でタイムアウトだそうで。

今回のケースではアウトです。
本当にありがとうございました。

--- 20151029追記 ---

今回はWakefulBroadcastReceiverを取り込んで対処しました。
ソースを自分のプロジェクトにコピペしてpackageとタイムアウト値を変更して使いました。
Apache 2.0なライセンスなので、そこら辺はちゃんとしないといけないですね。

2015年10月27日火曜日

[解決]BOOT_COMPLETEDで起動しない機種があるときはintent-filterに誤りがあるかも

AndroidManifestにこう書いていたら、Zenfone5の電源投入時にonReceiveが呼ばれませんでした。

        <receiver android:name=".BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

カテゴリ指定を取ってこう書いたらonReceiveが呼ばれるようになりました。

        <receiver android:name=".BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

公式のトレーニングにもそう書いてありますね。

しかも最初は呼ばれない(enabled="false")ようにして、ユーザが明示的にONしたときにPackageManager経由で有効にする、というのが正しいやり方のようです。

・・・というか、このやり方なら「電源投入時に起動する」という設定を覚えておく必要がないのですね。

2015年7月29日水曜日

Windows 10をインストールして戸惑ったこと&つまづいたこと

Windows 10を早く試したくて、タブレットのMiix 2 8にインストールしました。

こちらへアクセスして32ビットバージョンを選択し、ダウンロードに90分、インストールに2時間くらいかかりましたが、先ほど無事にインストールされました。

Lumia 535を使ってPhoneのほうはTechnical Previewを使っていたので「やっぱ似てるなー」というのが第一印象です。

試しながら気づいたことを書いていきます。

  • 回転ロックがかかっていて、横画面にならなかった

    →アクションセンターを開いて「回転ロック」を解除した。
     
  • ログイン直後に開いていたスタートメニューの閉じ方が分からない

    →いったんタブレットモードをON→OFFしたら画面上のスタートボタンでメニューが閉じるようになった(謎)
     
  • OneDriveを更新しろと言われ、更新しようとしたところ「先にアンインストールしろ」と言われた

    →OneDriveは8.1の時についてきたものでアンインストールできない。通知領域のOneDriveアイコンをタップしたら同期するフォルダの選択画面がでて選択したら動いている様子(謎)
     
  • Office 365でWordやExcelなど一式をインストールしてあるけど、スタートメニューに「新しいOfficeを始めよう」という不思議なアイコンが出てきた

    →タップしたら「Officeは最新です。」という表示とSwayの紹介リンクが表示された。
      新しいOfficeって、Swayのこと・・・???
     
  • そういえばスタートメニューが縦にも並ぶようになって配置が少しおかしくなった

    →調整しなきゃ
     
  • Lenovoの「Companion」を起動したら更新を促された

    →素直にダウンロード&インストール
     

2015年7月16日木曜日

[解決] やっと繋がった!MediaPad T1 7.0がWi-FiのSSIDすら見つけてくれない時の対処方法

母親に貸そうと思っていたAndroidタブレットが使い物にならなくなったので、つい新しいのを買ってしまいました。

ちょうどガジェット系のニュースに「1万円タブレット」として出ていた「MediaPad T1 7.0」です。


職場で休み時間にセットアップしたときはZenFone 5のWi-Fiテザリングを使ったのですが、自宅でWi-Fi接続しようとして困りました。

SSIDが見つからないのです。
ご近所のと思われるSSIDはいくつも見つかるのに。

そういえば以前から、Windows 8.1タブレットのMiix 2 8も繋がらなくなっていました。

さほど使っていなかったのと、ネット閲覧程度ならZenFone 5のBluetoothテザリングで十分だったのでそのうち調べようと後回しになっていたのです。

と言うわけでググったら速攻で見つかりました

無線LAN親機に設定したチャンネルが問題だったのです。


このように「13チャンネル」(ch 13)をメインで使っていたのですが、Miix 2 8はこのチャンネルが見えないそうです。(倍速モードのチャンネルは9)



「11チャンネル」を使うようにしたら、Miix 2 8もMediaPad T1 7.0もちゃんとSSIDを見つけてくれて無事に接続できました。

◇◇◇

ちなみにこの設定は元々「自動」でしたが、大きなファイルをダウンロードするなど負荷が上がるとパソコンやスマホの通信が切れてしまうという障害がありました。

混雑しているからと自動でチャンネルを変更してしまうために起こる現象なので固定にしたのです。その際にご近所と被りづらそうな大きめの数字に設定したのが敗因でした。

分かってしまえば簡単ですが、結構長いことハマりました。