AndroidManifest.xmlのminSdkVersionを変更しても反映されずビルドできない

さて、ADTのプロジェクトをAndroid Studioへ移す過程ではまったエラー対策の続きです。Android Studioはバージョン3.2.1です。

前回のことがあり、ようやくエラーの原因がわかりました。

C:\Android\takuru\ASdriver1\hogehoge\src\main\AndroidManifest.xml:7:5-74 Error:
uses-sdk:minSdkVersion 11 cannot be smaller than version 14 declared in library [com.google.android.gms:play-services:12.0.1] C:\Users\hogehoge\.gradle\caches\transforms-1\files-1.1\play-services-12.0.1.aar\93010549a0eaa8ce0a656b526c4ad348\AndroidManifest.xml as the library might be using APIs not available in 11
Suggestion: use a compatible library with a minSdk of at most 11,
or increase this project's minSdk version to at least 14,
or use tools:overrideLibrary="com.google.android.gms.play_services" to force usage (may lead to runtime failures)
:takuruDriver:processDebugManifest

 

ご丁寧にもダメなAndroidManifest.xmlへのリンクもあります。

「ほうほう。AndroidManifest.xmlのminSdk指定が悪いのね~ 11じゃなくって14にすればいいんでしょー?!」

っとちゃかちゃか直して、Gradle Sync。

そしたら、Sync Failured.なんですよ。なんで。(´・ω・)

また、プロジェクトをBuild→cleanします。

すると、また下記の同じエラー出てるんですよ。

Error:uses-sdk:minSdkVersion 11 cannot be smaller than version 14.....

ファッ?!ってなって、もう一度、AndroidManifest.xmlを見直したり、キャッシュを消したり、.gradleを消したり。
してみても、結果は一緒でした。。。

なんでAndroidManifest.xmlのminSdkVersionを変更しても反映されないの??と思っていたら、偶然にもAndroidManifest.xmlの下記の部分にマウスオーバーしたら

The minSdkVersion value(14) is not used. it is always overridden by the value specified in the Gradle build script (14) ...

ってメッセージが出てるんですよ。

「…あっ…」

そうですね、プロジェクトのbuild.gradleにもminSdkVersionを書くところがあり、そのほうがAndroidManifest.xmlよりも優先されるのだった。

build.gradleにある下記のminSdkVersionを直して、

android {
    compileSdkVersion 26
    buildToolsVersion '28.0.3'

    defaultConfig {
        applicationId "hogehoge.driver"
        minSdkVersion 14 //これを11から変更
        targetSdkVersion 26
    }
//以下略

AndroidManifest.xmlにあるminSdkVersionは紛らわしいので消します。

すると、やっとBuildが通り、Gradle Syncも成功しました!!( ˊᵕˋ )

Gradle project sync failed. Basic functionality (e.g. editing, debugging) will not work properly.

ADT(Eclipse)で開発していたAndroidプロジェクトに手を入れる必要があり、Android Studioへ移行しました。

とってもつらたんな作業でした…(つД`)

前も言いましたが、ビルドできるのが当たり前と思っているとイライラするので、むしろビルドできる奇跡に感謝しよう。( ̄人 ̄)

さて、今回はまったポイントがいくつかあるので、記載しておきます。

Android Studioのバージョンは3.2.1です。

一番困ったのは、タイトルのエラー。

Gradle project sync failed. Basic functionality (e.g. editing, debugging) will not work properly.

GradleのSyncをやると、出てくるんですよ。

Buildのウィンドウにはエラーが何も出てない。show error logってリンク見て、エラーログを見ても、結局失敗して終わってるな~ という以外にエラーは記載されていません。

さて、困った。

で、.gradleを消すとか、キャッシュを消すとか、Android Studio(以下、ASと略します)を再起動させるとかいろんなことを試してみたんですが、役にたったのがこれ。

①ヘッダーメニューのFile→Setting→Build, Execution,DeploymentのCompilerのCommand-line Optionsで

--stacktrace

を指定。–debugはこの場合役に立たない、とエラーメッセージが言ってますからね。

②ヘッダーメニューのBuild→Clean Project

すると、ビルドのウィンドウにメッセージが出ます。。。

あれー、前はGradle Syncの失敗でも、ビルドのウィンドウにメッセージ出たと思ったんだけど…。ASのアップデートで仕様が変わったんでしょうか。

やっとエラーの原因がわかって先に進むことができました!

【追記】最近のAndroid Studio(3.4.1)では、

--info

の方が役立つみたいです。。。

android Run with –stacktrace option to get the stack trace. Run with –info or –debug option to get more log output.

Androidでビルドできない…めっちゃあるあるですが。
むしろビルドできる奇跡に感謝しよう。

FAILURE: Build failed with an exception.
What went wrong:
Execution failed for task ‘:takuruUser:compileDebugJavaWithJavac’.
Compilation failed; see the compiler error output for details.

android Run with –stacktrace option to get the stack trace. Run with –info or –debug option to get more log output.

と出た時は、このメッセージの通り、Runするときに–info、–debugオプションをつけると、なんでビルドできないのかがわかります。

–info、–debugオプションの付け方です。

使っているAndroidStudioはAndroidStudio3.2です。

下記を参考にしました。

https://stackoverflow.com/questions/21674091/how-to-add-stacktrace-or-debug-option-when-building-android-studio-project

 

File→Settings→Build,Execution,Deployment→CompilerのCommand-line Optionsの欄に

–debug

と入れましょう。

なぜビルドできないのかがわかりますよ~⊂(^-^)⊃

pyplot 時系列のデータをCSVから読み込んで表示するサンプルコード

ちょっとマニアックかもしれませんが、時系列のデータをcsvから読み込んでグラフにします。
pyplotはmatplotlibというライブラリの中にある、Pythonのグラフを書く機能です。

グラフ大好き。pyplot好き。₍ᐢ⑅•ᴗ•⑅ᐢ₎♡

グラフにするcsvは、例えば次のようなデータのcsvです。x軸もy軸も時間なので、ちょっと変わってるかもしれませんね!

10:10:52  4:21:05
10:10:52 4:08:56
10:10:52 4:08:56
10:10:54 4:52:52
10:10:54 5:19:17
10:10:54 5:19:17
10:10:55 3:58:04
10:10:55 4:09:11
10:10:55 3:58:04
10:10:56 4:12:34
10:10:57 3:58:51
10:10:57 4:12:34
10:10:57 3:16:06
10:10:58 3:41:25
10:10:58 3:16:06
10:10:59 4:34:48
10:10:59 4:58:54
10:10:59 4:34:48
10:11:00 5:08:33

上記をtest_csv.csvという名前で保存したとして、次のようにコードを書きます。

 

import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime as dt

df = pd.read_csv('G:/test/test_csv.csv', names=['num1', 'num2'])

xlist = [dt.strptime(d, '%H:%M:%S') for d in df['num1']]
ylist = [dt.strptime(d, '%H:%M:%S') for d in df['num2']]


plt.plot(xlist, ylist, marker="o")
plt.show()

次のような図が表示されます。

ヒャッハー 楽しい~⊂(^-^)⊃

さてさて、時系列データの悩みと言えば、数が多いことですよね。(ですよね?!)

Pythonでは、間引き処理も簡単にできます。

リストのスライスを使えばいいんですね~。先程のcsvではない、多めのデータを処理するとして、次のように書きます。

import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime as dt

df = pd.read_csv('G:/test/many_datas.csv', names=['num1', 'num2'])

xlist = df['num1'][::100] #間引き処理
ylist = df['num2'][::100] #間引き処理

xlist = [dt.strptime(d, '%H:%M:%S') for d in xlist]
ylist = [dt.strptime(d, '%H:%M:%S') for d in ylist]


plt.plot(xlist, ylist, marker="o")
plt.show()

 

若干余談ですが、データを時分秒形式に直す際に

time data ' 4:21:05' does not match format '%H:%M:%S'

というエラーに悩まされました。(>_<)
下記とか見てみてもわからず…。

https://stackoverflow.com/questions/51029343/time-data-2018-06-19-112113-311-does-not-match-format

で、よく見ると’ 4:21:05’の4の前に半角スペース入ってるじゃんwwww

下記のようにすれば解決しました(^_^)

ylist = [dt.strptime(d, ' %H:%M:%S') for d in ylist]    #%Hの前に半角スペースを入れた

結構あるあるだと思いますので!お気をつけあれ~。

Keras Functional API とSequentialモデルの違い

私はディープラーニングのコードを書くのにKerasを使って書いてます。

ですが、Kerasのドキュメントがわかりにくいんだよなぁぁ。なので、メモ的に書いておきます。

最初の方に出てくる話なのですが、Kerasではモデルというものを使って、ディープラーニングを作ります。(めちゃざっくりしてますが)

モデルの作り方に、

  1. Sequentialモデル
  2. Functional API

というのでつくるやり方の2通りが紹介されています。

一体何が違うの~?!( ゚Д゚) となっちゃいますよね。なんか、ネーミングも、Functional APIって、何かのAPI? Sequentialモデルとは全く似ても似つかないものなのでは???と思っちゃいますよね。

しかし、二つはモデルの作り方が違うだけです。

Sequentialモデルは、Sequentialは「順序通り」という意味でして、その名の通り、モデルを下記のようや

model = Sequential([
    Dense(32, input_shape=(784,)),
    Activation('relu'),
    Dense(10),
    Activation('softmax'),
])

下記のように

model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))

した場合、この順番通りにレイヤーが追加されて、処理がされるということです。

Functional APIは、複数の入出力を持ったモデルなど、Sequentialではできないような、ちょっと複雑なモデルが作れます。

アレの出力をコレの入力にも、アッチの入力にも使える、みたいなイメージです。