[Android] [Gradle] Android Studioで “Configuration with name default not found” エラーが出た時の対処法

Android Studio や IntelliJ IDEA でプロジェクトを開こうとした時に、
“Configuration with name default not found” というエラーが出ることがあります。

resolve error
Configuration with name default not found
Consult IDE log for more details(help show log)

どうすればいいか

困ったときのGoogle先生頼みでぐぐるのもいいんですが、これだけでは原因が色々ありすぎてなかなか正解にたどり着けないので、ダイアログで書かれている通り help メニューから show log を開いて、フォルダ内の idea.log を開いてみると解決の助けになります。

Mac OS X や Linux は ~/Library/Logs/AndroidStudio/idea.log あたりを直接開いてもOKです。

ログファイルなのでめちゃくちゃ長くて読みづらいのですが、該当のエラーを知りたいだけなので
エラーメッセージ通りConfiguration with name ‘default’ not found.で検索してみると、何件かのうち以下のような行が引っかかると思います。

(省略)
Caused by: org.gradle.api.UnknownProjectException: Cannot evaluate module volley : Configuration with name 'd
efault' not found.
        at com.android.build.gradle.BasePlugin$_ensureConfigured_closure189.doCall(BasePlugin.groovy:3345)
        at com.android.build.gradle.BasePlugin.ensureConfigured(BasePlugin.groovy:3339)
        at com.android.build.gradle.BasePlugin.resolveDependencyForConfig(BasePlugin.groovy:3255)
        at com.android.build.gradle.BasePlugin.this$2$resolveDependencyForConfig(BasePlugin.groovy)
        at com.android.build.gradle.BasePlugin$this$2$resolveDependencyForConfig$1.callCurrent(Unknown Source)
        at com.android.build.gradle.BasePlugin.resolveDependencies(BasePlugin.groovy:3174)
        at com.android.build.gradle.internal.VariantManager.createVariantData(VariantManager.java:464)
        at com.android.build.gradle.internal.VariantManager.createVariantDataForProductFlavors(VariantManager.java:550)
        at com.android.build.gradle.internal.VariantManager.populateVariantDataList(VariantManager.java:326)
        at com.android.build.gradle.internal.VariantManager.createAndroidTasks(VariantManager.java:212)
        at com.android.build.gradle.internal.VariantManager$createAndroidTasks.call(Unknown Source)
        at com.android.build.gradle.BasePlugin.createAndroidTasks(BasePlugin.groovy:463)
        at com.android.build.gradle.BasePlugin$_createTasks_closure9.doCall(BasePlugin.groovy:408)
        at org.gradle.listener.ClosureBackedMethodInvocationDispatch.dispatch(ClosureBackedMethodInvocationDispatch.java:40)
        at org.gradle.listener.ClosureBackedMethodInvocationDispatch.dispatch(ClosureBackedMethodInvocationDispatch.java:25)
        at org.gradle.listener.BroadcastDispatch.dispatch(BroadcastDispatch.java:83)
        at org.gradle.listener.BroadcastDispatch.dispatch(BroadcastDispatch.java:31)
        at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
        at com.sun.proxy.$Proxy13.afterEvaluate(Unknown Source)
        at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:79)
        ... 39 more
Caused by: org.gradle.api.artifacts.UnknownConfigurationException: Configuration with name 'default' not found.
        at org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer.createNotFoundException(DefaultConfigurationContainer.java:79)
        at org.gradle.api.internal.DefaultNamedDomainObjectCollection.getByName(DefaultNamedDomainObjectCollection.java:192)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer.getByName(DefaultConfigurationContainer.java:69)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer.getByName(DefaultConfigurationContainer.java:33)
        at org.gradle.api.internal.artifacts.dependencies.DefaultProjectDependency.getProjectConfiguration(DefaultProjectDependency.java:69)
        at org.gradle.api.internal.artifacts.dependencies.DefaultProjectDependency_Decorated.getProjectConfiguration(Unknown Source)
        at org.gradle.api.internal.BeanDynamicObject$MetaClassAdapter.getProperty(BeanDynamicObject.java:153)
        at org.gradle.api.internal.BeanDynamicObject.getProperty(BeanDynamicObject.java:107)
        at org.gradle.api.internal.CompositeDynamicObject.getProperty(CompositeDynamicObject.java:78)
        at org.gradle.api.internal.artifacts.dependencies.DefaultProjectDependency_Decorated.getProperty(Unknown Source)
(以下略)

上記の1行目のCannot evaluate module volley : Configuration with name ‘default’ not found.がポイントです。

エラーダイアログに無かったCannot evaluate module volleyがあることで、犯人がvolley(のgradle)だと判りましたね。

この例では、volleyがサブモジュールでインストールされてなかったためそもそもbuild.gradleがなくて怒られていたので、最終的にgit submodule add でvolleyを追加してやることで無事解決しました。

忙しい人のための解決方法

ここまで書いてきたidea.logから探す方法ですが、ログはめちゃくちゃ見づらいので、
直接 gradlew なりgradle なりをコマンドラインから実行したほうがわかりやすいです。

./gradlew tasks --info

上記のコマンドをbuild.gradle (とgradlrew)のあるディレクトリで実行すると、
Android Studioから開いた時と同じところでこけて最後にCannot evaluate module volley : Configuration with name ‘default’ not found.のような原因が表示されます。

idea.logなんて見なくてもよかった(gradleに関しては)。

ひとこと

Android Studio で既存プロジェクトを github から git cloneして開こうとした時にはまったので。

[iOS][Swift] Swiftっぽくレコードをソートをする

NSSortDescriptorはObjective-Cでも使えるレコードの配列をレコードキーでソートするのに便利な方法ですが、Arrayのsort()メソッドやsorted()メソッドを使うとよりSwiftっぽくクロージャでソートすることができます。

変更前:

let records = NSMutableArray()
let sortDescriptor = NSSortDescriptor(key: "fileSize", ascending: true)
records.sortedArrayUsingDescriptors([sortDescriptor])

// レコード投入
let record1 = NSMutableDictionary()
record1["filePath"] = "/path/to/file1"
record1["fileSize"] = 1000
records.addObject(record1)

let record2 = NSMutableDictionary()
record2["filePath"] = "/path/to/file2"
record2["fileSize"] = 100
records.addObject(record2)

let record3 = NSMutableDictionary()
record3["filePath"] = "/path/to/file3"
record3["fileSize"] = 500
records.addObject(record3)

println(records)

続きを読む [iOS][Swift] Swiftっぽくレコードをソートをする

【Linux】topで表示される flush 253:0 の意味

Linux(CentOS)で重い処理の実行中にtopを見ていて、「flush 253:0」というプロセスがあるのが気になって調べてみた。

StackOverflowの「”flush 253:0″ in iotop file on RHEL. 」によると、カーネルがページキャッシュからIO書き込みを行うためのプロセスなのだそう。

ざっくり言うと、ディスク書き込みをする際、ユーザプログラムではページキャッシュに一旦書き込んでいて、
それをLinuxカーネルが処理している時に出てくるプロセス、らしい。

たしかに、ディスク書き込みを行う処理を監視していたのでした。

参考:Cache and TLB Flushing Under Linux

MySQLでmysql.slow_logテーブルをslow queryログファイル形式でダンプする

表題のとおり、スロークエリログをテーブルに書き出しているMySQL DBサーバで
slow queryログファイルの形式でエクスポートしたくなったのでその方法をメモしておきます。

参考:Exporting mysqlslowlog table slow query log format.

# コマンドここから
mysql -u “ユーザ名” -p -h “接続先ホスト” -D mysql -s -r -e “SELECT CONCAT( ‘# Time: ‘, DATE_FORMAT(start_time, ‘%y%m%d %H%i%s’), ‘\n’, ‘# User@Host: ‘, user_host, ‘\n’, ‘# Query_time: ‘, TIME_TO_SEC(query_time), ‘ Lock_time: ‘, TIME_TO_SEC(lock_time), ‘ Rows_sent: ‘, rows_sent, ‘ Rows_examined: ‘, rows_examined, ‘\n’, sql_text, ‘;’ ) FROM mysql.slow_log” > /tmp/mysql.slow_log.log
# コマンドここまで

長くて読みづらいですが、mysqlコマンドで、slow_query_logファイル形式にあわせるようにSELECTを打って整形しています。

普段はSQLで処理できるテーブルのほうが便利ですが、Percona Toolkitpt-query-digestのように、スロークエリログをファイルとして処理するようなツールを使うためにファイルが欲しくなることもあるのですよね。

Percona Toolkitについてはこちらの記事が参考になりました。

[iOS][Objective-C] @property の基本まとめ

Objective-C でなんとなく知っているけど実はよく知らないプロパティ(@property)まわりの
基本的な仕様をまとめました。

Xcode6.1が正式リリースされてSwiftのβがとれたし、「Swift使うからいらないよ」なんて言わないで、iOS開発のお供にどうぞ。

続きを読む [iOS][Objective-C] @property の基本まとめ

[iOS] UIButtonのテキスト設定時のアニメーションを止める

iOS7以降(iOS7.1, iOS8も)、UIButtonにsetTitleすると勝手にボタンがアニメーションをしてしまうようです。
たとえばコードからデフォルト値設定したいだけなのに[UIButton setTitle:]したら、チラッとUIビルダーの設定値が出ちゃってなんだかあれだったので、止める方法をメモしておきます。

続きを読む [iOS] UIButtonのテキスト設定時のアニメーションを止める

[Linux] ping された事を検知する(tcpdump)

ネットワーク到達確認をするときにpingをうちますが、
自分が本当にpingを受け取ったのか確認したい事もたまにあります。

こんな時、pingされたことを検知するには、tcpdumpを使うと便利です。

> sudo tcpdump ‘icmp[0] = 8’

############ 監視サーバ側 ############## 
% sudo tcpdump 'icmp[0] = 8'     
[sudo] password for user: 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
(監視状態に入る)

ここで監視サーバにpingが来ると監視サーバには以下のようにログが流れます。

17:35:23.241574 IP xxx.xxx.xxx.xxx > example.com: ICMP echo request, id 13727, seq 0, length 64
17:35:24.241852 IP xxx.xxx.xxx.xxx > example.com: ICMP echo request, id 13727, seq 1, length 64

xxx.xxx.xxx.xxxは実際にはping元のIPアドレス(またはホスト)、example.comはping先(監視サーバ)のIPアドレス(またはホスト)になります。

終了するときは Ctrl-C で終了します。

Mac OS X のバッテリー劣化状況を確認する

ほお、と思ったのでメモ。

MacBook AirやMacBook Pro をずっと使っていて、バッテリー(電池)の持ちがなんとなく悪くなった気がするなぁと思った事ありませんか。

そんなときにバッテリーの劣化状況を調べる方法がありました。

ターミナルから、下のコマンドを入力するだけ。

ioreg -c AppleSmartBattery | grep -i Capacity

実行すると、このように出力されます。

$ ioreg -c AppleSmartBattery | grep -i Capacity
    | |           "MaxCapacity" = 4745
    | |           "CurrentCapacity" = 3463
    | |           "LegacyBatteryInfo" = {"Amperage"=3290,"Flags"=7,"Capacity"=4745,"Current"=3463,"Voltage"=8282,"Cycle Count"=282}
    | |           "DesignCapacity" = 5100

MaxCapacityがバッテリーの最大容量、CurrentCapacyty が今のバッテリー残量、DesginCapacityが製品出荷時の(設計された)バッテリー最大容量です。

劣化状況は MaxCapacity ÷ DesginCapacity という計算をすると求められます。

上の例だと 4,745 ÷ 5,100 = 0.930392… となり、製品出荷時から比べるとパフォーマンスが93%(0.93)に減っているので、損耗率は 100 – 93 = 7% となります。

ちなみに上の例は買ってから1年のMacBook Airです。
1年フルに仕事で使ってたのですが、7%しか劣化していないのですね。
もっと劣化してると思っていたけど結構優秀。

[Apache] .git, .gitignore等をWebからアクセスできないようにする

gitで管理しているwebサイトでうっかり.gitや.gitignoreなどの Git 関連ファイルが漏れてしまわないようにするには、httpd.conf で以下のように設定します。

# .git から始まるファイルへのアクセスを禁止
<Files ~ "^\.git">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>
# .git/ フォルダ以下のファイル・ディレクトリへのアクセスを禁止
<Directorymatch "^/.*/\.git/">
Order deny,allow
Deny from all
</Directorymatch>

.git は外してアップしているよ、という方も、保険として入れておくと万一の時に .git や .gitignore などが
公開ディレクトリに混ざってしまってもアクセスできないようになるので安全ですね。