2017/08/07

lib32bz2-1.0 がインストール出来ない

@ Ubuntu 16.04 LTS (64bit)

久しぶりに [Android Studio](https://developer.android.com/studio/index.html) を新規インストールしようと思ったら、`lib32bz2-1.0` がインストール出来ませんでした。

```console
`gutter: false;
$ sudo apt install lib32bz2-1.0
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package lib32bz2-1.0
E: Couldn't find any package by glob 'lib32bz2-1.0'
E: Couldn't find any package by regex 'lib32bz2-1.0'
```

どうもパッケージ名が変わったというか、正式なパッケージ名にアーキテクチャをつける方式に変更になったみたいです。

参考
[apt - Unable to locate package lib32bz2-1.0 - Ask Ubuntu](https://askubuntu.com/questions/637113/unable-to-locate-package-lib32bz2-1-0#comment910010_637121)
というわけで、以下のようにすればインストールできました。 ```console `gutter: false; $ sudo apt install libbz2-1.0:i386 ``` 他の 32bit 系のパッケージでも参考になるかもしれないですね。

2017/07/07

タイルオーバーレイの x, y 座標を緯度・経度に変更する方法 (Google Maps Android API)

Google Maps Android API v2 では[タイル オーバーレイ](https://developers.google.com/maps/documentation/android-api/tileoverlay?hl=ja)が使えるようになり、独自の地図を重ねあわせたりするのに使えます。

2017/05/14

wxPython は Phoenix という新しいバージョンがあるので注意

[最近、wxPython を使い始めた](https://kokufu.blogspot.jp/2017/04/ubuntu-1604-wxpython-python3.html) のですが、本やドキュメントの内容をそのまま適用できないケースが多いのです。
調べてみると、Phoenix という新しいプロジェクトが始まり、仕様が結構変わったようです。

[Welcome to the wxPython Phoenix Project](https://wxpython.org/Phoenix/docs/html/)

公式サイトには以下のようにあります。

> Likewise the intent with the wxPython Phoenix project is throw almost everything from wxPython Classic into the fire to be built anew from the ashes of its former self, without all of the old crud that had built up over the long life of Classic.

意訳すると、「(不死鳥フェニックスと)同様、wxPython Phenix プロジェクトの目的は、wxPython Classic のほぼ全てを炎の中に投げ入れ、Classic の長い歴史の中で作られた問題点を解決した新たな wxPython を灰の中から再構築することです。」
といった感じでしょうか。

2017/05/13

独自 bootanimation.zip を adb shell 上から実行する

独自の `bootanimation.zip` をエミュレーター、もしくは実機に送って表示する方法です。 `adb push` で送って実行するだけなのですが、要注意点がいくつかあるので備忘録として書いておきます。 なお、独自 `bootanimaion.zip` の作り方は、以下を参考にしてください。 - [Deciphering Android's bootanimation.zip desc.txt](https://blog.justinbull.ca/making-a-custom-android-boot-animation/) - [bootanimation.zip は圧縮してはいけない | 穀風](https://kokufu.blogspot.jp/2016/10/bootanimationzip.html) 以下の方法は Android 7.0 のエミューレーターで動作確認しています。 また、この方法はデバイス(エミュレーター)の root 権限を必要とします。

2017/05/12

bootanimation を adb shell 上から実行する

[AOSP](https://source.android.com/) をビルドしてカスタムロムを作っていると、`bootanimation.zip` を独自の物に交換したくなると思いますえ?ならない?。 そんな時に、いちいちデバイスを再起動もしくは、エミュレーターを再起動していると時間の無駄なので、コマンドラインから実行してみました。 動作確認は Android 7.0 のエミュレーターで行っています。 なお、この方法を実行するには root 権限が必要です。

2017/04/27

TARGET_OUT_APPS 等の定数一覧 (AOSP)

自分用備忘録。

Android.mk を書いていると `TARGET_OUT` 等の定数をよく使いますが、それらは
`build/core/envsetup.mk` に定義されています。

`build/envsetup.mk` ではないので注意名前が紛らわしい!

2017/04/25

Ubuntu 16.04 に wxPython (Python3用) をインストール

pip で依存関係の多いライブラリをインストールするのは結構面倒くさいです。
今回、 Python3 用の [wxPython](https://wxpython.org/) をインストールしようと思ったら結構はまったので自分用メモ。

今回は様々な依存関係を断つために、Docker 上にインストールしてみましたもちろん、Docker を使わなくてもインストールは出来るはずです。。
Docker 便利だなー。

2017/04/19

Linux で Logicool Unifying Receiver のペアリングをする方法

Android 端末にキーボードとマウスを繋いで検証する必要が出てきたので、新たに [Logicool](https://www.logicool.co.jp/ja-jp) のキーボードを買いました。

マウスは以前買ったものがあり、[Unifying Receiver](https://www.logicool.co.jp/ja-jp/promotions/6072) を使えばUSBポートの節約にもなるというわけです。
Unifying Receiver は購入時にペアリング済みなので、USB端子に挿せばそのまま USB の有線キーボード・マウスのように使用可能です。ただ、今回のように別々に買った場合は、どちらかを再ペアリングする必要があります。 再ペアリングには Logicool の提供しているユーティリティを使用しますが、Windows と Mac 用しか提供されていません。 しかし、我が家のマシンはほとんど Linux。 つまり、買っても再ペアリングできないという問題が正確には Windows のノートPC等があるので、実は大した問題ではないです。Linux でやりたかっただけ!

2017/04/04

/system/app と /system/priv-app の違い

今まで、「Android のプリインアプリは `/system/priv-app` にいれておく」と深く考えずに使っていました。
しかし、`/system/` 以下をよく見てみると `/system/app` というディレクトリもあって、apk がインストールされていますAndroid 7.0 (Google APIs) のエミュレーターで確認。

そこで、これらの違いは何なのか調べてみました。


### priv-app 以下だけがシステム権限を持てる

[What's the difference of /system/app/ and /system/priv-app in Kitkat? - Google グループ](https://groups.google.com/forum/#!topic/android-platform/Vsa4IsJcOPE)

> Only apks in /system/priv-app can use "system"-level permissions. Prior to Kitkat, all apks on the system partition could use those permissions.

「(Kitkat 以降は)`/system/priv-app` 以下にある apk だけがシステムレベルのパーミッションを使用できる。 Kitkat より前は `/system` 以下にある全ての apk がシステムレベルのパーミッションを使用できる。」ということのようです。

ただ、以下を読むと、この動作に関しての公式なドキュメントが無いとのこと。
明らかに動作から推測できるので深追いはしていませんが、本来は AOSP のコードを読むなりして裏を取るべきですね。

[Android system apps and stopped state - Stack Overflow](http://stackoverflow.com/questions/17200575/android-system-apps-and-stopped-state)


### どう使い分けるのか
`/system/priv-app` にインストールされているアプリを見ると「電話帳」「カレンダー」等、プライバシーに関わるコンテントプロバイダやサービスが主です。
対して、`/system/app` 以下は UI を提供したり「重要だけど特別な権限はいらなそう」なアプリがインストールされていますEasterEgg ってアプリもインストールされていますが、重要ではないな :-)。

つまり、以下のように使い分けているようです。

- `/system/priv-app`  
  本当にシステム権限を必要とする特権アプリ

- `/system/app`  
  システム権限は必要としないけど、アンインストールはされたくないアプリ


### システム権限とは
システム権限を持つアプリというのは、具体的に言うと `AndroidManifest.xml` に `android:sharedUserId="android.uid.system"` の記述があるアプリですさらに、ROM と同じ署名がされている必要があります。
こういったアプリは `system` ユーザー権限で動作し、Linux OS レベルで様々なアクセス権を持つことができます。

```xml
`first-line: 2; highlight: 4;
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:sharedUserId="android.uid.system"
```

2017/03/21

バッチファイルで virtualenv activate する

Windows でタスク処理をする必要が出てきたので、超久しぶり10年以上…か?にバッチファイルを書きました。

と言っても、処理自体は Python で書いて、起動をバッチファイルで行うだけなので簡単・・・と思っていたら、ハマりました。

### activate しようとすると止まってしまう
私が最初に書いたバッチファイルが以下です。

`test` という名前の virtualenv を activate して、`main.py` を実行するだけ。
当然、問題なく動くと思ったのですが、`activate.bat` を呼んだ直後に止まってしまうのですちなみに、`%HOME%` はホームディレクトリを指定してます。

```
"%HOME%\Envs\test\Scripts\activate.bat"

cd "%HOME%\tasks"

python main.py
```

### バッチファイル中からバッチファイルを呼ぶ時は `call` を使う
調べてみたら、バッチファイルを直接記述で呼び出すと止まるらしいイケて無いと思うのは私だけ?。

> 参考
> - [Windows、バッチファイルからバッチファイルを呼び出す方法あれこれ|マコトのおもちゃ箱 ~ぼへぼへ自営業者の技術メモ~](http://piyopiyocs.blog115.fc2.com/blog-entry-280.html)

というわけで、`activate.bat` の呼び出しに `call` をつければオーケーでした。

```
call "%HOME%\Envs\test\Scripts\activate.bat"

cd "%HOME%\tasks"

python main.py
```

2017/03/08

git repository 中の CRLF を LF に一括変換する

以下のサイトを参考に自分用にちょっとアレンジ。特にバイナリを変換しちゃいそうになって危なかったので。

- [Git for Windows でレポジトリー上の CR LF を LF に変換する手順 - てっく煮ブログ](http://tech.nitoyon.com/ja/blog/2014/03/28/git-crlf-to-lf/)

2017/03/07

ls の出力が文字化けみたいになってしまう原因


> 注:  
> 今回は文字コードがらみの話ではありません。日本語が文字化けしてしまう場合は文字コードを確認してみると良いでしょう。

`ls` の出力をそのままファイルに出力すると、文字化けのようになってしまうことがあります。

```console
`gutter: false;
$ ls
Dir/
$ ls > ../test.txt
$ less ../test.txt
ESC[0mESC[01;34mDirESC[0m
```

### 原因はフォーマットコード
これ、最初に見るとびっくりしますが、実はターミナルのフォーマットコードです。
`ls` の出力をターミナル上で確認すると、以下のように色付きなのがわかります。

つまり、表示されてはいないけど、ターミナルの装飾用フォーマットコードが同時に出力されているということです。 例えば `.bashrc` 等の中で alias を設定していたりすると、こういった動作になります。 ```bash alias ls='ls --color' ``` `ls` はわかりやすい例ですが、その他の装飾文字を出力するコマンドは同様の問題が起こる可能性があります。 ### 対策1 フォーマットを切る 当たり前ですが、フォーマットしないように設定すれば直ります。一時的に対策するには良いでしょう。 ```console `gutter: false; $ ls --color=never > ../test.txt $ less ../test.txt Dir ``` ### 対策2 `--color=auto` を指定する `--color` は `--color=always` と等価なので問題が起こりますが、 `--color=auto` にするとターミナルに出力される時だけフォーマットコードが挿入されます。 `.bashrc` 等の設定で、以下のように `--color=auto` にしておくと問題が起きにくくなります。 ```bash alias ls='ls --color=auto' ``` ### フォーマットコードの仕様 フォーマットコードは慣れると簡単で、"ESC" (`0x1b`) "[" (`0x5b`) と "m" (`0x6d`) の間にコードを入れて表します。 文字装飾(太字、イタリック等)と文字色、背景色を設定することが出来ます。 具体的な値は以下のサイトにわかりやすくまとまっていたのでご参照ください。 > 参考 > - [bash:tip_colors_and_formatting - FLOZz' MISC](http://misc.flogisoft.com/bash/tip_colors_and_formatting) 例えば先程の例 `ESC[0mESC[01;34mDirESC[0m` だと、 以下のようになります。 - "01" Bold - ";" 区切り文字 - "34" Forground Blue - 前後の `ESC[0m` はリセット ちなみに、バイナリだと以下のようになります。 ```console `gutter: false; $ ls --color | od -t x1 0000000 1b 5b 30 6d 1b 5b 30 31 3b 33 34 6d 44 69 72 1b 0000020 5b 30 6d 0a ```

2017/03/06

git でバイナリファイルとして扱われているファイル一覧を取得する

滅多に使わないので備忘録。

```console
`gutter: false;
$ diff --unchanged-group-format='' <(git grep -Ilc '') <(git grep -lc '')
```

`git grep -I` でバイナリファイルを無視するので、`-I` 有りと無しの差分を取るというアイデア。

参考リンクは出力をフォーマットするのにいろいろ駆使していますが、 `git grep -l` と `diff` の標準機能を組み合わせてシンプルにしてみました。

> 参考
> - [Find all binary files in git HEAD - Stack Overflow](http://stackoverflow.com/questions/30689384/find-all-binary-files-in-git-head)

2017/02/28

Python でディレクトリ内のファイル一覧を取得する方法3種

微妙に動作が違ってすぐ迷うので備忘録動作確認は Python 2.7.12 と 3.5.2 で行いました。

例として、こんなディレクトリ構造を使用します。

```text
`gutter: false;
.
└── dir
    ├── a.txt
    ├── b.txt
    ├── c.jpg
    └── subdir
        ├── d.yaml
        └── e.conf
```

2017/02/27

Docker で GUI アプリケーションを実行する方法

「[Docker](https://www.docker.com/) 上で GUI アプリケーションを動かす」という投稿を見つけたので、ちょっとやってみましたDocker でインタラクティブな GUI を動かすのは本来の思想に合ってないという点はとりあえずおいておく。

> 参考
> - [Running GUI apps with Docker – Fábio Rehm](http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/)

2017/02/16

動画を切り出してアニメーションGIFを作る方法

[Android で Custom Progress Bar を作る方法](http://kokufu.blogspot.jp/2017/02/android-custom-progress-bar.html) を書いてて、アニメーションGIF を作った時の備忘録。

結局、[ffmpeg](https://ffmpeg.org/) で全フレームを静止画に変換し、各フレームを [ImageMagick](https://www.imagemagick.org/script/index.php) で処理してから、アニメーションGIFに変換するのがベストという結論に。

2017/02/15

Android で Custom Progress Bar を作る方法

Progress **Bar** といっても、バー状のものではなく、indeterminate モードを自作する方法です。
indeterminate モードは、終了時間が未定の時に使用される周期的なアニメーションを指します。

### indeterminateDrawable を記述すればよい 実は、やり方は簡単。 `ProgressBar` の `indeterminateDrawable` に [Drawable Animation](https://developer.android.com/guide/topics/graphics/drawable-animation.html) を指定すれば良いのです。 注意点としては、`layout_width`, `layout_height` に `wrap_content` が使えないということ。サイズを指定する必要があります。 /res/layout/activity_main.xml ```xml `highlight: 10; <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ProgressBar android:layout_width="120dp" android:layout_height="120dp" android:layout_centerInParent="true" android:indeterminateDrawable="@drawable/animation01" /> </RelativeLayout> ``` ### Drawable Animation の作り方 [Drawable Animation](https://developer.android.com/guide/topics/graphics/drawable-animation.html) はリンク先にもあるようにパラパラ漫画の要領でアニメーションを作成します。 例えば、`ic_signal_wifi_[0-4].png` のようなファイルを用意し、以下のように `animation01.xml` に記述します。 /res/drawable/animation01.xml ```xml <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:duration="200" android:drawable="@drawable/ic_signal_wifi_0_bar" /> <item android:duration="200" android:drawable="@drawable/ic_signal_wifi_1_bar" /> <item android:duration="200" android:drawable="@drawable/ic_signal_wifi_2_bar" /> <item android:duration="200" android:drawable="@drawable/ic_signal_wifi_3_bar" /> <item android:duration="200" android:drawable="@drawable/ic_signal_wifi_4_bar" /> </animation-list> ``` あとは、上記のように `indeterminateDrawable` 属性に指定すれば、以下のような Custom Progress Bar が完成します。
### さらに簡易的な方法もある 単純な回転の場合、 [Animation Resources](https://developer.android.com/guide/topics/resources/animation-resource.html) の [RotateDrawable](https://developer.android.com/reference/android/graphics/drawable/RotateDrawable.html) を使えば、リソースが一つしかなくても回転アニメーションを作成できます。 例えば以下のように-360 にしているのは回転方向を反時計周りにするためです。。 /res/drawable/animation02.xml ```xml <?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="0" android:toDegrees="-360" android:drawable="@drawable/ic_sync"/> ```
この方法、速度指定できないですし、細かい制御には向いていません。 > 参考 > > 速度を N倍にする方法はあるみたい > - [AndroidのRotateDrawableで回転速度を調整する - scache’s blog](http://scache.hatenablog.com/entry/2016/12/15/022152)

2017/02/07

PSoC で I2C のアドレスをスキャンする方法

[Cypress](http://japan.cypress.com/) PSoC の I2C モジュールを使ってアドレスをスキャンする方法。
こんなの滅多にやらないから、備忘録として。

> 参考
> - [I2C Scan | Cypress Semiconductor](http://japan.cypress.com/forum/psoc-4-architecture/i2c-scan)

```c
bool TestI2CAddress(uint8 address)
{
    uint32 status = I2C_I2CMasterSendStart(address,I2C_I2C_READ_XFER_MODE);
    I2C_I2CMasterSendStop();
    return !status;
}

int main()
{
    static uint8 I2C_address;

    CyGlobalIntEnable;
    I2C_Start();
    
    while(true)
    {
        for(I2C_address = 0; I2C_address < 0x7F; I2C_address++)
        {
            if(TestI2CAddress(I2C_address))
            {
                // I2C_address が存在する
                // 出力する等何か処理
            }
        }
        while(true)
        {
            // Wait
        }
    }
}
```

2017/01/30

Python で Dictionary を List の join みたいに結合文字列にする方法

Python で Dictionary を List のように "," で join する良い方法を探していたら、こんなのを発見。

> 参考
> - [python: dictionary to string, custom format? - Stack Overflow](http://stackoverflow.com/questions/8519599/python-dictionary-to-string-custom-format)

そうか、一回リストにしちゃえばいいわけだ動作確認は以下で行いました
- Python 2.7.12
- Python 3.5.2
。 ``` >>> dic={"a":1, "b": 2} >>> ",".join(["{0}={1}".format(key, value) for (key, value) in dic.items()]) 'a=1,b=2' ```

2017/01/16

drawable-nodpi と drawable-anydpi と drawable の違い


[Android Drawable Importer](https://github.com/winterDroid/android-drawable-importer-intellij-plugin) というプラグイン一般的によく使われるようなアイコンを一発で追加できるプラグインです。結構便利。を使って Vector Drawable を追加すると、`drawable-anydpi` というディレクトリに追加されます。 前々から気になっていた `drawable-nodpi` との違いを調べてみたところ、意外と情報が少なかったのですが、こちらのブログに情報がありました。 - [The CommonsBlog — -nodpi, -anydpi, and WTF?](https://commonsware.com/blog/2015/12/21/nodpi-anydpi-wtf.html) 以下、まとめようと思ったのですが、原文がすばらしかったので、ほぼ翻訳です。

2017/01/08

通知を出しているアプリを確認する方法 (Android)

Android 5.0 lollipop 以降、通知を出しているアプリが簡単にわかるようになりました。

やり方は簡単。
まず、通知を**長押し**します。
すると、以下のように通知を出しているアプリ名が表示されます。 ちなみに、右端の「i」ボタンをクリックすると、通知設定画面に飛びます。