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 が発生するようになってしまいましたAndroid Studio をアップデートするまでは特に問題がなかったプロジェクトです。

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

``` 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 オブジェクトの相互変換まとめ

[datetime オブジェクト、Unix time、文字列の相互変換まとめ](https://kokufu.blogspot.com/2018/12/python-datetime-unix-time.html) を書いたので、ついでと言っては何ですが date と datetime の変換についてもまとめてみました。



2018/12/03

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

Python で [datetime オブジェクト]() 、 [Unix time](https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93)、文字列を相互変換する方法はいろいろあります。
中には直感に反するものもありnative になりそうなのに、ローカルのタイムゾーンを適用しちゃうとか、
過去に1度間違えたのに、再度間違えるということもしばしば。

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



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

また、変換可能でも、安全では無いと判断したものは矢印を引いていません安全な方法をご存じの方は教えていただけると幸いです
2018/12/02

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

先日、「[datetime のコンストラクタでタイムゾーンは指定しない方がよい](https://kokufu.blogspot.com/2018/11/python-datetime.html)」と書いたのですが、
`datetime.combine()` でも同様の問題が起こりました。

以下のように、日本のタイムゾーンが `+9:19` になってしまうのです。
```python
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 までがサマータイムアメリカでは Daylight Saving Time というでした。

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

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

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

```python
>>> 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=)
>>> str(dt_aware)
'2018-11-04 07:00:00-05:00'
```

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

```python
>>> calculated = dt_aware - datetime.timedelta(days=1)
>>> calculated
datetime.datetime(2018, 11, 3, 7, 0, tzinfo=)
>>> str(calculated)
'2018-11-03 07:00:00-05:00'
```

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

2018/11/30

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

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

```python
>>> import datetime, pytz
>>> datetime.datetime(2018, 9, 1, tzinfo=pytz.timezone('Asia/Tokyo'))
datetime.datetime(2018, 9, 1, 0, 0, tzinfo=)
```

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

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

> 参考
>
> [pytzの仕様が変わっている - Qiita](https://qiita.com/higitune/items/0ca244373d380cf1c060)


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

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

> 参考
>
> [一行入魂 PostgreSQLのtime zoneについて](http://aoyagikouhei.blog8.fc2.com/blog-entry-61.html)

pytz 2017.2 以降はこれを厳密に守るようになったということみたいですねとはいえ、100年以上前のタイムゾーンがデフォルトってどうなのよ?と思いますが…。

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

```python
>>> import datetime, pytz
>>> dt = datetime.datetime(2018, 9, 1)
>>> pytz.timezone('Asia/Tokyo').localize(dt)
datetime.datetime(2018, 9, 1, 0, 0, tzinfo=)
```

今回、たまたま日本のタイムゾーンで問題が起こって調べましたが、他のタイムゾーンサマータイムがあるなどでは同じ問題が前からあったということですね多分。確認はしていないけど。
2018/11/22

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

@GNOME 3.28.2

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

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

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

Python の [mmap](https://docs.python.jp/3/library/mmap.html) は `flush()` を実行することで変更をディスクに保存します。

この `flush([offset[, size]])` を引数つきで呼ぶときは 「`offset` が `mmap.ALLOCATIONGRANULARITY` の倍数でないといけない」という制約がありますエラーメッセージにその旨出して欲しい。

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

```python
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](https://bugs.python.org/issue32798)


`offset` の調整をしないと、`OSError` が発生してしまいます。
```
OSError: [Errno 22] Invalid argument
```

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

GSettings と dconf の関係

「GNOME 3 の設定は [dconf](https://wiki.gnome.org/Projects/dconf) という設定管理システムに保存されていて、[GSettings]([GSettings](https://developer.gnome.org/platform-overview/stable/tech-gsettings.html.en) はそのラッパー」という程度に理解していたのですが、
[Vino の設定をしたり](https://kokufu.blogspot.com/2018/10/ubuntu-1804-vino.html) するうちに、理解が深まってきたのでまとめておこうと思います。

> 参考
>
> [First steps with GSettings – GTK+ Development Blog](https://blog.gtk.org/2017/05/01/first-steps-with-gsettings/)

dconf の schema id と schema path の関係

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

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

2018/10/31

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

先日、`dconf` を用いて vino を有効にする方法を書いたのですが、これを `gsettings` を使って出来ないか探ってみました。

> 参考
>
> [Ubuntu 18.04 で Vino を有効にする方法(コマンドラインで)](https://kokufu.blogspot.com/2018/10/ubuntu-1804-vino.html)

2018/10/30

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

「[Vino の設定は gconftool-2 では出来ない](https://kokufu.blogspot.com/2017/09/vino-gconftool-2.html)」 に書いたように、Ubuntu 16.04 までは gsettings を用いて [Vino](https://people.gnome.org/~markmc/remote-desktop-2.html) を有効に出来ましたコマンドラインで。

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

2018/10/16

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

以前書いたように
dependency_links は Deprecated な状態にありながらも、有効な代替手段がない状態でした。

> 参考
> 
> [setup.py に dependency_links を書いても "Could not find a version that satisfies the requirement" が出る場合の対処方法4種 | 穀風](https://kokufu.blogspot.com/2018/04/setuppy-dependencylinks-could-not-find.html)

しかし、先日2018/10/5 リリースされた pip 18.1 で [PEP 508](https://www.python.org/dev/peps/pep-0508/) が実装され `dependency_links` を使わないで独自のレポジトリを指定できるようになりました。

2018/10/10

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

Ubuntu 18.04 で Python 3.5 系の動作確認をするためUbuntu 18.04 のデフォルトは Python 3.6 なので、ソースコードからビルドしてみました。

2018/10/06

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

qpdf 8.0.2 on Ubuntu 18.04

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

```console
`gutter: false;
$ qpdf --password=パスワード --decrypt input.pdf output.pdf
```

> 参考
> 
> [QPDF - TeX Wiki](https://texwiki.texjp.org/?QPDF)

2018/10/05

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

qpdf 8.0.2 on Ubuntu 18.04

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

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

```console
`gutter: false;
$ qpdf --empty --pages original_*.pdf -- out.pdf
```

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

> 参考
>
> [QPDF - TeX Wiki](https://texwiki.texjp.org/?QPDF)

2018/10/02

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

@ Ubuntu 18.04 LTS

[Unity のランチャにカスタムアプリを登録する(コマンドラインで)](https://kokufu.blogspot.com/2018/01/unity.html) で Ubuntu 16.04 用に書いた方法が
Ubuntu 18.04 では少し変更されました。

といっても、gsettings で指定するキーと形式が少し変わっただけです。

2018/09/14

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

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

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

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

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

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

Ubuntu を 18.04 LTS にアップグレードしたところ、Windows マシンへのリモートアクセスが出来なくなってしまいました。

winbind, libnss_wins もインストールしてあるのに。

> 参考
>
> [Winbind をインストールしたのに NetBIOS nameでアクセスできない on Ubuntu 13.10 | 穀風](https://kokufu.blogspot.com/2014/03/winbind-netbios-on-ubuntu-1310.html)

2018/08/03

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

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

2018/08/02

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

@[Remmina](https://remmina.org/) 1.2.31.2 on [Ubuntu](https://www.ubuntu.com) 16.04 LTS

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

> 参考
>
> [How To Install Remmina Remote Desktop Client in Ubuntu Linux](https://www.ubuntupit.com/how-to-install-remmina-remote-desktop-client-in-ubuntu-linux/amp/) 

そのせいかはわかりませんが最新にアップグレードしてからも一定期間は使えていた気がします、Windows 10 に RDP 接続すると IME が使えなくなってしまいました。

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

2018/07/05

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

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

他の Ubuntu マシンからアクセス出来ている [Vino](https://launchpad.net/ubuntu/+source/vino) に Windows 10 の VNC クライアントからアクセスしてみたのですが、エラーが出てうまくいきませんでした。

2018/06/29

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

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

[PyCharm](https://www.jetbrains.com/pycharm/) はユニットテストファイルを自動的に認識してコンテキストメニューを変化させてくれます。

例えば以下のように `main_test.py` を作成したとしてディレクトリ構造がフラットとか、プロジェクト名が…とか気にしないこと、

右クリック → Run 'Unittests in main_te...'
2018/06/16

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

Python では `__getitem__()` を実装したクラスは Iterable になります。

> 参考
>
> [PEP 234 -- Iterators | Python.org](https://www.python.org/dev/peps/pep-0234/)

2018/06/14

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

@Ubuntu 16.04 LTS

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

2018/06/06

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

Ubuntu 16.04 LTS に [Sikuli](http://www.sikuli.org/) をインストールしたのでメモ。

2018/06/01

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

Software Update をしたからだと思うのですが特に新規のハードウェアを追加したりはしていない、突然プリンター(ネットワーク接続)が使用出来なくなりました。

System Settings の Printers を選択すると以下のようなエラーが表示されます。 > Printing service not available. Start the service on this computer or connect to another server.
### cups サービスが動いていない 確認してみると、cups サービスが起動していない様子。 ```console `gutter: false; $ systemctl status cups ● cups.service Loaded: masked (/dev/null; bad) Active: inactive (dead) ```
2018/05/23

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

### python2 では signed、python3 では unsigned として扱われる
具体的な例としては以下。

```python
`title: "python2";
>>> import binascii
>>> binascii.crc32(b"Hello")
-137262718
```

```python
`title: "python3";
>>> import binascii
>>> binascii.crc32(b"Hello")
4157704578
```

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

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

> 参考
>
> [Issue 4903: binascii.crc32() - document signed vs unsigned results - Python tracker](https://bugs.python.org/issue4903)

2018/05/12

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

[モニタをつないでいない Ubuntu の Vino に接続する](https://kokufu.blogspot.com/2018/02/ubuntu-vino.html) で Vino に繋がるようになったのは良いものの、キーボードレイアウトがおかしいようです日本語でもなければ、普通の英字キーボードでもない。
よく考えれば何も設定していないのであたりまえですね。

2018/05/11

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

[Ubuntu 18.04 LTS](http://releases.ubuntu.com/18.04/) が出ましたね。

メインマシン(16.04 LTS) にアップデート通知がこないなーと思いつつ、
ちょうど仕事が忙しいタイミングと重なって放置していましたこのタイミングでアップデートするわけにもいかず、ちょうど良かったとも言える。

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

[BionicBeaver/ReleaseNotes - Ubuntu Wiki](https://wiki.ubuntu.com/BionicBeaver/ReleaseNotes#Upgrading_from_Ubuntu_16.04_LTS)

> 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 の[リリーススケジュール](https://wiki.ubuntu.com/BionicBeaver/ReleaseSchedule)は7月後半一応、7月26日の予定。
ちょっと先ですね。
悩ましい。
2018/04/27

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

@Ubuntu 16.04 LTS18.04 LTS がまさに出ようというその時に…

[ImageMagick](http://www.imagemagick.org/script/index.php) が heic フォーマットHEIF フォーマットと言った方が良いのか?しかし、HEIF はコンテナフォーマットのことなので適切とは言えないか…に対応したようなので、ソースコードからコンパイルしてインストールしてみました。

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

> 参考
>
> [ImageMagick-6.9.9-34差分 - yoyaのメモ](http://d.hatena.ne.jp/yoya/20180123/im)

2018/04/26

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

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

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

```python
`title: "core.py";
# -*- 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 を使わないでレポジトリを明示的に指定する方法](https://kokufu.blogspot.com/2018/10/dependencylinks.html)
Python で `pip install` 可能なパッケージを作成した際、 [PyPI](https://pypi.org/) に登録してしまえば `pip` が適切に処理してくれるので簡単です。 しかし、内部用のライブラリの場合は明示的にリポジトリの場所を指定しなければなりません。 そのための機能として、`setuptools.setup()` には `dependency_links` という引数があります。 ところが、`pip install` しようとした場合、`dependency_links` は無視されてしまい、うまくいきません。 `dependency_links` は、基本的に `python setup.py install` の場合を想定しているようです。 ただ、`pip` は `setup.py` の上位ラッパーこの表現が適切かどうかは怪しいですがのはず。 対処方法が無いはずはないと思って調べてみました。
2018/04/07

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

2つのファイルを同時にオープンして、処理が終了したら同時にクローズするような処理例えば、解析対象ファイルと結果出力ファイルなどはよく行われると思うのですが、私は最近まで `with` をネストして書いていました。

が、Python 2.7 以降は以下のように書けるとのこと。
知らなかった以前、調べた時は出来ないって書いてあった記憶が。古い情報を引っ張ってしまったのかもしれません。。。。

```python
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](https://stackoverflow.com/questions/4617034/how-can-i-open-multiple-files-using-with-open-in-python)

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 をインストールする方法

以前、[Ubuntu 16.04 に wxPython (Python3用) をインストール | 穀風](https://kokufu.blogspot.com/2017/04/ubuntu-1604-wxpython-python3.html) を書いたのですが、
[wxPython 4.0.1](https://www.wxpython.org/news/wxpython-4.0.1-release/index.html) になって微妙に依存関係が変わったようです。

2018/03/07

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

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

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

2018/03/05

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

先日書いた [wxPython でパネルを動的追加する方法 | 穀風](https://kokufu.blogspot.com/2018/03/wxpython.html) を Two Stage Creation を使って実装し直しました。

> Two Stage Creation については、以下を参考にしてください
>
> - [wxPython Project Phoenix Migration Guide — wxPython Phoenix 4.0.1 documentation](https://docs.wxpython.org/MigrationGuide.html#phase-create)
> - [XRC and two stage creation in Phoenix - Google グループ](https://groups.google.com/forum/#!topic/wxpython-users/KNCAAYJKpQU)
> - [Phoenix compatibility in pywxrc by acolomb · Pull Request #726 · wxWidgets/Phoenix](https://github.com/wxWidgets/Phoenix/pull/726/files)
> - [wxPython & XRC で Custom Frame を作る方法3種 | 穀風](https://kokufu.blogspot.com/2018/03/wxpython-xrc-custom-frame-3.html)

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

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

@wxPython 4.0.1 (Phoenix)

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

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

今回は、例として、Button が一つ中央にある Custom Frame を作ってみます例が全く複雑なUIじゃない!
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` はラベルとボタンが一つずつあるだけのシンプルなもので、ボタンをクリックすると自パネルの背景が変わるというお遊びつきです全く役に立たない!
なお、`MyPanel` は [wxPython & XRC で Custom Frame を作る方法2種+α | 穀風](https://kokufu.blogspot.com/2018/03/wxpython-xrc-custom-frame-2.html) で紹介した方法で XRC から生成していますFrame も XRC から作れますが、今回は Panel が主役なのであえてコードで生成

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.Frame` や `wx.Panel` を継承した class を作ることでこれを実現できますが、どうもコードベースで実装している例が多いようです。 しかし、View は分離しておきたいもの。特に複雑なUIの場合はなおさらです。 そこで、[XRC](https://wiki.wxpython.org/XRCTutorial) を使って Custom Frame (Panel) を作る方法を調べてみました。 今回は、例として、Button が一つ中央にある Custom Frame を作ってみます例が全く複雑なUIじゃない!
2018/02/28

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


`SetBackgroundColour`Colour とイギリスのスペルなので注意 の引数に文字列や `Colour` オブジェクトを指定している例はよく見かけるのですが、RGB でしたい時はどうするのだろうと思っていました。

```python
panel.SetBackgroundColour('blue')
panel.SetBackgroundColour(wx.Blue)
```

2018/02/22

measureText と getTextBounds の違い

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

2018/02/20

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

@Java 1.8.0

`ZipInputStream` から取得した `ZipEntry` の `getSize()` は `-1` になることがあります。

```java
`highlight: 6;
    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](https://github.com/GNOME/vino) はそもそも画面をミラーリングするアプリケーションなので、画面出力をしていないマシンにつなぐことは出来ません。

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

> 参考
>
> [Vino - ArchWiki](https://wiki.archlinux.jp/index.php/Vino#.E3.83.98.E3.83.83.E3.83.89.E3.83.AC.E3.82.B9.E3.82.B5.E3.83.BC.E3.83.90.E3.83.BC.E3.81.A7.E5.AE.9F.E8.A1.8C)

2018/02/14

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

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

2018/02/13

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

このご時世にシリアル通信というのも何ですが、組み込み関係等では現役だったりしますとはいえ、シリアル通信ケーブルを使うのではなく、USB がほとんどですが。

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

そんな時は、[Tera Term](https://ja.osdn.net/projects/ttssh2/) を使っていたのですが、[Windows 10 では Linux が動くようになった](https://ja.wikipedia.org/wiki/Windows_Subsystem_for_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 ではビルド出来るのに、コマンドラインでは以下のようなエラーが出るようになってしまいました。

```console
`gutter: false;
$ ./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:
         https://jcenter.bintray.com/com/android/tools/build/gradle/3.0.1/gradle-3.0.1.pom
         https://jcenter.bintray.com/com/android/tools/build/gradle/3.0.1/gradle-3.0.1.jar
     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 でマウントする方法

Ubuntu 16.04 LTS 上で VDI を Raw Disk Image に変換したもので確認。

> 参考
>
> - [filesystems - how to find the type of img file and mount it - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/82314/how-to-find-the-type-of-img-file-and-mount-it/156480#156480)
> - [Convert .vdi to .img · GitHub](https://gist.github.com/hightemp/11196851)

2018/02/07

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

いつの間にか2017年4月なので、もう1年近くも前だ…、公式に Google Play がインストールされた Emulator が出ていたようです。

> 参考
>
> [Android Studio Release Updates: Google Play System Images: Android Studio 2.3.2 and Emulator 26.0.2 are now available in the Beta Channel](https://androidstudio.googleblog.com/2017/04/google-play-system-images-android.html)

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](https://play.google.com/store) の国情報を変えるには [Google ペイメントセンター](https://payments.google.com/payments/home) で新しいプロファイルを作成すれば良い。 という情報は各所で見られます。 ただ、私がその設定をして丸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 のランチャにカスタムアプリを登録する(コマンドラインで) | 穀風](https://kokufu.blogspot.com/2018/01/unity.html) ```text `title: "myapp.desktop"; [Desktop Entry] Type=Application Name=My Application Exec=/home/username/bin/myapp Icon=face-angel Terminal=false ``` インストール ```console `gutter: false; $ desktop-file-install --dir="${HOME}/.local/share/applications" myapp.desktop ```
2018/01/31

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

@ Ubuntu 16.04 LTS

もうすぐ Ubuntu 18.04 LTS が出るであろうこのタイミングで Unity の設定について書こうと思います18.04 のデフォルトデスクトップは Unity ではなく Gnome Desktop になるとのこと。

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

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段階の処理で可能一発で変換するツールは見つけられなかったけど、コマンドラインで処理できるのでスクリプトを書いておけばOK。

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

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

```console
`gutter: false;
$ 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` は省略可能。

```console
`gutter: false;
$ 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)
2018/01/19

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

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