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 になっていて、間違っています。

2018/11/30

[Python] datetime のコンストラクタでタイムゾーンは指定しない方がよい

以下を見てください。 日本のタイムゾーンが +9:19 になってしまいました。

1
2
3
>>> import datetime, pytz
>>> datetime.datetime(2018, 9, 1, tzinfo=pytz.timezone('Asia/Tokyo'))
datetime.datetime(2018, 9, 1, 0, 0, tzinfo=<dsttzinfo 'asia="" tokyo'="" lmt+9:19:00="" std="">)

調べてみると、pytz 2017.2 以降を使う場合、上記のような動作になるようです。

原因については、以下のコメント欄が参考になります。(以下の記事で触れているのは replace でタイムゾーン指定した場合ですが、コンストラクタで指定した場合も同様)

参考

pytzの仕様が変わっている - Qiita

簡単に言うと、「複数のタイムゾーン(UTC オフセット)を持つエリアでは、日付が決まらないとオフセットが決定できないので、 勝手にデフォルトのオフセットが採用される」ということのようです。

一般的に「複数のタイムゾーンを持つエリア」といえば、サマータイムがあるようなエリアで、日本は当てはまらない気がします。 ところが、日本は 1887年以前は今とは異なるタイムゾーン (+09:18:591) だったそうです。

参考

一行入魂 PostgreSQLのtime zoneについて

pytz 2017.2 以降はこれを厳密に守るようになったということみたいですね2

というわけで、aware な datetime オブジェクトを作成するには、 一度 native で作成してから aware に変換するのが正しいやり方のようです。

1
2
3
4
>>> import datetime, pytz
>>> dt = datetime.datetime(2018, 9, 1)
>>> pytz.timezone('Asia/Tokyo').localize(dt)
datetime.datetime(2018, 9, 1, 0, 0, tzinfo=<dsttzinfo 'asia="" tokyo'="" jst+9:00:00="" std="">)

今回、たまたま日本のタイムゾーンで問題が起こって調べましたが、他のタイムゾーン3では同じ問題が前からあったということですね4

  1. 9:19:00 ではない。pytz は秒まで持てないからね… 
  2. とはいえ、100年以上前のタイムゾーンがデフォルトってどうなのよ?と思いますが… 
  3. サマータイムがあるなど 
  4. 多分。確認はしていないけど。 
?
2018/11/22

GNOME 3 でマウントドライブをデスクトップに表示しないようにする方法

@GNOME 3.28.2

gvfs でいろいろマウントしているとデスクトップがゴチャゴチャになってくる1ので、アイコンを表示しないように出来ないか調べてみた。

結論から言うと、dconf の /org/gnome/nautilus/desktop/volumes-visible を OFF にすればよい。

2018/11/09

[Python] mmap.flush で OSError が出る場合、アラインメントが不適切な可能性あり

Python の mmapflush() を実行することで変更をディスクに保存します。

この flush([offset[, size]]) を引数つきで呼ぶときは 「offsetmmap.ALLOCATIONGRANULARITY の倍数でないといけない」という制約があります1

つまり、以下のように、offset の位置を調整しないといけません。

1
2
aligned_offset = int(offset / mmap.ALLOCATIONGRANULARITY) * mmap.ALLOCATIONGRANULARITY
mm.flush(aligned_offset, offset - aligned_offset + size)

参考

Issue 32798: mmap.flush() on Linux does not accept the "offset" and "size" args - Python tracker

offset の調整をしないと、OSError が発生してしまいます。

OSError: [Errno 22] Invalid argument

最初、このエラーが発生した時、指定した範囲が不正なんじゃないか等、無駄に調べてしまいました…

  1. エラーメッセージにその旨出して欲しい 
?
2018/11/01

GSettings と dconf の関係

dconf の schema id と schema path の関係

dconf は設定値を一意に決定する際、schema idschema path という2種類の文字列を使用します。

schema id は "."(ピリオド)区切りの文字列で、gsettings でキーを指定する際のデフォルトです。 これに対し、schema path は "/"(スラッシュ)区切りの文字列で dconf-editor の上部に表示されています。

2018/10/31

gsettings で vino を有効にする方法 on Ubuntu 18.04

2018/10/30

Ubuntu 18.04 で Vino を有効にする方法

Vino の設定は gconftool-2 では出来ない」 に書いたように、Ubuntu 16.04 までは gsettings を用いて Vino を有効に出来ました1

しかし、Ubuntu 18.04 では org.gnome.Vino の中に enabled というキーが存在しません。 つまり、先の方法では Vino を有効に出来ません。

2018/10/16

[Python] dependency_links を使わないでレポジトリを明示的に指定する方法

2018/10/10

Python 3.5 を Ubuntu 18.04 上でビルドしたらテストが通らなかった

Ubuntu 18.04 で Python 3.5 系の動作確認をするため1、ソースコードからビルドしてみました。

2018/10/06

qpdf で PDF のパスワードを解除する

qpdf 8.0.2 on Ubuntu 18.04

単純なんだけど、すぐ忘れてしまうので備忘録。

$ qpdf --password=パスワード --decrypt input.pdf output.pdf

参考

QPDF - TeX Wiki

2018/10/05

qpdf で PDF ファイルを結合する

qpdf 8.0.2 on Ubuntu 18.04

前もやったのにすぐ忘れてしまうので、備忘録。

original_01.pdf, original_02.pdf のように連番のファイルがあるとして、それらを単純に結合して出力する方法。

$ qpdf --empty --pages original_*.pdf -- out.pdf

一部のページを抜き出したりしたい場合は、以下を参照。

参考

QPDF - TeX Wiki

2018/10/02

Gnome 3 の Favorite apps にカスタムアプリを登録する方法(コマンドラインで)

2018/09/14

Gnome 3 の workspace をマルチモニタ対応にする方法

Ubuntu 18.04 LTS にアップグレードしたところ workspace の動作がかなり変わってしまいました。 具体的には、左右への移動ができなくなり、マルチディスプレイの場合、プライマリディスプレイのみが移動するようになりました。

Unity から Gnome になったので、この程度の差異は想定内ですが、マルチディスプレイに対応していないのは少し使い勝手が悪いです1

「同じように思っている人もいるはず」と思って探してみると、マルチモニタ用のアドオンを作ってくれた人がいたので、紹介します。

なお、動作確認は Gnome 3.28.2 で行っています。

2018/09/13

Ubuntu 18.04 にしたら NetBios name で Windows マシンにアクセスできなくなった【解決】

2018/08/03

.desktop ファイルを作ったのに Unity のランチャに表示されない場合の対処方法

先に結論を書いておくと、「.desktop ファイルを直接 ~/.local/share/applications 以下に作成するのではなく、desktop-file-install を使用してインストールしましょう。」ということです。

2018/08/02

Remmina で RDP 接続したら IME 経由で日本語が入力できなくなった【解決】

@Remmina 1.2.31.2 on Ubuntu 16.04 LTS

私は最新の Remmina を使用したいため、PPA からインストールしています。

参考

How To Install Remmina Remote Desktop Client in Ubuntu Linux

そのせいかはわかりませんが1、Windows 10 に RDP 接続すると IME が使えなくなってしまいました。

なお、過去の Remmina では、「英字キーボードになってしまう」という問題がありましたが、最新ではこれは修正されています。 今回、私が遭遇した問題はキーボード配列には関係なく、IME の動作に関しての不具合です。

2018/07/05

Vino に Windows の VNC クライアントからアクセス出来ない時の対処法

@Ubuntu 16.04 (Vino 3.8.1-0Ubuntu9.2)

他の Ubuntu マシンからアクセス出来ている Vino に Windows 10 の VNC クライアントからアクセスしてみたのですが、エラーが出てうまくいきませんでした。

2018/06/29

PyCharm でユニットテストを実行しようとすると ImportError が出てしまう場合、原因はシンボリックリンクの可能性あり

@PyCharm 2018.1.4 (Community Edition) on Ubuntu 16.04 64bit

PyCharm はユニットテストファイルを自動的に認識してコンテキストメニューを変化させてくれます。

例えば以下のように main_test.py を作成したとして1

右クリック → Run 'Unittests in main_te...'

2018/06/16

[Python] __getitem__ で想定外のインデックスが来たら必ず IndexError を返すべし

2018/06/14

Ubuntu でオンライン会議を録音する方法

@Ubuntu 16.04 LTS

ブラウザベースのオンライン会議サービス appear.in で会議を録音してみました。 ブラウザベースじゃなくても PulseAudio を使っているアプリケーションなら全て録音できると思われます。

2018/06/06

Ubuntu 16.04 に sikuli をインストールしてみた

Ubuntu 16.04 LTS に Sikuli をインストールしたのでメモ。

2018/06/01

Ubuntu 16.04 でプリンターに接続できなくなった

Software Update をしたからだと思うのですが1、突然プリンター(ネットワーク接続)が使用出来なくなりました。

System Settings の Printers を選択すると以下のようなエラーが表示されます。

Printing service not available. Start the service on this computer or connect to another server.

cups サービスが動いていない

確認してみると、cups サービスが起動していない様子。

$ systemctl status cups
● cups.service
   Loaded: masked (/dev/null; bad)
   Active: inactive (dead)
2018/05/23

Python2系とPython3系では binascii.crc32 の計算結果が異なるので注意

python2 では signed、python3 では unsigned として扱われる

具体的な例としては以下。

python2
1
2
3
>>> import binascii
>>> binascii.crc32(b"Hello")
-137262718
python3
1
2
3
>>> import binascii
>>> binascii.crc32(b"Hello")
4157704578

数字は違うのですが、0xF7D18982 を 32bit の signed として扱っているか、unsigned として扱っているかの違いです。

そして、これは仕様のようです。

参考

Issue 4903: binascii.crc32() - document signed vs unsigned results - Python tracker

2018/05/12

Headless server につないだ Vino のキーボードを日本語レイアウトにする

2018/05/11

Ubuntu 16.04 LTS から 18.04 LTS へのアップデートは7月後半まで出来ない

Ubuntu 18.04 LTS が出ましたね。

メインマシン(16.04 LTS) にアップデート通知がこないなーと思いつつ、 ちょうど仕事が忙しいタイミングと重なって放置していました1

しかし、さすがに2週間経ってもこないのはおかしくない?と思って調べてみたら、 16.04 からのアップデートは 18.04.1 が出るまで無効化されているとのこと。

BionicBeaver/ReleaseNotes - Ubuntu Wiki

Upgrades from 16.04 LTS will not be enabled until a few days after 18.04.1's release expected in late July.

18.04.1 のリリーススケジュールは7月後半2。 ちょっと先ですね。 悩ましい。

  1. このタイミングでアップデートするわけにもいかず、ちょうど良かったとも言える 
  2. 一応、7月26日の予定 
?
2018/04/27

heic ファイルを扱える Imagemgick をインストールする

@Ubuntu 16.04 LTS1

ImageMagick が heic フォーマット2に対応したようなので、ソースコードからコンパイルしてインストールしてみました。

以下によると、6.9.9 もしくは 7.0.7 以降が対象とのこと。

参考

ImageMagick-6.9.9-34差分 - yoyaのメモ

2018/04/26

doctest を unittest と統合して実行する (Python)

doctest とは

ここに検索で来られた方には不要かもしれませんが、説明の都合上、簡単に書いておきます。

doctest は、以下のような docstring 内の対話実行例が正しく実行できるか確認するモジュールです。 docstring 内だけでなく、テキストファイルの実行例を確認する事も可能です。

core.py
1
2
3
4
5
6
7
8
9
10
11
12
# -*- coding: utf-8 -*-
 
 
def times(a, b):
    """
    2つの入力を掛け算して出力
 
    >>> times(4, 9)
    35
    """
 
    return a * b
2018/04/25

[Python] setup.py に dependency_links を書いても "Could not find a version that satisfies the requirement" が出る場合の対処方法4種

2018/10/16 追記
Pip 18.1 以降は dependency_links を使わない方法が正式になりました。

dependency_links を使わないでレポジトリを明示的に指定する方法

Python で pip install 可能なパッケージを作成した際、 PyPI に登録してしまえば pip が適切に処理してくれるので簡単です。

しかし、内部用のライブラリの場合は明示的にリポジトリの場所を指定しなければなりません。 そのための機能として、setuptools.setup() には dependency_links という引数があります。

ところが、pip install しようとした場合、dependency_links は無視されてしまい、うまくいきません。 dependency_links は、基本的に python setup.py install の場合を想定しているようです。

ただ、pipsetup.py の上位ラッパー1のはず。 対処方法が無いはずはないと思って調べてみました。

2018/04/07

Python の with で複数ストリームを同時に扱う方法

2つのファイルを同時にオープンして、処理が終了したら同時にクローズするような処理1はよく行われると思うのですが、私は最近まで with をネストして書いていました。

が、Python 2.7 以降は以下のように書けるとのこと。 知らなかった2。。。

1
2
with open('a', 'r') as a, open('b', 'w') as b:
    do_something()

参考

How can I open multiple files using "with open" in Python? - Stack Overflow

  1. 例えば、解析対象ファイルと結果出力ファイルなど 
  2. 以前、調べた時は出来ないって書いてあった記憶が。古い情報を引っ張ってしまったのかもしれません。 
?
2018/03/31

symbolic link privilege not held が出る場合の対処方法 (Windows 10)

Python でシンボリックリンクを作成するには os.symlink() を使用します。 ただ、Windows でこれを普通に実行すると OSError: symbolic link privilege not held が発生してしまいます。

2018/03/08

Linux に wxPython をインストールする方法

2018/03/07

関数プロトタイプ宣言はヘッダファイルとソースファイルのどちらに書くべきか

C言語のコードでは、全ての関数プロトタイプ宣言がヘッダファイルに書いてあったりするものもありますが、 個人的にはヘッダファイルに書くべきものと、ソースファイルに書くべき1ものを明確に区別すべきだと思います。

何をもって区別するのかと言うと、「スコープ」です。 「何を当たり前のことを」と思った方は申し訳ありません。ただ、最近「スコープなんて知らん」と言わんばかりのコードを大量に読むことになってしまいまして。

2018/03/05

wxPython & XRC でパネルを動的追加する方法 with Two Stage Creation

先日書いた wxPython でパネルを動的追加する方法 | 穀風 を Two Stage Creation を使って実装し直しました。

Two Stage Creation については、以下を参考にしてください

作成したサンプルは、前回と同様、ラベルとボタンが一つずつあるだけのシンプルなもので、ボタンをクリックすると自パネルの背景が変わるというお遊びつきです1

2018/03/04

wxPython & XRC で Custom Frame を作る方法3種

@wxPython 4.0.1 (Phoenix)

UI が複雑になってくると、Custom Frame や Custom Panel を作ってコンポーネント化したくなります。 wxPython では wx.Framewx.Panel を継承した class を作ることでこれを実現できますが、どうもコードベースで実装している例が多いようです。

しかし、View は分離しておきたいもの。特に複雑なUIの場合はなおさらです。 そこで、XRC を使って Custom Frame (Panel) を作る方法を調べてみました。

今回は、例として、Button が一つ中央にある Custom Frame を作ってみます1

2018/03/02

wxPython & XRC で "AttributeError: 'Control' object has no attribute" が発生する場合の対処方法

@wxPython 4.0.1

以下のように XRC から wxDatePickerCtrl 等のコンポーネントを生成すると、Control オブジェクトが返ってきてしまうことがあります。

2018/03/01

wxPython & XRC でパネルを動的追加する方法

2018/3/5 追記
より使い勝手の良い方法があったので、そちらの方法で実装しなおしたバージョンを作りました。
[wxPython &XRC でパネルを動的追加する方法 with Two Stage Creation | 穀風](https://kokufu.blogspot.com/2018/03/wxpython-with-two-stage-creation.html)

Add Panel ボタンをクリックすると動的に MyPanel を追加するサンプルを作りました。

MyPanel はラベルとボタンが一つずつあるだけのシンプルなもので、ボタンをクリックすると自パネルの背景が変わるというお遊びつきです1

なお、MyPanelwxPython & XRC で Custom Frame を作る方法2種+α | 穀風 で紹介した方法で XRC から生成しています2

wxPython & XRC で Custom Frame を作る方法2種+α

2018/03/04 追記
よく調べてみたところ、より使い勝手のよい方法が公式に存在したので書き直しました。
[wxPython & XRC で Custom Frame を作る方法3種 | 穀風](https://kokufu.blogspot.com/2018/03/wxpython-xrc-custom-frame-3.html)

@wxPython 4.0.1 (Phoenix)

UI が複雑になってくると、Custom Frame や Custom Panel を作ってコンポーネント化したくなります。 wxPython では wx.Framewx.Panel を継承した class を作ることでこれを実現できますが、どうもコードベースで実装している例が多いようです。

しかし、View は分離しておきたいもの。特に複雑なUIの場合はなおさらです。 そこで、XRC を使って Custom Frame (Panel) を作る方法を調べてみました。

今回は、例として、Button が一つ中央にある Custom Frame を作ってみます1

2018/02/28

wxPython の SetBackgroundColour に RGB を指定する方法

SetBackgroundColour1 の引数に文字列や Colour オブジェクトを指定している例はよく見かけるのですが、RGB でしたい時はどうするのだろうと思っていました。

1
2
panel.SetBackgroundColour('blue')
panel.SetBackgroundColour(wx.Blue)
2018/02/22

measureText と getTextBounds の違い

Android の android.graphics.Paint にはテキストサイズ計測用のメソッドが2つ用意されています。 Paint#measureText(String)Paint#getTextBounds(String, int, int, Rect) ですが、これらの違いを調べてみました。

2018/02/20

信頼できない ZIP ファイルは ZipInputStream で開いてはいけない

@Java 1.8.0

ZipInputStream から取得した ZipEntrygetSize()-1 になることがあります。

1
2
3
4
5
6
7
8
private void read(InputStream is) throws IOException {
    ZipInputStream zis = new ZipInputStream(is);
    ZipEntry entry;
    while ((entry = zis.getNextEntry()) != null) {
        // getSize() が -1 になることがある
        Log.d(TAG, entry.getName() + "'s size is " + entry.getSize());
    }
}
2018/02/16

BitmapDescriptorFactory.fromResource() で "IBitmapDescriptorFactory is not initialized" が起こる場合の対処方法

@play-services-maps:11.8.0

2018/02/15

モニタをつないでいない Ubuntu の Vino に接続する

@Ubuntu 16.04 LTS

Vino はそもそも画面をミラーリングするアプリケーションなので、画面出力をしていないマシンにつなぐことは出来ません。

しかし、バックグラウンドで GUI アプリケーションを動かしておきたい場合、モニタ無しで VNC 接続したいこともあります。 そんな時は、ダミーのグラフィックドライバをインストールすることで接続出来るようになります。

参考

Vino - ArchWiki

2018/02/14

Android の emulator で物理キーボード入力が出来るようにする

以前はデフォルトで使えたと思うのだけど、いつの間にかデフォルトオフになっていたのでメモ。

2018/02/13

Windows 10 上の Ubuntu から COM ポートにアクセスする方法

このご時世にシリアル通信というのも何ですが、組み込み関係等では現役だったりします1

私は Linux 上の screen をよく使います。ただ、諸事情により Windows で開発しなければならない場合もあります。

そんな時は、Tera Term を使っていたのですが、Windows 10 では Linux が動くようになったので、Windows 10 上でも screen が動くか試してみました。

2018/02/10

Android Studio で Don't remind me again for this project を押してしまった場合の回復方法

Android Studio を使っていると Gradle plugin のアップデートを勧められることがあります。その際、"Don't remind me again for this project" を押してしまうと、2度とこのダイアログが出なくなってしまいます。

2018/02/09

コマンドラインで gradle を実行すると com.android.tools.build:gradle が見つからないエラー

既存の Android プロジェクトを Android Studio 3.0.1 で読み込んだところ、 Android Studio ではビルド出来るのに、コマンドラインでは以下のようなエラーが出るようになってしまいました。

$ ./gradlew tasks
 
FAILURE: Build failed with an exception.
 
* What went wrong:
A problem occurred configuring root project 'MyApplication'.
> Could not resolve all files for configuration ':classpath'.
   > Could not find com.android.tools.build:gradle:3.0.1.
     Searched in the following locations:
     Required by:
         project :
 
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
 
* Get more help at https://help.gradle.org
 
BUILD FAILED in 0s
2018/02/08

Raw Disk Image file を Ubuntu でマウントする方法

2018/02/07

Android Emulator で公式に Google Play が使えるようになっていた

2018/02/03

その国にいるのに「お住まいの国でご利用いただけません」と出てしまう場合の解決方法(Google Play Store)

2019/4/15 追記
コメントで、Android の Google Play アプリから設定する方法を教えていただき、追記しました。
2018/10/02 追記
知人のアカウントで再度試したところ、Google ペイメントセンターの新しいプロファイルが反映されるまで数日かかるようです。 それまでは、以下の方法でも解決出来ませんでした。

なお、新しいプロファイルが反映されたかどうかは、ブラウザで [Google Play](https://play.google.com/store) を開き該当のアプリを検索してみると、検索に出てくるかどうかでわかります。

Google Play Store の国情報を変えるには Google ペイメントセンター で新しいプロファイルを作成すれば良い。 という情報は各所で見られます。 ただ、私がその設定をして丸2日待っても情報が反映される様子がありませんでした。

何度アプリを起動しても、「このアイテムはお住まいの国でご利用いただけません」と表示されてしまいます。

2018/02/01

.desktop ファイルの Exec に環境変数を含める方法

2018/8/3 追記
`desktop-file-install` を使う方法に書き換えました。
参考: [.desktop ファイルを作ったのに Unity のランチャに表示されない場合の対処方法 | 穀風](https://kokufu.blogspot.com/2018/08/desktop-unity.html)

.desktop ファイルを desktop-file-install でインストールすると、Unity の検索に出てくるようになります。

参考

Unity のランチャにカスタムアプリを登録する(コマンドラインで) | 穀風

myapp.desktop
1
2
3
4
5
6
[Desktop Entry]
Type=Application
Name=My Application
Exec=/home/username/bin/myapp
Icon=face-angel
Terminal=false

インストール

$ desktop-file-install --dir="${HOME}/.local/share/applications" myapp.desktop
2018/01/31

Unity のランチャにカスタムアプリを登録する(コマンドラインで)

@ Ubuntu 16.04 LTS

もうすぐ Ubuntu 18.04 LTS が出るであろうこのタイミングで Unity の設定について書こうと思います1

「ランチャにドラッグ&ドロップ」ではなく、全部コマンドラインでやる方法です。

2018/8/3 追記
`desktop-file-install` を使う方法に書き換えました。
参考: [.desktop ファイルを作ったのに Unity のランチャに表示されない場合の対処方法 | 穀風](https://kokufu.blogspot.com/2018/08/desktop-unity.html)
2018/01/30

TARGET_BUILD_TYPE は deprecated らしい

AOSP の設定に TARGET_BUILD_TYPE という項目があるけど、既に deprecated らしい。 確かに使ったことないな。

参考
[how to set the DEBUG environment - Google グループ](https://groups.google.com/forum/#!topic/android-building/RPFvWjpQC_E)

その割に、最新のコードでも残ってるし、deprecated のコメントも無いのが気になるところ。

参考
[buildspec.mk.default - platform/build - Git at Google](https://android.googlesource.com/platform/build/+/android-wear-8.0.0_r1/buildspec.mk.default)
2018/01/25

Android Emulator が黒画面でフリーズ

久しぶりに Android の Emulator を起動したら起動はするものの、黒い画面のままフリーズし、そのうち落ちてしまうようになってしまいました。

2018/01/20

pk8 & x509.pem を jks キーストアに登録する方法

以下のように2段階の処理で可能1

pkcs12 キーストアファイルに登録

以下のようにして、pkcs12 形式のキーストアファイルに登録する。

-name platform は省略可能。省略すると 1 というエイリアスになる。

$ openssl pkcs8 -in platform.pk8 -inform DER -outform PEM | openssl pkcs12 -export -in platform.x509.pem -inkey /dev/stdin -name platform -out platform.pk12

pkcs12 を jks キーストアにインポートする

-alias-destalias は省略可能。

$ keytool -importkeystore -destkeystore mykeystore.jks -srckeystore platform.pk12 -srcstoretype PKCS12 -alias platform -destalias platform
参考
- [how to import x509.pem pk8 file into jks(keystore)? - Stack Overflow](https://stackoverflow.com/a/40145242) - [鍵ストアファイルとアプリの署名に関する情報の整理 – iroha Tech Note](http://tech.at-iroha.jp/?p=734)
  1. 一発で変換するツールは見つけられなかったけど、コマンドラインで処理できるのでスクリプトを書いておけばOK。 
?
2018/01/19

PRODUCT_DEFAULT_DEV_CERTIFICATE にパスワード付き署名を設定する場合は注意

AOSP をビルドする際、デフォルトだと署名には build/target/product/security/ 以下にある testkey.x509.pemtestkey.pk8 が使われます。 しかし、実際にリリースするデバイスには自分の署名を使うべきです。