Fry in the Web

次からこうしようと思ったことを書き残しておきます

MediatorLiveDataとTransformation

Mediator LiveDataとは

各種LiveDataとViewの仲介役をつとめてくれるライブデータです。

例えば、ゲームを作っていてアイテムA、アイテムBのいずれかの所持数が10を切ると危険の表示が出るような状況を考えてみましょう。 このような状況で解決策の一つとしてItemAの所持数が変化したことを伝えるLivedataを作り、同様のものをItemBについても作成すると考えてみましょう。 各データをView(ActivityやFragmant)で監視することによって、表示を切り替えることが可能です。

Solution 1

val itemACount:MutableLiveData<Int>=MutableLiveData()
val itemBCount:MutableLiveData<Int>=MutableLiveData()

使用側では

itemACount.observe{this,Obsrver{Toast.makeText(this,"Item Is Not Full",Toast.LONG_LENGTH).show()}} //簡単のためToastにしています。
itemBCount.observe{this,Obsrver{Toast.makeText(this,"Item Is Not Full",Toast.LONG_LENGTH).show()}}

可能ではありますが、すべてのデータに対してObserveを呼ぶのは少し面倒です。

そこで今回の紹介するMediatorLiveDataを使用することにより、複数のLiveDataがあたかも一つであるかのように扱うことができます。

Solution 2

val itemACount:MutableLiveData<Int>=MutableLiveData()
val itemBCount:MutableLiveData<Int>=MutableLiveData()

val mediator=MediatorLiveData<Int>().apply{
        addSource(itemACount) {this.value=it}
        addSource(itemBCount) {this.value=it}
}  
val itemIsNotFull: LiveData<Boolean> =Transformations.map(mediator) {
        if (it=<10)
           return@map true
        else
            false
    }

MediatorLiveDataは単にまとめる役割のみをもっています、そこでMediator自身にAddSource内で値をセットします。

使う側では通常通りに

itemIsNotFull.observe{this,Obsrver{Toast.makeText(this,"Is Not Full",Toast.LONG_LENGTH).show()}}

と行えば、ItemA ItemBのどれかが10以下になったときにLiveDataに通知してくれます。

一行でまとめられるので楽です。

雑(な)感(想)

公式の方法に沿ってTransformations を使用したんだけど、Mediator LiveData 内部で変換しちゃだめなのかな? 多分拡張性の観点から(例えば10以下じゃなくて5以下とかを追加したくなったときに困るから)そうしてるんだろうね

RecyclerView、ListViewがずれる問題

Android でRecyclerViewを使う場合、最初のデータをaddAllしたあとnotifyItemChangedすることが多いと思いますが

RecyclerViewのItem内のViewがForcusableである場合

フォーカスが途中のItemに当たって何もしてないのに4番目のViewが一番上になって表示されたりします。

解決法はItemのレイアウトのルートにdescendantFocusabilityを設定することです。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:background="?android:attr/selectableItemBackground"
    android:descendantFocusability="blocksDescendants"
    android:layout_height="wrap_content">
</LinearLayout>

これでフォーカスを奪われること無くItemを表示できます。

ちなみに android:background="?android:attr/selectableItemBackground"を設定すると、

Rippleが表示されて少し見栄えが良くなります。


記事がだいぶ消えてしまって絶望してます

アニメをMPCHCを使って60FPSで見る

PCに録画機能を備えてる人はそれを使って
PCでアニメやらテレビを見る人も多いのではないでしょうか
今回はアニメをPCで60FPSで見る方法を紹介します
今回はRADEONのグラフィックボードを使用しますのでRADEON GPUが載ったPCが対象となります

FPSとはなんぞや

FPSと言えばゲームを思い浮かべる方が多いかと思いますが、
今回のFPSはFrame Per Secondの略で1秒辺りの描画回数を指します
一般的にFPSが高いほどPCに性能が要求され、映像が綺麗に表示されます
よくぬるぬるとか言われてるやつですね
参考に動画を貼っておきます
www.youtube.com

1.まずこれをインストールします
設定とかいじらず標準状態でいいです
mpc-hc.org

2.次にBluesky Frame Rate Converterのインストーラ版をインストールします
bluesky23.yukishigure.com

MPCHCを開いてオプション→外部フィルタ→フィルタの追加→Bluesky Frame Rate Converter
f:id:WEBIFRY:20151016212855p:plain
追加されたのを確認したら優先する選択し、
追加された"Bluesky Frame Rate Converter"をダブルクリックします
f:id:WEBIFRY:20151016213225p:plain
Change Setting をクリックし、「DXVA~」と「Zero~」を選択して終了します
f:id:WEBIFRY:20151016213429p:plain
これで設定は終わりです

普通に再生して60FPSになっているか確認してみましょう
f:id:WEBIFRY:20151016213701p:plain

消費電力計測器(ワットチェッカー)買った

アマゾンで一番安かったワットチェッカー買いました
PCでBF4やってる時の電源のファンの音がものすごくって消費電力が気になってたんで…
f:id:WEBIFRY:20150928152817j:plain
ちなみにファンがうるさいのはうちのPCがこんな状態だからです
f:id:WEBIFRY:20150928152942j:plain

数日前にR9 270をR9 290へ換装したらなぜか完全に起動しなくなりケースから出した状態じゃないと
反応すらしてくれないという事態になってしまいました

電源が550Wだったので足りなかったのかな?と思い700Wに変更するも効果なし
いい機会だと思いCPUとマザボ交換するも効果なし
ケースに入れた状態でメモリ、CPU、マザボのみで電源を入れるも反応無しw
もう泣きそうでしたw
ダメ元でケースから出した状態で起動するとちゃんとBIOSまで通った!
完全に意味不明ですw

もうケースに戻す気力はなくこの状態で使うことにしました
皆さん、悪いことは言わないので自作はやめておきましょう
組み立てが好きな人以外は…

前書きが長くなりました
いろんな障壁がありましたがとりあえずGPUをR9 290に変更する事ができました
ここでの構成は


PowerColor R9 290
Core i5 4460
Plus Silver 認証700W 電源

そしてこれがR9 270とR9 290…
f:id:WEBIFRY:20150928154323j:plain
f:id:WEBIFRY:20150928154325j:plain
290は怪物です
とにかくデカい…こんなにデカいとは思ってなかった…

その大きさに見合ってBF4もさくさく動きますね、
高設定でも80FPSを割ることはないです。

そして電力の検証(写真撮り忘れましたすんません)

GPU アイドル時(PCが仕事をしてない時) 高負荷時(ゲーム中)
R9 270 38W 172W
R9 290 42W 338W

や ば い …
え、これは笑えないでしょ…
ワットチェッカー買わないほうが良かったかな…
動画再生時は双方とも120Wあたりをさまよっていたのでやはり高負荷時に差が出やすいようです
BF4はもう引退したので(何故か起動できなくなった)
現在のPCはオンボードグラフィックで使用しています
アニメなんか見るときはグラボがないとジャギーがひどいのでR9 270挿してます。

ちなみにノートPCの電力を計ってみるとアイドル時19Wでしたので
日常的に使用する場合は特別な理由がない限りノートPCを使うほうがいいかもしれません

消費電力的な結論

自作はやめておけ、結果的に値段はさして変わらない
R9 290はやばい、まさにモンスター
日常的に軽く使用するだけならノートPC買え
ゲームと動画で使わないならグラボはいらない

Android Intentまとめ

明示的インテント

誰(Activity)を呼びたいかを示して遷移するインテント

単純な画面遷移
Intent intent = new Intent(context, TestActivity.class);
this.startActivity(intent);

Intentのコンストラクタの第二引数にはアクティビティを拡張したクラス名を記述します

終了
this.finish();

ちなみに端末の戻るボタンを押した際も上の処理が行われています。

呼び出し先から結果を返して欲しい

呼び出し方は以下です

Intent intent = new Intent(context, TestActivity.class);
this.startActivityForResult(intent, REQUEST_CODE);

startActivityForResultの第二引数REQUEST_CODEはint型の定数です。
自分で1でも2でも好きなように設定して構いません
受け取った際処理分けを行うときに使います。

呼び出されるアクティビティでは以下のように結果を返します

Intent intent  = new Intent();
 intent.putExtra("key","IntentWorld");
setResult(RESULT_OK,  intent);

finish();

これで呼び出し元のアクティビティがputExtraを介してテキストを受け取れます
受け取り側はonActivityResultをオーバーライドします
このメソッドは呼び出されたアクティビティのfinish();後に呼ばれ、
第一引数に最初に設定したREQUEST_CODE、
第二引数にresultCode(Android OSにRESULT_OKとして定数が宣言されている)
第三引数にExtraを含んだIntentが入ります

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
String stringData=data.getStringExtra("key");
              Toast.makeText(this, stringData, Toast.LENGTH_LONG).show();
       
    }
}||<

*暗黙的インテント
***検索
検索出来ます
>|java|
String query = "Fly the Web";
Intent i = new Intent(Intent.ACTION_WEB_SEARCH);
i.putExtra(SearchManager.QUERY, query);
startActivity(i);
URLを開きます
String url = "http://www.google.com";
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
写真を選ばせたいときはこれ
Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
    i.setType("image/*");  
    i.addCategory(Intent.CATEGORY_OPENABLE);  

高速化の迷信

『パソコン 高速化』や『回線 高速化』などで検索すると
非常に多くの対処法などが出てきます、
先人達の試行錯誤が伺えますが、
すべてをとりあえず実行してみるというだけでは
例えばXP時代の古い情報であった場合
現在のWindows 10環境では利がないばかりか害になる恐れだってあります。
今回はこれらの迷信の真偽を検証していきます。


検証スペック
OS: Windows 10 Pro 64-bit
CPU: Intel(R) Core(TM) i3-4150 CPU @ 3.50GHz (4 CPUs), ~3.5GHz
Memory: 8192MB RAM
GPU:AMD Radeon (TM) R9 200 Series

検索ワード『パソコン 高速化』

パソコンが重い・起動が遅い | Windows高速化(XP/Vista/7/8対応)
不要なサービスを停止 - Windows8を高速化(軽くする) - PC設定のカルマ

上のようなサイトがヒットしました、
1つずつ見ていきます。

上に載っていたもので明らかに効果があるもの
  • HDDをSSDに変える
  • メモリを増設する
  • 使用していないサービスを停止する
  • 過剰な視覚効果を制限して軽量化する


SSDに換装
本当に遅いと感じているならまずはこれから実行すべきです
昔HDDからSSDに換装した時の話ですが
PC起動に毎回2分ぐらいかかっていたものが10秒以下になったのには本当に驚きました
余談ですがこの夏に秋葉原で開催されたインテルのイベントでSeq 3000Mb/sのモンスターSSDが置いてありましたw
RAID0だと思いますが、ゲームの読み込みとか2秒ぐらいなんじゃないでしょうかw
進化も速いものですね…


メモリを増設することはメモリが少ない時は絶大な効果を発揮します
コンピュータはメモリが足りなくなると仮想メモリというものを使用します
仮想メモリは補助記憶装置上(普通HDDやらSSDと呼ばれるもの)に作成されるので
作業全体が非常に遅くなってしまいます。
メモリはよく机に例えられますが、
机の上が物でいっぱいになってしまったら今使わないものを棚にしまいます。
その棚が補助記憶装置です、いちいち棚から取り出しながら作業するのは非効率的ですね
普通にブラウジングするだけなら4GBで足りるでしょう。

使用していないサービスを停止させる
これは不要な大きいサービスが起動している場合にのみ有効です
たまに大量にメモリを食う大きなサービスが起動していることがあります
しかし、それを停止させればそれ以上削れるものを探す必要はありません
小さなサービス1つ停止させたところで高速にはなりません
徹底的に停止させようとしているサイトもよく見ますが、害のほうが大きいのでやめましょう

過剰な視覚効果を制限して軽量化する
これは低スペックパソコンにおいて有効です
Vistaが不評だったのもハードウェアがAeroグラフィックに追い付いてなく、
もっさりしてたのが原因じゃないかと思っています
Windowsクラシック表示はなんとなく不格好ですし、
最近のパソコンなら気にする必要は殆どありませんが
最終手段として試すのも良いでしょう

ある程度効果があるもの
  • スタートアッププログラムを削除する
  • 軽量なブラウザやウイルス対策ソフトを導入する

スタートアッププログラムを削除する
これは不要なスタートアッププログラムが沢山ある場合に目に見えて効果が体感できます
自分の使わないプログラムは停止すべきです
しかしウイルス対策ソフトのプログラムもあるのであまりアグレッシブに削ることはおすすめしません
iPhone持ってないならiTunesHelperとかiTunesHelperとかiTunesHelperとかは止めちゃいましょう

軽量なブラウザやウイルス対策ソフトを導入する
現在のブラウザで体感で軽量なのはIEだと思います
昔はIEといえば数々の脆弱性ベンチマークスコアなども最弱のブラウザでしたが、
マイクロソフトの努力のおかげ(?)で軽さと安定性では最強です
無名のサードパティ製のもっと軽いブラウザがあるという指摘もあるかもしれませんが
セキュリティや使い勝手の観点からあまりおすすめしません
メモリがあまっているのならChromeで良いでしょう

まとめ

上に挙げたもの以外はほとんど効果が体感できません
高速化はほどほどにしましょうね(それのせいで僕は軽く累計20回はWindows再インストールしてます)

Android SDK の Versionについて

8/28日現在最新のSDKバージョンは23となっています。
Android M 6.xのSDKツールですね。
現在のGradleはこんな感じです

 compileSdkVersion 23
    buildToolsVersion "23.0.0"
    defaultConfig {
        applicationId "ebifry.net.wright"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }

普段何気なく書いているこのコードですが、詳しく説明してある本は少ないです

CompileSdkVersion

Android Developers

By default, this is set to the latest version of Android available in your SDK.

有効な最新のAndroid SDKバージョンを指定すべきです。
もちろん従来の古いSDKでもビルドは可能ですが、
最低でも4.1以上を指定するとそれ以降のデバイスにおいては
より新しい機能、より最適化されたアプリに仕上げることが出来ます。

BuildToolsVersion

これも同様に最新のものを指定すべきです
BuildToolもバージョンごとに性能が上がっており、後方互換性も良好です
極稀にバージョンが変わってビルドできなくなることがありますが(こないだ2時間位ハマった…AndroidSDKのバグだったらしい)
そのような問題が発生することがあるのは外部ライブラリを導入してる時のみですので安心してください

MinSdkVersion

これを書きたくてこの記事を書いているようなものです
Dashboards | Android Developers
現在Android 2.xのシェアは5%を切っています
これらはほぼ使われてない端末または保守的な企業の端末、
あるいは開発者のテスト用ではないですかね?
そう考えるとこれから2.xをサポートする意味は全くありません
煩雑で入り組んだ処理分けをするぐらいなら
MinSDKは15以上を指定することをおすすめします

TargetSdkVersion

ここは少し注意をしてください
アプリがサポートする最大のAPIレベルを指定します、
最新の機能が使えるようになりますが
Android公式では

indicates the highest version of Android with which you have tested your application.
As new versions of Android become available,
you should test your app on the new version and update this value to match the latest API level and thereby take advantage of new platform features.

とあるように最新の環境でテストした上で数字を上げろと書いてあります
これで困ったことは一度もないですが、一度不具合が起きると即低評価付けられるこの世の中、
しっかり確認をしておきましょうね…

以上、自分用メモでした