2018/12/15

Android Studio で "Argument for @NotNull parameter 'message' of ..." が発生するようになってしまった

@Android Studio 3.2.1 on Ubuntu 18.04 LTS

Android Studio を 3.2.1 にしたところ、IDE Fatal Errors が発生するようになってしまいました1

具体的には以下のようなエラー。

Argument for @NotNull parameter 'message' of com/android/tools/idea/gradle/project/sync/GradleSyncState.syncFailed must not be null
java.lang.IllegalArgumentException: Argument for @NotNull parameter 'message' of com/android/tools/idea/gradle/project/sync/GradleSyncState.syncFailed must not be null
 at com.android.tools.idea.gradle.project.sync.GradleSyncState.$$$reportNull$$$0(GradleSyncState.java)
 at com.android.tools.idea.gradle.project.sync.GradleSyncState.syncFailed(GradleSyncState.java)
 at com.android.tools.idea.gradle.project.sync.idea.IdeaSyncPopulateProjectTask.doPopulateProject(IdeaSyncPopulateProjectTask.java:135)
 at com.android.tools.idea.gradle.project.sync.idea.IdeaSyncPopulateProjectTask.populate(IdeaSyncPopulateProjectTask.java:97)
 at com.android.tools.idea.gradle.project.sync.idea.IdeaSyncPopulateProjectTask.access$000(IdeaSyncPopulateProjectTask.java:39)
 at com.android.tools.idea.gradle.project.sync.idea.IdeaSyncPopulateProjectTask$1.run(IdeaSyncPopulateProjectTask.java:86)
 at com.intellij.openapi.progress.impl.CoreProgressManager$TaskRunnable.run(CoreProgressManager.java:750)
 at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$1(CoreProgressManager.java:157)
 at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:580)
 at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:525)
 at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:85)
 at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:144)
 at com.intellij.openapi.progress.impl.CoreProgressManager$4.run(CoreProgressManager.java:395)
 at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:305)
 at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
 at java.util.concurrent.FutureTask.run(FutureTask.java:266)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 at java.lang.Thread.run(Thread.java:745)
2018/12/04

[Python] date と datetime オブジェクトの相互変換まとめ

2018/12/03

[Python] datetime オブジェクト、Unix time、文字列の相互変換まとめ

Python で datetime オブジェクトUnix time、文字列を相互変換する方法はいろいろあります。 中には直感に反するものもあり1、 過去に1度間違えたのに、再度間違えるということもしばしば。

そこで、2度と間違えないように、個人的にベストと思う方法をまとめてみました。

変換には様々な方法があるので、上記が唯一の方法というわけではありませんが、 なるべく、安全かつシンプルになるものを選んだつもりです。

また、変換可能でも、安全では無いと判断したものは矢印を引いていません2

2018/12/02

[Python] datetime.combine() でタイムゾーンは指定しない方がよい

先日、「datetime のコンストラクタでタイムゾーンは指定しない方がよい」と書いたのですが、 datetime.combine() でも同様の問題が起こりました。

以下のように、日本のタイムゾーンが +9:19 になってしまうのです。

1
2
3
4
5
6
from datetime import datetime, date, time
import pytz
 
d = date(2018,11,1)
datetime.combine(d, time(), tzinfo=pytz.timezone('Asia/Tokyo'))
# 2018-11-01 00:00:00+09:19
2018/12/01

[Python] サマータイムのある地域で時刻計算する時は、一度 UTC に変換する

「サマータイムのある地域で」とタイトルに入れたのですが、地域に関わらず、時刻計算する時は UTC に変換してから行った方が良いです。 特にサマータイムのある地域では問題が起こりやすいので、注意が必要ということです。

問題が起こる例

2018年の ニューヨークは 11/4 2:00 am までがサマータイム1でした。

2018/11/4 2:00 am より前
EDT -04:00

2018/11/4 1:00 am 以降
EST -05:00

このような時刻をまたぐ計算を aware のまま行うと、結果がおかしくなります。

1
2
3
4
5
6
7
>>> import datetime, pytz
>>> dt = datetime.datetime(2018, 11, 4, 7, 0, 0, 0# 2018/11/4 7:00 am native
>>> dt_aware = pytz.timezone('America/New_York').localize(dt)
>>> dt_aware
datetime.datetime(2018, 11, 4, 7, 0, tzinfo=<dsttzinfo 'america="" new_york'="" est-1="" day,="" 19:00:00="" std="">)
>>> str(dt_aware)
'2018-11-04 07:00:00-05:00'

上記の dt_aware から 1日前を計算すると以下のようになります。

1
2
3
4
5
>>> calculated = dt_aware - datetime.timedelta(days=1)
>>> calculated
datetime.datetime(2018, 11, 3, 7, 0, tzinfo=<dsttzinfo 'america="" new_york'="" est-1="" day,="" 19:00:00="" std="">)
>>> str(calculated)
'2018-11-03 07:00:00-05:00'

ぱっと見正しそうですが、11月3日なのに EST になっていて、間違っています。