Translate

BTemplates.com

Powered by Blogger.

2017年11月3日金曜日

2017-11-02 到達点メモ


昨日の続き
よく見たら、昨日の記事にVoiceTimerをKotlin化するとか書いていないが
昨日からそれの作業をしている。

おそらくkotlinに変換した場合が原因だと思われるのだが
どうもcontextとは予約語の一部として採用されている節がある。
kotlinは、get/setを使わないで全部変数で採用する部分があったので
その影響を受けている節がある
単に、変数として使っているだけなら、名前は変えたほうが良い

具体的には、以下のような注釈が付く
Call requires API level 23 (current min is 21): android.app.Fragment#getContext less... (Ctrl+F1)
This check scans through all the Android API calls in the application and warns about any calls that are not available on all versions targeted by this application (according to its minimum SDK attribute in the manifest).  If you really want to use this API and don't need to support older devices just set the minSdkVersion in your build.gradle or AndroidManifest.xml files.  If your code is deliberately accessing newer APIs, and you have ensured (e.g. with conditional execution) that this code will only ever be called on a supported platform, then you can annotate your class or method with the @TargetApi annotation specifying the local minimum SDK to apply, such as @TargetApi(11), such that this check considers 11 rather than your manifest file's minimum SDK as the required API level.  If you are deliberately setting android: attributes in style definitions, make sure you place this in a values-vNN folder in order to avoid running into runtime conflicts on certain devices where manufacturers have added custom attributes whose ids conflict with the new ones on later platforms.  Similarly, you can use tools:targetApi="11" in an XML file to indicate that the element will only be inflated in an adequate context.

あと、注意事項として、Record Espresso Testを行う場合、
自動生成されるのがjavaファイルなので気を付ける事

ただし、単純にktファイルに変換しても動かないようである
ちょっと調べてみたが、いまいち原因が掴めないため
テストコードだけはjavaで書いた方が楽かも

あと、kotlinでは、イテレーターが使えるため
for(i in 1..9)のような書き方ができる。
これが使えると本当に便利。

あと、下記のようなエラーが出た場合、Rebulidして再度Runをすれば動く

java.lang.RuntimeException: Unable to instantiate application com.aaa.nononaga.voicetimerr.ClassNoticeManager: java.lang.ClassNotFoundException: Didn't find class "com.aaa.nononaga.voicetimerr.ClassNoticeManager" on path: DexPathList[[zip file "/data/app/com.aaa.nononaga.voicetimerr-2/base.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_dependencies_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_0_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_1_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_2_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_3_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_4_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_5_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_6_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_7_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_8_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.aaa.nononaga.voicetimerr-2/lib/arm, /system/lib, /vendor/lib]]

ひとまず、VoiceTimerが一通り動くことは確認できたので今日はここまで

2017年11月2日木曜日

2017-11-01 到達点メモ


*Windows環境での話です

KotlinはAndroidStudio3.0ではデフォルトで入っているはずなのでそこはスルーする

javaフォルダをクリックして、Ctrl + Alt + Shift + Kを同時押しするか
上のメニューバーからCode → Convert Java File to Kotlin File(自分の環境下では一番下にあった。また、変換していると灰色になって選択できない状態になっている)

参考サイト:Kotlin導入
参考サイト:【Android】AndroidのJavaコードをKotlinに変換する

次はプラグインを入れる。これを入れて設定するとわざわざレイアウトファイルでIDを設定すれば、そのまま使えるようになる

Gradleのappの方に、以下の一文を追加する
apply plugin: 'kotlin-android-extensions'
その後同期をしたあとに、各Activityごとに、import kotlinx.android.synthetic.main.activity_main(レイアウト名).*
を書けばよい

参考サイト:Kotlin Android Extensions


変換した際に注意すること

・メソッド名でget~やset~のどちらかを頭にメソッド名としてつけていると
自動的に置き換えられてしまうので注意すること。

例
*getの場合
変換前:timerNumber.getTimerSec()
変換後:timerNumber!!.timerSec

*setの場合
変換前:timerNumber.setTimerSec(now_sec)//getTimerSec() =
変換後:timerNumber.timerSec = now_sec


・クラスメンバー変数で特に値の代入をしていないと、全部自動的にnullableに置き換えられてしまうので、手動でlateintに置き換えてやる必要がある


今日はここまで。

2017年10月31日火曜日

2017-10-31 到達点メモ


Timer関数はJavaで元々用意されているが、Kotlinではそれを拡張された関数がある
参考サイト:Extensions for java.util.Timer

昔、Timerを使っていたような気がしてふと過去の日記を見直してみたのだが
2017-09-05 到達点メモによると、CountDownTimerを採用していただけであって
そもそもTimerを使っていなかった。

また、2017-09-06 到達点メモによると、そもそも公式ドキュメントに
タイムアウトのような通常のタイミング操作ではHandlerの方が楽だと書いてあったので
多分そっちを採用したのだと思われる。

ざっと、Kotlinの公式リファレンスを見た限りだとそこまでTimerを使うのは難しくなさそうなので、これから使うのであれば下手にHandlerを使うよりはこっちのほうが楽かもしれない。

落とし穴がありそうなのが少し怖い所だ。

高階関数というのがあるらしい。
関数を引数とする関数のことだそうだ。

で、色々調べたところ、部分適応やカリー化という概念があるらしい。
読んでみたがいまいち必要性と理解がしきれない。
とりあえず、部分適応とカリー化は混同されやすい。
そして、そういう言葉があったという事がだけ認識しておこう
参考サイト:食べられないほうのカリー化入門
参考サイト:JavaScriptのカリー化について味見してみる
参考サイト:カリー化、部分適用、クロージャという間違いやすい三種についての簡単なメモ書き

途中で集中が切れたので今日はここまで

2017年10月30日月曜日

ApplivでVoiceTimerのアプリレビューが掲載されました。



ApplivへVoiceTimerのアプリレビューの依頼をしまして、無事掲載されましたので
レビュー内容を紹介します。
よかったら、ぜひ読んでみて下さい。

https://android.app-liv.jp/004620518/

今回レビューを依頼するのは初めてですが
依頼した時に返事がすぐに帰ってきたので
返事を貰った時は結構うれしかったです。

また、レビューの内容も聞き忘れないように音量は最大化にしておこう
ぐらいにしか思っていなかったので
それが原因で家以外では使いにくいという部分は
自分の視点では抜け落ちていた部分がでした。
そういう部分でも大変参考になりました。

Appliv様、レビューの掲載ありがとうございました。
また機会があればよろしくお願いします。


2017年10月28日土曜日

2017-10-28 到達点メモ


AndroidStudioを2.3から3.0にアップデートした際に本来フォルダ名がresのところをresourceになっている時がある。その場合はGradle自体が古い可能性があるので、それをアップデートすること。

選択して Ctrl + / で選択した部分をコメントアウトすることができる。
参考サイト:Android Studioでのコメントアウトの方法を知りたい
参考サイト:Android Studioでの選択範囲のコメント化とコメント化解除方法

nullableで呼び出した場合、3通りの対応をすることができる

一つは、安全呼び出し

val num: Int? = 1
println(num?.toString())

また、以下のような書き方でもコンパイルが通る。

val num: Int? = 1
println("aaa" + num?.toString())

また、以下のように変数がnullの場合でも、コンパイルは通るが
結果は、『aaanull』になるため、多分良い書き方ではない。

 val num: Int? = null
 println("aaa" + num?.toString())

また、単純に変数の後ろに?をつけてもnullableが解除されるわけではないらしいので
以下のような書き方だと普通にコンパイルエラーが出る

  val num: Int? = 1
  val result: Int = 1 + num?
  println(result.toString())

二つ目は、エルビス演算子です。
nullの時に返す値を指定できます。

変数のみで判別したい場合は以下のように書きます
この際に括弧を忘れると、AAA:nullと表示されるため注意が必要です。
val test: String? = null
val result_string = "AAA:"+ (test ?: "null_string")
println(result_string)


また、変数に付属する関数の返り値がnullかどうかを見たい場合は、以下のように書きます
val num: Int? = null
val result: Int = 1 + (num?.toString() ?: "666").toInt()
println(result.toString())

エルビス演算子は、左側の変数がnullableであることを前提にしてあるので
それ以外の場合だとwarningが出ます

nullを出すこと自体が推奨されないことを考えると
基本はエルビス演算子でnullの値を明示的に指定するべきだと思います。


三つ目は、!!演算子です。

nullableの後ろに!!を付けます。
具体例は以下の通りです

   val num: Int? = 1
   val result: Int = 1 + num!!
   println(result.toString())

これを使うと一番楽ではあるのですが、
そもそもの目的を考えると基本は避けたほうがいいと思います。


参考サイト:Kotlin Null Safetyについて知ろう
参考サイト:【学習kotlinシリーズ】安全呼び出し
参考サイト:最初に押さえておきたいKotlin言語仕様

Runをしようとして以下のようなエラー文が出た場合、
AndroidStudioを一度落として再度立ち上げて、Build->Clean Project
Build->Rebuild Projectをして再度Runをすればうまくいく
*再度立ち上げた後は、Build->Rebuild Projectだけでいいかもしれない

Error:Could not read path (中略)\app\build\intermediates\transforms\instantRunSlicer\debug\(以下省略)

参考サイト:Error:Execution failed for task ':app:processDebugResources'. > java.io.IOException: Could not delete folder “” in android studio

AndroidStudio3.0から、Gradleでapply plugin: 'kotlin-android-extensions'と宣言し、Activiyを使用するktファイルでimport kotlinx.android.synthetic.main.activity_main.*という風な宣言をする必要がなくなった。ただし、自動で生成しないと書かれないのでそこは注意すること

疲れたので今日はここまで


リーチ数が1千万以上の言語一覧


前回の記事で、リーチ数と言語使用者の割合みたいなのも調査したい。と書きましたが、冷静に考えてどちらかというと割合よりは実数を知ったほうが有効なのではと思ったので、そちらに調べる事にしました。

ちなみにリーチ数が1千万以上と定義したのは、1000人に1人に受け入れられるものを作れば1万になります。それを踏まえて10か国に受けられれば、10万ダウンロードはいけるのではと思ったからです。

リーチ数はAdwordsの広告表示を参考にし、Wikiの各国の公用語と
ネイティブスピーカーの数が多い言語の一覧 を基に算出しました。
なお、この際に全部の国のリーチ数を調べている訳でもなく(特に英語)
また、二つ以上ある公用語がある国は一部懇意的に一つに選択しているため、
厳密な値が出ているわけではないことを予め断っておきます。

順位言語名リーチ数
1英語405,406,779
2ヒンディー語179,093,278
3スペイン語135,585,871
4ポルトガル語119,309,849
5インドネシア語79,228,530
6日本語57,860,698
7ロシア語57,027,569
8ドイツ語55,144,370
9フランス語53,828,930
10トルコ語42,278,733
11イタリア語41,684,223
12タイ語34,290,479
13ベトナム語31,000,711
14オランダ語27,874,513
15朝鮮語26,954,362
16中国語24,495,896
17アラビア語24,388,117
18ポーランド語20,747,390
19フィリピン語(タガログ語)19,903,314
20マレー語19,878,128
21ウクライナ語13,588,617
22ルーマニア語10,697,576

大体こんな感じになります。
*2017/11/03修正。フィリピン語を追加。
参照元のwikiではフィリピン語がなく、タガログ語になっていた。
言語コードのISO 639-1では、どちらも同じtlになっていたので
少なくともAndroid上では同じ言語として扱ってよいと思う。

今回は範囲外ですが、100万台も含めるのであれば、この後にギリシア語、ベンガル語、チェコ語、タミル語、ネパール語、アゼルバイジャン語、ラーオ語となっています。
自分にとって意外にリーチ数が多いと感じたのは、スペイン語、ポルトガル語、インドネシア語だったりします。

また、自分が調査した範囲内でのリーチ数の合計が15億弱(実際はもっといると思われる。あと、一億ぐらい増えるかも)だったので、世界の人口が70億という事を考えると、5人に1人は利用していることになるので結構利用者はいると感じました。

ネイティブスピーカーの数が多い言語を基にリーチ数の実数の調査結果を書きました

2017年10月23日月曜日

人口数トップ30の国別Androidのリーチ数


AdWordsで宣伝用の広告の設定をしていたら、
国によってリーチの数が違う事に気が付いたので自身のメモ用にまとめ。
自分もリーチの意味はいまいちよくわかっていないのですが
高ければ高いほどユーザーが多いため、広告の効果が上がりやすい位に考えています。

まずは、人口の多い順をもとに実際のリーチ数と比べてみたいと思います
*2017年10月23日現在
参考サイト:国の人口順リスト(wiki)


順位国名言語人口数リーチ数
1中華人民共和国中国語1,349,335,1526,395,268
2インドヒンディー語1,224,514,327179,093,278
3アメリカ合衆国英語314,551,246270,727,941
4インドネシアインドネシア語239,870,93779,228,530
5ブラジルポルトガル語194,946,470119,309,849
6パキスタン国語はウルドゥー語。
公用語は英語
173,593,38314,426,031
7ナイジェリア英語158,423,1826,104,373
8バングラデシュベンガル語148,692,1316,432,421
9ロシアロシア語142,958,16457,027,569
10日本日本語126,535,92057,860,698
11メキシコ事実上スペイン語113,423,04762,234,671
12フィリピンフィリピン語、英語92,337,85219,903,314
13ベトナムベトナム語87,848,44531,000,711
14エチオピア 事実上アムハラ語82,949,541410,810
15ドイツドイツ語82,302,46555,144,370
16エジプト アラビア語82,121,07717,311,778
17イランペルシア語73,973,630不明
18トルコトルコ語72,752,32542,278,733
19タイタイ語69,122,23434,290,479
20コンゴ民主共和国フランス語65,965,795310,105
21フランスフランス語65,476,48647,156,968
22イギリス英語62,512,23250,667,416
23イタリアイタリア語60,550,84841,684,223
24南アフリカ共和国アフリカーンス語、
英語、
バントゥー諸語9言語
50,132,81712,309,907
25大韓民国韓国語48,183,58426,954,362
26ミャンマービルマ語47,963,0121,865,287
27コロンビアスペイン語46,294,84122,534,86
28スペインスペイン語46,076,98939,517,024
29ウクライナウクライナ語45,448,32913,588,617
30タンザニアスワヒリ語44,841,2261,622,913
番外
34ポーランドポーランド語38,276,66020,747,390
36カナダ英語、フランス語34,016,59328,287,336
50中華民国(台湾)中華民国国語23,440,27818,100,628
52オーストラリア英語22,268,38415,855,218
73ギリシャギリシャ語11,359,3467,166,961
94スイスドイツ語(スイスドイツ語)、
フランス語、イタリア語、
ロマンシュ語
7,664,3186,361,857

中国語は、GooglePlayを現在サポートしていないのでリーチ数が低いのは
想定していましたが、他の国でも極端に低い国が多いので
人口は目安程度で参考にした方がよさそうです。

じっと数字を見ていたら、ブラジルが1億で日本が5000万で怪しく思えたのでちょっとググってみたところ、MM総研によると2015年3月末のスマートフォンの契約数が6,850万件との事でしたので、会社携帯や二台持ちや契約数にiPhoneも含まれていることを考えるとそんなにおかしい数字ではないようです。
下手すると日本語でリリースするよりポルトガル語でリリースしたほうがダウンロードされるかも……。


人口から調べるのではなく、主要言語一覧から該当する国を調べていった方が早かったかもしれないですが、例を挙げると主要言語では中国語と書かれていても、実際は複数の言語が公用語だったり、別の言語だったりするのであまり鵜呑みには出来ません。

まぁ、wikiの内容をそもそも鵜呑みにするものではないと言われればそれまでですが……

ありきたりな結論ですが、なんだかんだ言って中国語を除けば英語が一番多いので迷ったらとりあえず英語で記述するのはありだと思います。
ただ、なんだかんだ言って下手な英語と下手な母国語なら、母国語を選ぶ人が多いと私は思っているので、労力と費用対効果を相談しつつ基本は母国語で対応したほうがいいと思っています。

そのうち、リーチ数と言語使用者の割合みたいなのも調査したい。

些細な話ですが、日本は法令によって公用語が規定されていないらしいので
日本に公用語はなく、日本語は飽くまで事実上の公用語らしいです。