2015年8月3日月曜日

【Android】勝手に背景色が変わってしまうパティーン

実は前回の記事を書いた頃から職場が変わって
前職ではメーカーで開発を行っていたが
今はサービス系の企業でAndroidアプリのコーディングを行っている.

前職は結構お堅い企業で仕様書とか依頼書とかが(鬱陶しいくらい)きっちりしてたんだけど
現職ではそういったところがちょっと抜けている.
どっちがいいのかは人次第なんだろうけど,
ソースコードのたらい回しもひどい.
その分,いろんな人のコーディングを1つのソースで見れるわけではあるが…

こういう実装方法があるのか!
があれば当たり
フフッなんでこんな実装してるの
ってのはまだいい方で
実際は拡張性のないゲロリンチョなソースコードになってたりする.

前置きっていうか愚痴はそこまでにしておいて,
今回謎な現象にブチ当たってしまったのでその解決方法をメモとして残しておく.
普通はこんな書き方しないだろって方法で起こった現象なのではあるが。。。
役に立つのだろうか.

現象は
Fragment内においてあるViewの背景色が勝手に変わってしまう
っていうもの.
View3つ(仮にA, B, Cとする)の背景色がFragment再描画と同時に変わってしまった.
これらのViewはレイアウトXMLで背景色を指定してあり,
3つとも同じ色を指定してある.
ソースコード上では一切背景色をいじっていない.
しかも再現するのは確認したところではAndroid4.04の端末のみ.

早速原因なのだが,
このA, B, Cの他にレイアウト上で同じ背景色を指定しているView Dがあり,
ソースコード上でこのView Dの背景色を変更しているのであった.
View Aの背景色だけ1ずらしてみるとView Aだけ影響を受けなくなった.

View Dの背景色変更がなぜ他のViewに影響するかは謎なのだが,
その背景色変更の書き方は綺麗ではない書き方をしていた.

具体的には
viewD.setBackgroundColor (Color.parse (getString (R.color.hoge)));
すごいよね,Colorリソースを文字列として取得して
それをColorオブジェクトにパースして
背景色に指定してある.

コードを見ると背景色に限らずこの書き方が散見された.

普通は
viewD.setBackgroundResource (R.color.hoge);
リソースが指定できないTextViewの文字色指定とかには
textView.setTextColor (getResource ().getColor (R.color.hoge));
と書くべきであり,

試しにそう書きなおしていくと現象の発生はなくなった.


上がってくる不具合報告,前任以前の既存ばかりで
ある意味勉強になる.
けどゼロから作り直したい感がすごい.

2015年6月22日月曜日

AppCompat does not support the current theme features

java.lang.IllegalArgumentException: AppCompat does not support the current theme features
 
とか怒られた。
 
いろいろ調べてみると
AppCompatではDialogがサポートされてまてん
だとか
ActionBarを非表示にしないといけまてん
だとか
色々書いてあっていろいろ試したんだけど
原因が全然違ったので備忘録

原因はActivityのonCreateでsuper.onCreateを呼び出していないこと
自動で補完されてるはずなのに消してたみたい

同じ過ちを犯してるおっちょこちょいさん向けでした

2015年1月7日水曜日

【雑感】3DS LLからnew 3DS LLに買い替えた

※注意
この記事はいつも以上に主観的内容とクソの山が大半を占めております.
効果には個人差があります.
用法・用量を守って正しくお使いください.
責は負いかねます.


この年末年始に実家に規制した時にとうとうnew 3DS LLを買ってしまった.
前から気になっていたものの,
・Cスティックなんか使わないし
・カラー赤がないし
・ZL,ZRを使うこともないし
・本体赤が選べないし
・3D機能もほぼ使わないし
・着せ替えもいらないし
・NFC?何に使うんや?
・赤がない
といった理由から
3DS LL()があるから特に買い換える必要性もないよなぁと思っていた.

3DS(LL)ユーザーがnew 3DS(LL)を見ると大体こんな印象を持つと思う.
欲しいけど買い換えるほどでもない,と

甘いですよ.そこのアナタ.
↑誰かが言ってたからこの1句使ってみたかっただけ.

軽く他のレビュー記事見てきたけど
こいつ本当にゲームやったのかと問いたくなるようなものがある.
ただの公式発表文なぞっただけじゃねーかと.
ちゃんと使ってみてこそ違いが見えてくる.

先も書いたけど
NFC機能→使わない
画面照度自動調整機能→ゲームには不向き
Cスティック,ZL,ZRボタン→使わない/そもそも対応していなくて使えない
3D機能の強化→強化されたとはいえゲーム時はオフにするのが基本
これは一般的な感覚からはそう外れていないと思う.

↑これに出てこない性能UPがいろいろとあるのです.
先に言っておくと,買ってよかったわ.
GKがいうのもなんだけど.

GKとはソニー信者という意味の蔑称.
詳しくはググれ.
モンハン次作はVitaとPS4マルチで出て
セーブデータはPSPlusで共有して外ではVita,家ではPS4.
当然Vita,PS4問わず通信可能
という仕様で出てくれ
と思ってるくらいにはGKなのである.


本筋に戻して
ここからは時系列順に書いていこうと思う

まず開梱.
表面のデザインはマットだった旧から変わって反射タイプに.
旧は旧で指紋が目立ったけど,newも指紋が目立つタイプ.
まあいいか.

側面を見渡すとコネクタやボリュームの配置が凄まじく変わっている.
背面中央にあったカートリッジ挿入口は前側面左に来ている.
何らかの意図があるのだろうか?
子供も持つものだから対戦中に不利になった友達が
カートリッジを抜こうとするのを防ぐとか?

カートリッジ挿入口の場所が変わるのはいいけど
イヤフォンコネクタの位置が前側面左端だったのが前側面中央になった
これはちょっと個人的に△
ヘッドフォンをさしたままポケットに入りにくくなった.
もう一点,スタイラスの格納場所が右側面から前側面になったけど
たぶんこれも取り出しにくくなってるので△
と言いたいけど,スタイラスなんてまず使わないからどうでもいい.

また,右側面にあったSDカードスロットが見当たらない.
なんと下パネルの内側にある.
更に下パネルを外すためにはドライバーが必要なため,簡単に入れ替えできなくなった.
これもそう入れ替えるような使い方しないならどうでもいいことだけど.

そしてSDカードではなくmicroSDになっているのは注意.
これは事前に知っておかないと本体を買ってからmicroSDを調達しに行くハメになる.
つまり本体買ったはいいがすぐに使えない事態が発生する.
幸いにもSurface PRO3に使っていない32GBのmicroSDをさしていたおかげで助かったけど.
下パネルを外すのがちょっと手間取った


電源を投入.
工場出荷状態でバッテリーにはある程度充電されているようで
即電源が入った.
なお,電源ボタンも本体前側面に移動しているが,
本体よりでっぱっていないし,大きさ自体も小さめなため
誤操作で電源を切ってしまったとかはならなさそうなデザインになっている.

なにより,操作面にあったほうが誤操作は起こっていたため
電源ボタンを操作面から外したのは◯だ.

電源を投入したはいいが,画面照度がチラチラうざい.
この時初めて知ったのだが,newには明るさ自動調整機能が追加されている.
スマートフォンなどでよくあるアレだ.
うざいからすまないが即オフ.もちろん設定でオフにできる.


さて,旧LLからnew LLへ買い替えたとなるとまず行うのが
データの移行.
データの引越しという設定があるのだが,それを行うと
・購入済みダウンロードゲームの引越し
・eショップの設定
・本体設定
等々旧LLのデータをそのままnew LLへ移行できる.
ケーブルもいらない.ローカル通信でできるのだ.
ただし,旧LLはデータを消去されるので
両方を使っていくのが困難であるとともに

電源ケーブルが2本ない場合は事前に新旧ともに満充電でないと
移行途中で電源が落ちて取り返しの付かない事態になるかもしれない.
なお,ダウンロード済みゲーム6本を移した結果
2時間以上全データの移行にかかったことを追記しておく.
電源ケーブルが1本しかなかったので都度付け替えてた.
なお,SDカード,microSDがそれぞれ扱えるPCが手元にあるなら
PCを使ってデータ移行をすることもできるので,その場合は時間が短縮されるかもしれない.しらない.


なに
ここまで苦労したこととかネガティブなことばっかじゃんって?
こっからだよ


モンスターハンター4Gしかやってないから
動作環境はそれだと思っていただきたい.

一番最初に改善したと感じた点が
ボタン配置ね.
さっき電源ボタンの移動が◯といったけど
以前旧を使ってる時にスタートボタンと押し間違えて電源を切ったことがあったんだ.
同様にHOMEボタンもスタートボタンと押し間違えたことがあったんだけど
HOMEボタンとスタート・セレクトボタンの配置が遠くなった.
HOMEボタンが十分小さくなった.
これは先の事例での誤操作がなくなるといっていいレベルの改善.
ただし慣れるまでスタートボタンを押すのに手間どう.
慣れればいいだけのハナシ.
初めてクシャルダオラ討伐したのに誤操作でセーブ前にゲーム終了するなんかより全然いい.
そういうことだよ!


そしてこれが一番大きな改善点だと思うのだが,
実行速度の向上.
これはゲーマーなら買い替えてもいいんじゃないかと思うくらい.
HOME画面からゲームの開始がまず速い.
同じくゲーム画面からHOME画面への移動も速い.
旧LLではゲーム終了時に「しばらくお待ちください」なんて画面が出てたけど
これが出なくなった.

これだけじゃない.
ゲーム中の実行速度も上がっている.
クエスト中にアイテムボックスからアイテムを取り出すときに
ひっかかる感じがあったのが取れた.
また,武具ボックスの整理でも
旧LLではソートするのに1秒程度かかっていたのがなくなった.
マップのロード・クエストのロード時間も短縮されている.

このあたりはやってみないとわからないけど
やってみるとすぐわかる.


最後にもう一点改善したと感じる点が
上画面のグラつき.
旧LLは開いた状態で本体を振ると
上画面がグラグラしてそれで遊んでたものだが,
newLLではほぼグラつきがなくなった.
ゲームプレイ時に画面がガタガタしないのはいいことだ.
ヒンジ部が固くなっている印象.


コレは好みの問題だが
固くなっているといえば
音量と3D機能のスライドボリューム,
こいつらのトルクが上がっている.
本当にこれは好みの問題.


その他の変更点にも触れてみる.

まずCスティックに関して.
まあモンハンだし?一度触ってみよう,と.
これは拡張スライドパッドの代わりにはならないと思う.
拡張スライドパッド使ったことないけど.
そもそもこれはスライドパッドではないし,
アナログスティックでもない.
ThinkPadやVaio typePのキーボード中心にあるトラックポイントと同じやつ.
視点移動は十字キーでできるから別にいいかな.


3D機能が強化された点についても言及すると
視差に合わせて?描画位置を変えているのか
旧LLではちょっと位置がずれると3Dに見えなくなったのが
newLLでは追従してくれるようになった.
それに合わせて前の方にあるオブジェクトと後ろの方にあるオブジェクトとで
言い方が難しいが顔を動かした時に位置が変わって見える

あるオブジェクトの真後ろにあるオブジェクト,
正面から見ると隠れて見えないのだが
ちょっと横から見ると見えるようになる.

つまるところ,回り込めるようになった.
これは確かに強化だわ.(ほとんど使わないけど…)

なお,画質は良くなっていません.当然です.


以上,new 3DS LLを買って一週間程度たった雑感.
なお,買い替えた理由は
親にDSiをあげると言っていたが3回連続で帰省時に持って帰るのを忘れたため
めんどくさくなって今持ってる旧LLをあげて自分はnewLLにしようと思ったため.
旧LLは親の手に渡りましたとさ.

2014年12月26日金曜日

Twitter連携アプリをPC/スマートフォンから解除する方法

Twitter連携とは

まずTwitter連携とは何なのかを解説します.
わかってる方は飛ばして頂いて構いません.

Twitter連携とは,
アナタのアカウントを「誰か」に
ツイートしたりリツイートしたり,果てはパスワード変更したり
といった操作をする権利を与えるということです.
しかも知らないうちに与えていることもあるのです.
ここではTwitter連携で不正にツイートさせられていることを
感染と呼ぶことにします.

つまりアナタのアカウントは「誰か」に乗っ取られ操られるということです.
これはかなりキツい言い方をしていますが.

よくわからない広告をリツイートしている人をたまに見かけますよね.
ひょっとしたらアナタも知らないうちに同じことをしているかもしれません.

いや,そんなアプリ持ってないし
って思うかもしれませんがちょっと一例を見てください.(昨日みかけた実例です)


Twitterでこういうツイートが流れてきました.(フォローしてる方がリツイートしてました)
顔面崩壊,先を見てみたくなる内容ですよね.
そこでリンクを踏んでみます.


するとこういう画面がでてきました.
ここで顔面崩壊の先を見たいからといってアプリを認証するを押すと,
アナタのアカウントへの操作権を誰かに渡すことになります.
そう,顔面崩壊は騙しだったのです.
よく認証画面見ましたか?性格診断imessageってなんですか?
そもそも性格診断もまずでしょう.

何らかの人の興味を集めそうな記事(動画・画像なども)があって
続きはこちらでというふうにリンクがあって
そして感染させるというのが手口になっています.
(エロ動画につられて感染している紳士も多いとか)

ボタンを押しただけなのにアプリが登録されます.
そういうものなのです.
その後,アナタのアカウントで勝手にツイートされたり
パスワード変更されて自分では使えなくなったりされるのです.

本当は,ツイートができる/パスワードの変更ができる
などといった許可が連携アプリにそれぞれ設定されていて
アプリ側からは設定外のことはできません.
それは認証画面で表示されています.
先の例だと認証すると勝手にツイートされたりプロフィール変更させたりということを許可しています.

例を見てお分かりいただけたかと思いますが
アプリと言ってもスマートフォンにダウンロードするものとは限らないのです.

では何故このようなものが存在するのか.
全くの悪というわけではありません.
本来の意図としては
まず考えられるのがTwitterクライアントアプリのため
ついっぷるやjanetter,Twitbirdなどといったクライアントアプリで
ツイートしたり設定変更をしたりするためのものです.
次に自動ツイート機能.
定期的に同じツイートをしたり,
botのようにランダムでツイートしたりするためのもの.

正しく使えば便利な機能なのですが,
おおよそ不正な使われ方をしているのです.

この項の最後に知っていただきたいのが
アナタがTwitter連携感染していると
感染させるためのツイートを行わされて
あなたがあなたのフォロワーにも感染を広げることになる
ということです.
はい,すこぶる迷惑ですよね.


自分がTwitter連携感染しているか確認する方法

では自分がTwitter連携感染しているかをどうやって確認するかですが
簡単な方法としては自分のツイート一覧をみて
自分でした記憶のないツイートをしていたり,
自分でした記憶のないツイートをリツイートしてたりしたら
まず感染しています.
しかしその方法では確実ではありませんし,
確認したところで解除できません.

パソコンが使える場合
パソコンのブラウザからTwitterにログインして
右上の自分のアイコンを押す,設定を選択,

アプリ連携を選択

すると今登録されているTwitter連携アプリの一覧が表示されるので
とりあえず片っ端から取り消してみましょう.
必要な物はまた後から追加できます.

パソコンが使えない場合
問題はパソコンが使えない場合です.
スマートフォンしか使っていない場合は
実質はパソコンの場合と同じ手順なのですが
ちょっとややこしい手順が入ります.

ややこしいのが苦手な人は次の項を見てください.
ただしAndroidのみ.

まずChromeを開きます.
「Chrome」です.
「ブラウザ」でも「Safari」でもなく「Chrome」です.


Androidの方はスマートフォンのアプリ一覧探せばあるはずです.
なければダウンロードして下さい.
https://play.google.com/store/apps/details?id=com.android.chrome&hl=ja

iPhone/iPadの方は元から入ってないのでダウンロードしてなければダウンロードして下さい.
https://itunes.apple.com/jp/app/chrome-google-nou-ebuburauza/id535886823?mt=8

そしてTwitterへアクセスしログインしてください.
ログインできれば右上のメニューボタンをクリック,

PC版サイトを見るにチェックを入れてください.

あとはPC版と同じ手順で解除できます.
強いて言うなら
https://twitter.com
にアクセスしてください.
アプリと似た画面のモバイル版(https://mobile.twitter.com)にアクセスしても設定の確認・解除はできませんよ.


Androidでめんどくさいのが嫌な場合

Android用の連携アプリ確認・解除用のアプリを作って公開しました.
TwAppRemover
https://play.google.com/store/apps/details?id=jp.mau.twappremover
無料です.広告もありません.スマートフォンの中身も見ません.
2日間で作ったので万一動かなかった場合は諦めて上記の方法を採ってください.

1銭の儲けにもならないアプリなのでこれ以上労力をかける気もありません.
今後Twitterの仕様変更で動かなくなる場合もあるかもしれませんが.

Twitterにはさっさとスマートフォン用アプリで連携解除に対応してもらいたいものです.

2014年12月21日日曜日

Live HTTP Headersのリプレイ機能が使えない点について

FirefoxのアドオンでLive HTTP Headersというアドオンがある.
HTTP通信の送受信ヘッダを見ることができるアドオンである.

十年近くまえからこのアドオンを利用していたのだが,
久々にサーバーとの対話系アプリを作成するにあたって使ってみると
ある機能が利用できないことに気づいた.

Live HTTP Headersにはリプレイ機能といって,
送信して取得したヘッダやクッキー,POSTパラメータなどを再利用して
もしくは自分で組み直して
送信することが出来る機能がある.

どのヘッダをどうすればどうなるのかという
サーバーの反応をみるのに重要な機能だったのだが
その機能が使えない.

よくよく調べてみると
このLive HTTP Headersというアドオン,
2011/05/09の版(Ver.0.17)が最新のようで
現時点で3年以上更新がない.
現時点でFirefoxはVer.34なのだが
Version 0.17 is compatible with Firefox 4.0.
とある.

じつはFirefoxのHTTP Cache API がVer2になっており
Live HTTP Headersのリプレイ機能はAPI ver1から2になるときに
削除されたAPIを使っていたようだ.

もはやこのアドオンはサポートされていないようなので
公式のアップデートは望めないのだが
有志が公開してくれている.

手元で確認したところ,リプレイ機能が使えるようになった.
この野良アドオンについて信頼するかしないかの判断を下した上で
利用していただきたい.

http://rghost.net/58012556

リンク切れになった場合は申し訳ない.
修正方法も書いてくれているので下記リンクを参照されたし.


参考:Live HTTP Headers バグリポートページ(https://www.mozdev.org/bugs/show_bug.cgi?id=25831

2014年7月4日金曜日

【Android】NinePatchの赤い点

Androidにはボタンなどに使う背景画像を
端末サイズに合わせてただ引き伸ばすのではなく,
引き伸ばすところ,引き伸ばさないところ,を
画像に設定することでどの端末で見ても
不自然にならないようにするNinePatchという機能がある.

角丸の画像で角を拡大するとぼやけるが
直線部分だけを拡大するなら問題がない.
伸ばしたい部分と伸ばしたくない部分を設定できるのだ.
人間の長所短所にもNinePatchがあればいいのにね!

このことに関してはAndroid開発者に加え,
アプリアイコンデザイナなども知っておくべき常識となる.
ただし下手に知られていると
NinePatchルールを履き違えたアイコンが送られてきたりするので
そういう場合においては鬱陶しい常識である.

常識的なことなので
こちらに関しては他のサイトにお願いするとして

Android SDK LV19のリソースを眺めてたら
こんなNinePatch画像を見つけた.

NinePatchの最外周には黒(#000000)のみではなかったのか.
しかしAndroidのリソースに赤(#FF0000)が存在するのである.
ちなみにこの画像はEditTextで使われている画像である.
入力欄に用いるあのEditTextである.

端末によってはEditTextの背景が透過されて
レイアウトが黒いと入力した文字が見えなくなってしまう
なんでやねんということから調べ始めたのだが.

なんだろう,この赤いラインは.
と思って調べてみたら
どうやらLayout Boundsという言葉がちらほら見えてきたので
それを更に探っていくと
こちらのページに行き着いた.
凄まじく丁寧に書かれている.
さすがプロという感じだ.
↑「感じ」とか抽象的な単語ばっか使うのがプロとの大きな差なんだよなまず.

全てを把握してもここまで書けない自信しか湧き上がってこない.
要するに,従来のNinePatchでは黒い線でPadding部分を設定できたが,
新しいNinePatchはそれに加え赤い線でMargin部分の設定もできる
ということらしい.
イマイチPaddingとMarginがどちらがどちらか憶えられないうんこ
しかし,残念なことにこの機能が使えるのは
Android4.3(API Lv.18)以降のみである.
これをメインで使えるのはまだ2年は先のことであろう…
その前に地球が滅んでいる可能性も微レ存

と,結局メインのポイントも他のサイト頼りじゃないか!

こういうのがおんぶにだっこというのである,
これがこのエントリの最大のノウハウだ!

余談だが,以前のエントリで
背景画像を繰り返すときにもNinePatchに関して
NinePatchの仕様を流用してパターン繰り返せるんじゃねと思いつき
とソースコードレベルで調べていたのだが
どうやら画像を抽出するあたりは
おいそれとは手も足も出せない場所(Native)だった.
ので,断念した.

うわ,まさかの余談ですら役に立たなかった模様.

赤いNinePatchに関して情報が出回ればいいなということで.
筆を,いやキーボードを叩いた次第である.

2014年7月3日木曜日

【AndEngine】テキストの色変更

AndEngineでテキストを使う場合に注意すべきこと.

// フォントは使いまわすためにメソッドローカルじゃなくクラスフィールドでもっておこう
Font font = FontFactory.create(getFontManager(), getTextureManager(), 256, 256, Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 32, true, Color.WHITE);
font.load();
// テキストの作成
Text text = new Text(0, 0, font, "aaaaaaaaaaaaaaaaa", getVertexBufferObjectManager());
// 色を指定
text.setColor(Color.RED);
// 表示
attachChild (text);

で赤い文字が表示されるのだが,
上記の通りFontFactory.createメソッドで
フォントをWHITEで取っておく必要がある
後のsetColorメソッドで色を乗せるためである.

このメソッドには引数で色を指定しないものもある.
色を指定せずにフォントを取得すると黒で取れる.
黒に色を乗せても黒のままである.

自前のビットマップフォントなどを使う場合でも同様.
黒いビットマップフォントを作ると色を変更できない.
色を変更したいのであれば白いビットマップフォントを作る必要がある.