2017年10月29日日曜日

Googleフォトの日付がおかしい。

2017年10月21日(土)にイベントがあり、動画と写真を撮影した。
その日はそのイベントでしか撮影していないし、
そもそもGoogle端末ではないので、自宅PCで手動でGoogleフォトにアップロードした。

すると、写真は、10月21日のタグがつき、動画は10月20日になった。
は?

Googleフォトは、静止画と動画でタグが分かれるようだ。
動画の間に写真を撮ったのに、綺麗にタグが分かれている。

つまり、10月21日に静止画を配置し、動画はその次のタグにまとめられている。
タグと日付が紐づいていて、タグが1つ戻ったので、日付も1つもどって、10月20日になった。

とかいうクソなプログラムじゃないだろうな、おい。

ちなみに写真も動画も、Googleフォトのプロパティでは、ちゃんと10月21日になっている。

2017年7月21日金曜日

Androidカメラとバーコード

以前作っていたカメラアプリを、最新の自前フレームワークに対応させて復活。

と言っても、カメラのプレビュー映像が表示されるだけだが、
Androidでカメラ使ったアプリの開発経験があれば、それだけでかなり大変だと分かるはず。

で、これをバーコード読み込みに対応させるのが今回の目的。
元々は、秋葉原で購入したUSBのバーコードリーダーを800円でゲットし、
OTGケーブルで接続して使っていたのだが、
カメラでさっと読み込みしたいじゃない?

幸い、GooglePlayサービスに、バーコード読み込みのAPIがあるってことだし、
試してみることに。

実際に、カメラアプリを作ったことがあれば、
http://dev.eyewhale.com/archives/1372
ここをさっと流し読みするだけで、30分でできるはず。

まあ、実際には、足りないSDKをダウンロードしたりの時間も含まれるわけですが。
(API21、Android5.0以上じゃないと使えないっぽいです)

で、早速組み込んだアプリを実機テスト。
実機テストでおなじみの nuuX4の登場です。

いやあ、想像していたのより、さくさく読めますね。
バーコードの読み取りが成功する度に、コールバックが呼ばれるので、
ずっとバーコードをかざしていると、毎フレーム呼ばれます。
なので、自前で排他処理とかが必要。

とか、そんなのは、どうでも良し!
もっと深刻な問題が!

ネット検索すると、同じようにGooglePlayサービスでバーコード読み取りしている人はたくさん居て、皆、読み取りがすごいと、感心しているのですが…。

これ、超高性能カメラ専用APIだった!?

サンプルでは、デフォルトで背面カメラをしているのだが、
私は、正面カメラ(自撮用、フロントカメラ)で読み込みたいのです。

しかしこれが全く読み込めない。
極たまに1フレームだけ読み込めるときがあるので、プログラムが間違っているわけでは無いと思う。

実際に表示されるプレビュー映像を見れば分かるのだが、
フロントカメラの場合、バーコードの線が潰れて読み取れないような映像になっている。
バックカメラ二すると、ものすごく綺麗なプレビューが表示されて、さっと読み取れる。

nuuX4のカメラは、相当良いものだ。
バックカメラは1300万画素だし、フロントカメラも500万画素ある。
この画素で潰れて読めないとか、ありえなさ過ぎる…。

カメラの設定かもと思ったが、用意されているカメラの設定APIには大したものがない。

https://developers.google.com/android/reference/com/google/android/gms/vision/CameraSource

プレビュー解像度は、1920x1080にしているし、オートフォーカスも trueだ。
後はマクロ撮影があればいいのだが、カメラが対応していても、APIがない。

バーコード関係なく、nuuX4標準でついてるカメラアプリでも、フロントカメラは同じように潰れているので、もはや設定ではどうしようもないのかもしれないが、
そうすると、このGooglePlayサービスのバーコード読み取りAPIは、1300万画素程度ないと、使えないということか?

読み取れないって人がたまにいるけど、もしかしたら、この問題と同じなのかもしれない…。


2017年7月7日金曜日

AndroidStudioでプロジェクト

少しXenkoを触っていたけど、再び、AndroidStudioに戻ってきた。
Ver3がリリースされたって聞いたからなんだけど、プレビュー版で、安定版ではなかったので、Ver2.3.3にアップデートしただけにしておいた。

docomo withで、Android7の機種を手に入れたので、最新の機能も試してみたい。
まあ、6すら満足に触ってないけどね…。

というわけで、またフレームワークのところからいじりはじめた。
2D仕様になっていたのを OpenGL仕様に作り変えている、その続きから。

テストアプリを作るところまですら行ってない。

Activity切り替えとか、そんなに必要としていない機能も作ってるからなぁ。
まあ、カメラアプリを作るには必須なんだけど。

Androidでまともなアプリを作ろうと思ったら、Activityにstatic変数を使わないのは当然として、メンバー変数もなるべく使っちゃダメっての読んで、極限まで減らしたところ。

さて、何ゲー作るかな。

2017年5月15日月曜日

Xenko / その4

Microsoft Build tools を更新したら、エラーが減ったけど、
まだまだ大量のエラーが出ている、というのが前回の内容。

で、そのすぐ後に解決したんだけど、記事にしていなかったので、今さら解説。
解説するほどのことでもないんだけど。

出ていたエラーは、「あんたのDirectXのバージョンと合わないんだよ!」的な内容。
ツールで調べたところ、このPCの(オンボードの)グラフィックボードは、DirectX10.1まで対応しているらしい。

Xenkoは、DirectX9.0からさポートしているようだし、そういう意味ではまったく問題ないはずなのに、バージョン違い系のエラーが出ている模様。

で、

デバイスマネージャー ⇒ グラフィックボード

から、ドライバの更新をしてみたところ、なんと更新があるではないか。
そして、Xenkoを起動。

…できた!

というわけで、エラーが出ている人は、グラフィックカードのドライバ更新を試してみましょう。

実際に、Xenkoでサンプルゲームを動かしてみたけど、動作はこのPCではギリギリと言ったところ。

ただ、作り方の解説が少ないので、ここから先が苦労しそう。

2017年5月9日火曜日

Visual C# / その3

前回、VisualC#の基本的な罠に色々掛かってしまったわけだが。

その辺を回避したら、サクサク作れる。
オブジェクト指向などは、Javaで散々やってきているので、
C#独特の解放(デストラクタ)周りの、ガベージコレクトを何とかすれば良い。

それも、基本形は公開されているものをコピペでOK。

Javaで作っていた各種ツールを移植しようと思ったが、
基本部分を作ってから出ないと、気がすまないので…。

まずは、実行ログを出力テキストエリアと、結果を効率よく表示するための、
タブ切り替えを設置。
ファイル読み込み/書き込みのユーティリティは既に作ったので、
ソレを利用して、ツールのオプションを自動保存する機能も追加。

これらも、そこまで悩むこともなく、追加できたので、ようやくツール本体へ。
ツール本体を作成するには、画像の合成が必要だが、先に作っていた独自イメージクラスで基本はOK。
塗りつぶし処理を追加するくらいでできた。
(Javaでいうところの、Paint が、Brushになっている程度)

そこで、100枚程度の細かい画像パーツを1枚のテクスチャに敷き詰める処理を移植。
Javaでは、独自にクイックソートAPIを作成していたが、C#でのその部分は、LINQを使って楽をする。

サクッと単純移植した結果、1枚の生成に3秒かからないくらい。
これ、Javaとそんなには違わない。
だがしかし、アルゴリズムに改良の余地があることは分かっていたので、それを実装した結果…。

50ミリ秒。

そんなもんさ!
いくら、頑張って最適化しても、ちょこっと速くなればラッキー。
もちろん、そのちょこっとが必要なときもある。

だが、大抵は、アルゴリズムの改良の方が効果的なのだ。

50ミリ秒より速く…はできないだろうなぁ。


2017年5月6日土曜日

啓発本 / その2

前回の記事で書いた啓発本ですが。

著者の経歴の記述の中に、
「04年度に独立行政法人情報処理推進機構(IPA)より天才プログラマー/スーパークリエイターとして認定され」
という記述がある。

で、著作の78ページの「最適化」の説明の中で、プログラムで例が示されているのだが、
そのプログラムが以下である。

a←0
100回繰り返し{
 a ← a +1
 b ← b + a * 1000
}

一般人に分かりやすくするため、= を ← と書いているようだ。

これを最適化すると…

a ← 0
100回繰り返し{
 a ← a +1
}
b ← a * 1000
ループの外に出して、計算量を減らせるぜ、とのこと。

…え?
100回じゃ面倒なので、3回で考えてみよう。
上の例だと、最終的にbは、

b = 1000 + 2000 + 3000 = 6000

下の例だと、

b = 3 * 1000 = 3000

全然違うわ!!




2017年5月4日木曜日

啓発本が読みたくなったので買って来た

立ち寄った先に、ブックオフがあった。
スーパーセールで、本が全て20%引きだったのと、転職するという不安定な心理状況もあり、仕事術的な本を読んでモチベーションを上げようと思ったのだが…。
どれも面白くない(笑)

ビジネスの自己啓発本は自分に合わないようだ。
だが、帰り際に、新書ではなく、文庫の方を見たら、ちょいと面白そうな本があった。

↓これだ。

ブックオフの、中古価格で960円。
だが何故か、「レジで半額」という札が貼られており、さらに20%OFFということで、380円の低価格で購入できた。

アマゾンの批評にもあるが、多少、言葉が過ぎる部分がある。
私にもその傾向があるが(苦笑)、さすがに有料で買ってもらう書籍には向かない書き方であると、私でも思う。

だが、内容的には、面白い。
2015年初版なので、そんなに古い話でも無いし。

・プログラマだけがプロジェクトの進め方を知っている(多少誇張しすぎと思うけど)
・良いリーダー ≠ 好かれるリーダー、良いリーダー = 完遂できるリーダー

まさにその通り。
そして、今の会社で完遂できているプログラマのリーダーは…。
多分、私だけである。

ここ数年でリリースしてきたプロジェクトを見てみよう。

・PS3のゲーム
・3DSのゲーム3プロジェクトのセット

これが私が関わってきたライン(プロジェクト)だが、評価は上々。
3DSの1本目~2本目の間は2ヶ月しかない=2ヶ月で作ったんだぜ。
それで、そこそこの評価がもらえているのがスゴイところ。

そして、もう1つのライン(プロジェクト)だが、

・Vitaのゲーム(1)
・Vitaのゲーム(2)

(1)の方は発売延期、(2)の方は、納期厳守のため、内容ボロボロ…。

念のため付け加えておくと、(2)のリーダーは頑張った方である。
(1)の方は…正直言って、誰がリーダーがすら分からない状態だった。

合間合間に、スマホのプロジェクトもあったのだが、どれもリリースにすら至らず…。
どれも端から見てる分には、リーダーとして引っ張る人が居ない…というのが感想。

そんな状態なのに、私が辞めることに、大賛成のようだからな。
まあ、頑張ってくれ(笑)

2017年4月27日木曜日

Xenko / その3

ようやく、Xenkoのプロジェクトが起動できた。

…というか、起動の一歩手前まで行った(笑)

昨日、大量のエラーが出ていたのだが、各種設定を見直して、
最低限のエラーだけが出るところまで修正。

その結果、Microsoft Biuld Tools の最新版が入ってないからでは?
という結論に。

ネットを探しまくって、ようやく、最新版をGET。
C#のToolsを入れてみたら、プロジェクトの作成は問題なくでき、
Xenkoが起動した(Unityっぽいツール画面が一瞬表示された)。

その後、

「Xenko Game Studio は動作を停止しました」

というあのウインドウが出てあえなく終了。
まだまだ先は長そうだ。

2017年4月25日火曜日

Xenko / その2

インストールについては、全く問題なく終了。
自動的にランチャーが起動し、最新バージョンのインストールも問題なく完了。

テンプレートやサンプルがたくさんあるが、
まずはサンプルゲームがあるので、そのプロジェクトを起動してみよう。



クソツールwww
サンプルの起動でこのエラー。
横のスクロールバーを見れば分かるとおり、大量のエラーですよ!

なにこれ。

その他のプロジェクトを作ろうとしても、全部このエラーが出る。
もうこの時点で、やる気0。

Unityはサクッとプロジェクト作れたぞ。

Unity、C#と来て…

Unityを触りつつ、C#のおさらいをやっている最中ですが。

新ゲームエンジンがリリースされました。

C#で開発できるオープンソースのゲームエンジン「Xenko」が4月25日にリリース。個人利用は無料で,Pro版も7月まで無償
http://www.4gamer.net/games/378/G037845/20170425022/

C#で開発できるゲームエンジン!
使いやすさ、機能性などで、どこまでUnityに対抗できるのか…?

早速インストール中。
以前触ったものでは、一応2Dも作ることはできたので、
その辺りも、Unityに対抗できそうではある。

ここまで広がったら、Unityでいいじゃないか、とも思うが、
Xenkoは、一応「オープンソース」らしいじゃないか。
つまり、バグFixやカスタマイズも自分で可能…なはず。

あ、.NET FRAMEWORK4.6.2を要求されたので、サクッとOKしたが、
これ、Cドライブに入るんじゃないか…。
容量が…。

…。
インストール完了。
Dドライブにインストールできたから、Cドライブは殆ど無傷だったが…。


いまどき、本当に16MBで済むんか?(笑)


ランチャーから、Xenkoを起動した直後の画面。
プロジェクトのテンプレートが並んでる!
2Dゲームっぽいのがないな。
TOP-DOWN RPGってのがそれかな?

センサーデバイスのサンプルや、物理系のサンプルもあるな。
Unityと違って、参考書がないから、YouTube漁ったりしないと、サッパリワカランね。


2017年4月22日土曜日

Visual C# / その2

とりあえず、簡単なフォームパーツを配置して、アプリを作ってみる。

以前(5年以上前)には、ボタンを押したら、45度回転するフォーム、なんてのが15分もかからず作れたし、実際今でも、超簡単だった。

…のだが。

なかなかに酷い罠にはまったので記録しておくことにした。

まず、基本である、Windowsフォームアプリのプロジェクトを作成する。


そして、ツールボックスから、必要なパーツを配置していく。


ここのまま作っていけば、問題はない。
…のだが。
例えば、ボタンを押したときの機能を作りたければ、ボタンをダブルクリックすると自動的にコードが挿入される。それはいい。

だがしかし。
なぜか、ラベルをダブルクリックしてもコードが挿入される。


正直、ラベルをクリックさせる仕様を作るヤツがアホなので、ラベルをクリックさせる必要は全く無いのに、この仕様。

しかも、配置したパーツから、一度「label1」を削除して、次のラベルを配置すると、
同じ「label1」という名前で配置される。
だが、それをダブルクリックして挿入されるコードは、


このように、違う名前で生成される!なんてこったい。
この画像で言うと、上の赤い四角のAPIは、全く使われないゴミコードだ。

しかし、こういうことを繰り返すと、どれがゴミコードか分からなくなることもあるはず。

で、ゴミコードじゃないコードを削除してしまうと…。


というエラー画面が表示され、結果、


パーツ配置がリセットされた!!


これを回避するには。
この部分を展開して、コードを全て表示。


各パーツに関するブロック内にある、一番下の部分。
この行とクリック処理のAPIを削除すれば、エラーが出ずに、コードを削除することができた。

配置したパーツがリセットに、ゴミコードを挿入…。
なんだこのツール…。


2017年4月19日水曜日

Visual C#学習中

学習中といっても…。
もう20年Javaをやっているので、内容はあっという間に頭に入っていく。

Java Swingを使って、パーツを配置していくのに比べたら、
Windowsのフォームの配置なんて、寝ながらできるレベル。

で、参考書として買ったのが、これなんだが…。



総ページ数800以上!
全ページフルカラーで、2016年10月1日初版!
Windowsアプリはもちろん、スマホアプリまで解説してくれて、3500円程度って安いジャン!!

と思って買ったのだが…。
正直ヤバイ。
最初は笑っていたのだが、だんだん腹が立ってきた(-_-メ)

何がヤバイって、誤字・脱字・解説ミスが多いのなんの。
プログラム初心者向けなので、いわゆる変数や四則演算から解説しているのだが。

たとえば、73ページの以下のコード。

int x;
x = 1;

int y;
y = x;
y = 10;

Console.WriteLine(x);
Console.WriteLine(y);

これで、コンソールに、xの値として100が表示されます
なんて、書いてあるんだぜ。

109ページから、簡単なサンプルとして、金額に対する消費税金額を求めるプログラムの解説が始まる。
115ページのコードでは、確かに消費税率として、0.08という定数が書かれているのだが、次のキャプチャ画像では、50000円に対する消費税額が2500円になっている。

この時点で、この本が消費税率5%のときに書かれたものであることが分かる。
消費税が8%になったのは、2014年1月。
2016年10月初版って、最大3年近く掛かってますねぇ。それでこの内容。

他にも、消費税を切り捨てじゃなく、四捨五入にしたい場合は、この後のHINTを見てね!と書いてあるが、そんなHINTがなかったり…。

配列についての説明で、194ページに、

privateint[] array = new int[5];

という謎の型が登場し、197ページのコード解説では、

praivateint[] array = new int[5];

と、綴りすら間違えてるレベル。
ここで、怒りのブログ投稿ですよ(苦笑)

いやホント、もっともっと多いのよ!
解説がおかしかったり、日本語になってなかったり…。

本気で、乱丁・落丁として、取り替えて欲しいんですけど。

2017年4月15日土曜日

Cドライブ容量不足問題

PCでよく遭遇する問題の1つ、Cドライブの容量問題。

購入時スペックで、Cドライブは45GB。
多くはないので、出来るだけDドライブを活用してきたのだが、
最近はもう限界。

先日導入したUnityで完全に埋まってしまった。
Unityのために、なんとか3GBは確保し、Unity自体Dドライブにインストールしたのに、なぜがCドライブが1GB程度まで消費される。

もうダメぽ。

というわけで、

DiskInfo

このツールを使って、Cドライブを解析。
無駄に容量を食ってる箇所を探し出して、対処しようと試みる。

結果。
AndroidStudioで使用している、AndroidのSDKフォルダが、それ単体で、11GBも浪費していることが発覚。

とくに、API-23は、Android-TV、Android-Wearと使いもしないようなもので、1GBも使われていた。

というわけで、これらをDドライブに移動し、Cドライブの同じ場所にシンボリックリンクを張ってみた。

AndroidStudioも問題なく使用できた。
こまごまとしたファイル整理をするつもりだったが、1フォルダの移動で済むとは。


2017年4月14日金曜日

SVNを自宅にも導入したみた。

仕事では、ファイル管理として、svnを使用していたが、自宅での開発では手動バックアップのみ。

だったので、自宅にもsvnを導入してみる。

参考にしたのは、こちら。
http://ameblo.jp/k-freedom7/entry-11946273611.html

自宅用で使うのは自分ひとりだし、PC1台しかないので、apacheは不要。
特に面倒な設定はなく、サクッと導入。

問題なく導入できた。
だが、PC1台で、履歴を管理するとなると、HDDの容量の問題がでてくる。
というわけで、Googleドライブをネットワークドライブとして、アクセスできるようにしてみたくなる。

多分、これでできるんじゃないか、と妄想中。

結果、失敗

原因はまだ突き止めていないのだが、とにかく転送が遅い
サンプルで作ったUnityのプロジェクトを svnにインポートしてみたのだが…。
5時間かけて、400KBしか転送できなかった!
いまどき、キロバイトだぞ…。

一体何が原因なのか…。
svnを使わずに、割り当てたドライブにそのまま放り込んでも、同じくらい遅いので、根本的な何かが悪いようだ。



2017年4月2日日曜日

Unity学習中 / その2

ふらっとUnityをやってみようと思い(遅いわ)、ただ今参考書を元に、サンプルを作成中。
参考書はこれ。



本屋にたまたま合ったのがコレ、というのが選出の理由。
とりあえず、半分(5章)までは制覇。
ページ数的には、半分くらい。

内容も、カラーでキャプチャ画像が豊富なので、分かりやすい反面、
大部分が画像、というページは、逆に見づらい気もする。

説明の仕方もゲームを心がけており、HPゲージ付ゲームのサンプルで、
HPゲージが、円形ゲージなところは、さすがと言える。
 
初心者向けなので、プログラムの基本の変数や分岐、配列などから解説しているのだが、その割りに、細かいミスがあるところは気になる。

例えば、1秒ごとに矢を発生させるサンプルで、

if ( deltaTime > span ) 

というプログラムに対し、「経過時間が1秒以上」と説明してる点。

「以上」なら、

if ( deltaTime >= span )

が正しい。
クラスのメンバー変数についての説明で、
使用するときは、

this.score

という風に、thisを付けた方がバグを減らせると書いてある。
それ自体は間違いではないのだが、どうせなら、

int mScore;

と、メンバー変数は、mで始めるという、ルールもコラムレベルで良いから、書いていて欲しい。

ちなみに、この参考書のサンプルプログラムでは、
メンバー変数は全て、mはついていない。

それはともかく。
5章までで一通りゲームが作れる基礎(Prefabまで)はできた。
次章のシーン切り替えをマスターできれば、ひと段落だな。

2017年3月31日金曜日

Unity始めてみた。

まあ、AndroidStudioで作ってるから、自分用はそれで良いんだけど。
仕事上、Unityは必須スキルになりつつあるしね…。

ま、以前ちょっとだけやったことあるし、最近は2Dも作れるし。
コンシューマ等でのミドルウェア組み込みに比べたら、圧倒的に楽でしょ。

というわけで、まずは参考書を購入。
↓これを買ってみた。

なぜコレかと言えば、近くの大型書店にUnity本が2種類しかなく、こっちの方が良さそうだったから。
こういう本を買うときは、まず初版の日付を見るのが定石。
2016.6.29 なので、まずまず。

ついでに、EnrealEngine4の本も衝動買い。
以前どこかで紹介されてたのを見た覚えがある。


2017.1.18 なので、全く問題なし。
問題あるとすれば、私のPCがUnityで容量がパンパンになったので、
これに手を出す頃には、PC買い換える必要がありそうなこと。
となると、まずは部屋を片付けて…。
今は考えまい。

それにしても、こういう参考書も安くなったねぇ。
BREW本なんて、1冊で6000円くらいしたぞ…。

で、Unity。
こういう本のお約束で、まずは環境セッティング。
AndroidStudioは導入済みだから、純粋にUnityのみで行ける。
とはいえ、なんだかんだで、インストールに1時間くらいかかった。

その間に、最初の方を斜め読み。
さすがに、変数や子息演算、条件分岐、ループとか、
そんな解説、読む必要ないもの (^_^;

さらに、Javaやってるし、C#自体何の問題も無い。
リファレンスさえ押さえておけば、何とかなる。

さくっと3章まで読み終わり。というか3章以外は基礎知識。
3章だけで、簡単なプロジェクト生成から、実機テストまで解説してある。
必要な素材も公式サイトからダウンロードできる。

タッチしたら、画像が回転して止まる、というだけの、ルーレットのサンプルだが、
ホントに30分も掛からずに、実機で動作したわ。

AndroidStudioで1から作ったら、1時間くらい掛かるか?
PC版も同時にできると考えると、かなりの時間短縮だね。

まあ、開発用のツール群は、VisualStudioで作った方が良いんだろうが、やっぱりJavaで作ってコマンドラインから実行が楽でいいや…。
どうせ自分しか使わないし(^^;;;

1日でUnity参考書の1/3程を消化したが、このペースで行けば、1週間でマスターできるな!

コンソールへのデバッグ表示、画像を簡単に動かす、というサンプルから始まり、次の4章ではテキスト表示もあるし、この本は、かなり実用的な参考書だと思うわ。

2017年3月9日木曜日

昔の俺ぇえええ!!

ラターシュ名で、ずいぶん昔にゲームを公開していた。
今は死語だが、昔は「ホームページ」で「Javaアプレット」が動いていたんだ。

というわけで、当時のソースを引っ張りだしてきた。
(探さなくても、メインPCにずっと入ったままだのだが)

しかし、残念ながら、今時のブラウザでは、Javaアプレットは動作しない。
だが、コマンドラインから、appletviewerを使うことで問題なく動作する。

今でもそうだが、なるべくコマンドラインで全部済ますようにしていたため、
各ゲームのフォルダに入っている、コンパイル用バッチと起動用バッチで、さくっと操作できる。

ソースも、ちょっと見れば、思い出した。

なんで今さらそんなものを…?
Androidアプリを作るのに、昔のゲームを移植してみようと思ったわけだ。

ホームページ公開時には、(無料で配布していたこともあって)それなりに人気シリーズだった。
で、日の目を見なかった未公開シリーズもそれなりに数があるのだ。

それらを再度検証して、使えればみっけもの。
と思ったのだが…。

なんだこれは!!
昔の俺、すごすぎるじゃないか!
今遊んでも十分面白いミニゲーム群。

ゲームとゲームの間の演出効果、テンポ、センス。
どれも今の俺に足りないものばかりじゃないか!

これは、みっけものどころじゃないぞ。



2017年3月4日土曜日

モベリオ用アプリを考えてみる。

カメラアプリを作るぜ!と言って早2ヶ月。

全然プログラムの時間が取れなくて、時だけが過ぎていくのだが、
ゲームアプリも考え付いた。

ま、一発ネタだけど、カメラアプリと組み合わせるので、
やはりカメラが先だな(苦笑)

いや、カメラよりジャイロ機能のほうが必要なのだが、
Androidアプリでジャイロって使ったことないんだよな。

MOVERIOは、AR用途で購入したんだけど、
ヘッドトラッキング機能が付いて無いので、ジャイロ命だよなぁ。

2017年2月24日金曜日

Chromeリモートデスクトップ

簡単にPCを遠隔操作できるので、Chromeリモートデスクトップを使用している。
スマホからも操作できて、すごく便利だ。
(通信量がどれくらいか測定したことないので、WiFiじゃない場合は注意しよう)

もう3年前から使用しているのだが、当時はリリースされたばかりで、不具合だらけだった。
通信自体は安定していたが、_(アンダーバー)が入力できないなど、微妙に使い勝手が悪かったのだ。
現在は、その類の問題が全て解決し、ほぼ最強ツールになっている。

今回、実家のPCをリニューアルすべく、新たなPCを購入し、Googleアカウントも新規作成して、リモートからメンテナンスする準備を行っていた。

ここで、Chromeリモートデスクトップと、Googleアカウントに関する問題が浮上。
一応解決したので、ここに記録しておくことにした。

----
普段から使用している自分用Googleアカウントに加え、実家用を新設。

自分用アカウント
└ PC A
└ PC B
実家用アカウント
└ PC C
└ PC D

という構成だ。
だが、Chromeリモートデスクトップが、アカウント切り替えに対応していない。
これは、Googleのサポート掲示板にも書かれている。
現時点で切り替え方法はない。

ただし、スマートフォンのアプリ版には、アカウント切り替えが付いているので、数タップでサクッと切り替えられる。
スマホからのPC操作は楽ではないが。

PC版はアカウント切り替えに対応していないが、切り替えできないだけで、自分用アカウントをログアウトして、実家用アカウントでログインすれば、一応切り替えはできる

のだが、これがまた、すっごく不便、そして今回ハマッたところだ。

まずログアウトだが、Chromeの右上に表示されているものではない
これはあくまで、ChromeでGoogleアカウントにログインしているに過ぎない。

Chromeに紐づいているアカウントからログアウトするには、右上の「…」が縦になっているメニューから、「設定」を選択し、「Googleアカウントを切断」を選択する。
これでログアウト完了。
ただし、この時点で同期情報がなくなるため、ブックマークなどが全て消える。

次に同じところに表示される「Chromeにログイン」から、実家用アカウントでログイン。認証などを経て、リモートデスクトップが使用できることを確認。

同じ手順で、自分用アカウントに戻す。
同期すれば、無事に元のブックマークが戻ってくるが、やはり不便だ。

そしてここから問題なのだが…。
リモートデスクトップが使えなくなっている!
何度起動しても、元のアカウントは既に使われているので、ログインできない、と怒られるのだ。
2段階認証にしているため、毎回SMSが送られてくるので、これ絶対に怪しまれる!というくらい認証SMSが…。

これは、Chromeリモートデスクトップの起動方法に問題がある。
通常は、Chromeブラウザのブックマークバー左に表示されるChromeアプリから起動している。
だが、その起動アイコンを右クリックすることで、デスクトップにショートカットを作ることができる。
このデスクトップのショートカットが曲者で、ここにアカウント情報などが全て埋め込まれているのだ。

単純にアプリを起動するだけのショートカットにすればいい物を…。

なので、アカウント切り替えする度に、ショートカットを作り直す、という作業が必要になる。

もう一気に面倒くさくなった。
早くアプリ版のように、サクッと切り替えできるようにして!

2017年1月11日水曜日

MOVERIO カメラアプリを真面目に考えてみる / その2

MOVERIOは、自分で色々作らないと話にならない…。
ということで、まずは、カメラアプリから、作ろうということにしたんだが。

音量が小さい問題とか、Androidでタッチが認識されない問題とか。

検証アプリ作ったりで、時間取られまくったけど、ようやく本来のカメラアプリが開発できる…?

かと思いきや、MOVERIOは、やはりコントロールBOXの入力がトリッキーらしい。
こちらの記事でも書きましたが、まずは、タッチパッドで長押しすることから始まる。

実際、ギャラリーなど、Androidで共通で使われるアプリを操作してみると、正しく操作できているように思える。

例えば、タッチパッドを長押しして、カーソルが○⇒●に替わった瞬間に、左にはじくと、左フリックになる。
(ホーム画面が右にスクロールする)

だが同じことを自作アプリでやっても、Activityの onTouchEvent() にブレークが来ない!
カーソルが○のまま移動する、HOVERに関しては、がんがんブレークに引っかかってくるのだが、onTouchEvent() には、全く来ない。

と思いきや、たまに来る。

コントロールBOXは特殊な操作なので、HOVERの内部で、タッチイベントを発行しているのではないかと推測できるが、これまた検証だよ…。

ついでに、サイドの物理ボタンも検証するか。
技術資料によると…。

お、トラックパッドで取得できるイベント一覧もあるぞ。

onTouchEvent 発生することになってるな。いや発生はするけど、タイミングおかしいんだけど。

まあ、それは検証に回して、キーに関しては、

Volume Up
Volume Down
Back Key
Up
Down
Left
Right
Enter Key

通知されるのは、これくらいか。
Back Keyは使いにくいので、それ以外だな。


2017年1月10日火曜日

Androidでタッチイベントが取得できないだと!/ 解決編

Androidで初回のタッチが取得できない件が解決した。

どうやら、ナビゲーションバーの非表示が絡んでいたらしい。
ナビゲーションバーの非表示については、Activityの onCreate() で以下をするのが一般的のようだ。
View view = window.getDecorView();
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | c);

これを、GLSurfaceView を作成して、setContentView をやったあとに呼ぶのか、やる前に呼ぶのか、説明しているブログでも統一されていない。

今回のアプリの実機テストは、F-10Dと、nuuX4で行っているのだが、どちらの機種も、ナビゲーションバーは物理的に表示されていて、OFFにできない。

※上記プログラムの青色部分は、APIレベル的にF-10Dでは対応してないので注意

だが、ナビゲーションバーの表示を切り替えられる、MOVERIO BT-300で試したところ、原因が分かった。

この命令は、あくまで、ナビゲーションバーを“隠す”ものなのだ。
で、隠れた状態で、タッチすると、ナビゲーションバーが表示される。

このナビゲーションバーの表示に、1タッチ取られているから、初回のタッチは検出できず、ナビゲーションバーは一度表示されると、二度と隠れないので、そのままアプリのActivityにタッチイベントが通知される、という動作のようだ。

むむ…。

元々、ナビゲーションバーの非表示を追加したのは、MOVERIO対策。
ディスプレイに有機ELを使用しているため、長時間同じものを表示すると焼きつく、と説明があるからだ。
ナビゲーションバーなんて、同じものしか表示しないジャン!

だが、実機テストは、今まで通り、F-10Dで行っていたので、初回タッチ問題が発生してしまったわけだ。

実機テストをnuuX4に変更し、ターゲットをレベル19(Android4.4)に設定して、

View.SYSTEM_UI_FLAG_IMMERSIVE
を追加したところ、ナビゲーションバーも表示されなくなり、かつ、1タッチ目から取得できるようになった。

めでたしめでたし。

MOVERIOの技術資料を見ると、この点に触れていて、BT-300より前の機種では、専用のAPIでフルスクリーンにしていたが、BT-300では、Android標準の、上記方法でフルスクリーン化ができるようになったそうな。

もう、実機テストにすら、使えなくなってきたのか >F-10D

しまった、実機テスト用に、年末年始の安いタブレットを買っておけば良かった…!


2017年1月8日日曜日

Androidでタッチイベントが取得できないだと!/ その3

tetatailでも解決できないので、地道に自分で解析中。
まだ解決はできていません。

最近のプロジェクトは、速度重視のため、SurfaceView ⇒ GLSurfaceView に作り変えたもの。

基本システム以外、入力なども全て一旦削除(コメントアウト)して、
GLでのシステムができたので、徐々に機能を追加している途中で、
初回タッチが入力できていない、ということが発覚した。

なので、昔のプロジェクトを実行してみたところ、問題なく全てのタッチが取得できている。
ということは、

・GLSurfaceViewのタッチ入力
・その他の改良部分

のいずれかであることは間違い、ということだ。

次の検証。

GLSurfaceView をそのまま使用していた部分を、MyGLSurfaceView に変更し、
APIをラップして動作を確認してみる。

まず、onTouchEvent() だが、Activityと同様に、2回目しかコールされていない。

起動時に、onWindowFocusChanged(boolean) が、 true でコールされていることを確認。
これで、フォーカス移動に1タッチ取られている、という可能性も低くなった。

ちなみに、onWindowFocusChange() 内で、ブレークしているときに、画面を2回タップして再実行すると、やはり、1回分のタップが認識される。

ブレーク中もきちんとタッチした回数を覚えていて、その回数 -1 回、onToucheEvent() がコールされている。

以上のことから、タイミングなど不確定要素が絡んでいる可能性は低く、確実に、初回の1タップ処理が、何か別の処理に搾取されていると推測できる。

一体、何なんだ…。



2017年1月7日土曜日

teratail / Androidでタッチイベントが取得できないだと!

Androidで、初回のタッチイベントが取得できないという、
もうどうしようもないバグが出たので、
前から気になっている質問サイトに、投稿することにした。

https://teratail.com/

広告として出てくるので、見たことある人も多いと思う。
売り文句としては、

 「15分悩んで分からなければteratail」
 「最短○○分で回答が来た!」

とか、言ってるんで、だったら聞いてみよう、と。

実際の質問が、これ。
https://teratail.com/questions/61089


いやー、回答きませんな!

Google絡みの問題が発生したときにも、サポートセンターが無いので、
プロダクトフォーラムというのに質問したんだが、
これまた返事がこない。

https://productforums.google.com/forum/#!topic/google-plus-ja/W1J048JtmDY

Googleの方も、エキスパートって人が返答してくれてるが、
スレ違いだがら、スレ移動しといたわ、ってだけ。

エキスパートなら、答えてよ。
こっちは、マニュアルどおりの操作しかしていないんだから、
この程度の質問に答えられなくて、エキスパートってなんだよ…。

結局、こういうサイトって、素人がちょっと困っているってのに役立つだけで、
エンジニアが本気で困っている質問に、答えられる人は居ない

ってことの証明にしかならんわ。





2017年1月6日金曜日

Androidでタッチイベントが取得できないだと!

ごく一般的なつくり方で、いくか自分用のアプリも作ってきたのだが、
ここにきて、タッチという、超基礎の部分で不具合が発生した。

Activityの onTouchEvent() が反応しないのだ。

最初のタッチのみ反応して、2回目以降反応しない

これは良くある問題で、検索すればいくらでも対処方法はでてくる。
onTouchEvent() の最後で、

 return true

と、trueを返すようにするだけだ。

だが今発生している問題は、

初回のタップのみ反応せず、2回目以降は反応する』だ。

意味が分からない。

onTouchEvent() の内部に、ブレークポイントを仕掛けておくと、
最初のタッチでは無反応なのに、2回目以降は、しっかりブレークしてくる。

たしか、去年アプリを作った時は、こんな問題は発生していなかったはず。
こんな大きな問題を見落とすはずがない。

とすると、最近大改造して、surfaceView ⇒ GLSurfaceView にしたのが一番怪しい

MotionEvent ev = MotionEvent.obtain(10, 20, MotionEvent.ACTION_DOWN, x, y, 0);
this.onTouchEvent(ev);

↑これを使うと、疑似的にプログラムから、タッチイベントを呼べるらしい。
onCreate() の最後に付け加えると、確かに onTouchEvent が呼ばれている。

が、その後、タッチすると無反応で、2回目から反応する。

どういうことなのだろうか?

一番考えられるのは、初回、別のどこかにフォーカスが当たっていて、
初回タップで GLSurfaceViewにフォーカスが移り、反応するようになった、だろう。

念のため、起動時に、

view.bringToFront();

で、一番手前に持ってきているはずなのだが…。