2017/09/10

Vino の設定は gconftool-2 では出来ない

2018/10/30 追記
Ubuntu 18.04 では設定方法が変わりました。
[Ubuntu 18.04 で Vino を有効にする方法(コマンドラインで) | 穀風](https://kokufu.blogspot.com/2018/10/ubuntu-1804-vino.html)
Ubuntu で Vino の設定をコマンドラインで行う場合、「`gconftool-2` を使う」と書いてあるサイトが沢山あるのですが、 既に `gconftool-2` は使えません。 `gconftool-2` は GNOME2 用の設定ツールなので、GNOME31 で導入された `gsettings` を使用します2

gsettings を使って、以下のように Vino を有効化することができます。

$ gsettings set org.gnome.Vino enabled true

設定できる項目一覧は以下のように取得可能です。

$ gsettings list-keys org.gnome.Vino
notify-on-connect
alternative-port
disable-background
use-alternative-port
icon-visibility
use-upnp
view-only
enabled
prompt-enabled
disable-xdamage
authentication-methods
network-interface
require-encryption
mailto
lock-screen-on-disconnect
vnc-password

Ubuntu 18.04 LTS からデフォルトデスクトップが Unity ではなく GNOME に戻るようなので、またいろいろ変わるんだろうなぁ。

参考

  1. 正確には gtk+3 
  2. Unity がベースにしている GNOME のバージョンがイマイチよくわからん… 
?
2017/08/07

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

@ Ubuntu 16.04 LTS (64bit)

久しぶりに Android Studio を新規インストールしようと思ったら、lib32bz2-1.0 がインストール出来ませんでした。

$ 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)

というわけで、以下のようにすればインストールできました。

$ sudo apt install libbz2-1.0:i386

他の 32bit 系のパッケージでも参考になるかもしれないですね。

2017/07/07

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

Google Maps Android API v2 ではタイル オーバーレイが使えるようになり、独自の地図を重ねあわせたりするのに使えます。

2017/05/14

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

最近、wxPython を使い始めた のですが、本やドキュメントの内容をそのまま適用できないケースが多いのです。 調べてみると、Phoenix という新しいプロジェクトが始まり、仕様が結構変わったようです。

Welcome to the wxPython Phoenix Project

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

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 Phoenix プロジェクトの目的は、wxPython Classic のほぼ全てを炎の中に投げ入れ、Classic の長い歴史の中で作られた問題点を解決した新たな wxPython を灰の中から再構築することです。」 といった感じでしょうか。

2017/05/13

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

独自の bootanimation.zip をエミュレーター、もしくは実機に送って表示する方法です。 adb push で送って実行するだけなのですが、要注意点がいくつかあるので備忘録として書いておきます。

なお、独自 bootanimaion.zip の作り方は、以下を参考にしてください。

以下の方法は Android 7.0 のエミューレーターで動作確認しています。

また、この方法はデバイス(エミュレーター)の root 権限を必要とします。

2017/05/12

bootanimation を adb shell 上から実行する

AOSP をビルドしてカスタムロムを作っていると、bootanimation.zip を独自の物に交換したくなると思います1

そんな時に、いちいちデバイスを再起動2していると時間の無駄なので、コマンドラインから実行してみました。

動作確認は Android 7.0 のエミュレーターで行っています。

なお、この方法を実行するには root 権限が必要です。

2017/04/27

TARGET_OUT_APPS 等の定数一覧 (AOSP)

自分用備忘録。

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

build/envsetup.mk ではないので注意1

  1. 名前が紛らわしい! 
?
2017/04/25

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

2018/3/8 追記
wxPython 4.0.1 では微妙に依存関係が変わったようなので書き直しました。 公式に Wheel が用意されたので、簡単にインストール出来ます。

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

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

今回は様々な依存関係を断つために、Docker 上にインストールしてみました1。 Docker 便利だなー。

2017/04/19

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

Android 端末にキーボードとマウスを繋いで検証する必要が出てきたので、新たに Logicool のキーボードを買いました。

マウスは以前買ったものがあり、Unifying Receiver を使えばUSBポートの節約にもなるというわけです。

Unifying Receiver は購入時にペアリング済みなので、USB端子に挿せばそのまま USB の有線キーボード・マウスのように使用可能です。ただ、今回のように別々に買った場合は、どちらかを再ペアリングする必要があります。

再ペアリングには Logicool の提供しているユーティリティを使用しますが、Windows と Mac 用しか提供されていません。 しかし、我が家のマシンはほとんど Linux。 つまり、買っても再ペアリングできないという問題が1

2017/04/04

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

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

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

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

What's the difference of /system/app/ and /system/priv-app in Kitkat? - Google グループ

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

どう使い分けるのか

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

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

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

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

システム権限とは

システム権限を持つアプリというのは、具体的に言うと AndroidManifest.xmlandroid:sharedUserId="android.uid.system" の記述があるアプリです3。 こういったアプリは system ユーザー権限で動作し、Linux OS レベルで様々なアクセス権を持つことができます。

2
3
4
    xmlns:tools="http://schemas.android.com/tools"
    android:sharedUserId="android.uid.system"
  1. Android 7.0 (Google APIs) のエミュレーターで確認 
  2. EasterEgg ってアプリもインストールされていますが、重要ではないな :-) 
  3. さらに、ROM と同じ署名がされている必要があります 
?
2017/03/21

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

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

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

activate しようとすると止まってしまう

私が最初に書いたバッチファイルが以下です。

test という名前の virtualenv を activate して、main.py を実行するだけ。 当然、問題なく動くと思ったのですが、activate.bat を呼んだ直後に止まってしまうのです2

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

cd "%HOME%\tasks"

python main.py

バッチファイル中からバッチファイルを呼ぶ時は call を使う

調べてみたら、バッチファイルを直接記述で呼び出すと止まるらしい3

参考

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

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

cd "%HOME%\tasks"

python main.py
  1. 10年以上…か? 
  2. ちなみに、%HOME% はホームディレクトリを指定してます 
  3. イケて無いと思うのは私だけ? 
?
2017/03/08

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

2017/03/07

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

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

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

$ ls
Dir/
$ ls > ../test.txt
$ less ../test.txt
ESC[0mESC[01;34mDirESC[0m

原因はフォーマットコード

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

つまり、表示されてはいないけど、ターミナルの装飾用フォーマットコードが同時に出力されているということです。 例えば .bashrc 等の中で alias を設定していたりすると、こういった動作になります。

1
alias ls='ls --color'

ls はわかりやすい例ですが、その他の装飾文字を出力するコマンドは同様の問題が起こる可能性があります。

対策1 フォーマットを切る

当たり前ですが、フォーマットしないように設定すれば直ります。一時的に対策するには良いでしょう。

$ ls --color=never > ../test.txt
$ less ../test.txt
Dir

対策2 --color=auto を指定する

--color--color=always と等価なので問題が起こりますが、 --color=auto にするとターミナルに出力される時だけフォーマットコードが挿入されます。 .bashrc 等の設定で、以下のように --color=auto にしておくと問題が起きにくくなります。

1
alias ls='ls --color=auto'

フォーマットコードの仕様

フォーマットコードは慣れると簡単で、"ESC" (0x1b) "[" (0x5b) と "m" (0x6d) の間にコードを入れて表します。 文字装飾(太字、イタリック等)と文字色、背景色を設定することが出来ます。

具体的な値は以下のサイトにわかりやすくまとまっていたのでご参照ください。

参考

例えば先程の例 ESC[0mESC[01;34mDirESC[0m だと、 以下のようになります。

  • "01" Bold
  • ";" 区切り文字
  • "34" Forground Blue
  • 前後の ESC[0m はリセット

ちなみに、バイナリだと以下のようになります。

$ 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 でバイナリファイルとして扱われているファイル一覧を取得する

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

$ diff --unchanged-group-format='' <(git grep -Ilc '') <(git grep -lc '')

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

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

参考

2017/02/28

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

微妙に動作が違ってすぐ迷うので備忘録1

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

.
└── dir
    ├── a.txt
    ├── b.txt
    ├── c.jpg
    └── subdir
        ├── d.yaml
        └── e.conf
2017/02/27

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

2017/02/16

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

2017/02/15

Android で Custom Progress Bar を作る方法

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

indeterminateDrawable を記述すればよい

実は、やり方は簡単。 ProgressBarindeterminateDrawableDrawable Animation を指定すれば良いのです。 注意点としては、layout_width, layout_heightwrap_content が使えないということ。サイズを指定する必要があります。

/res/layout/activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
<?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 はリンク先にもあるようにパラパラ漫画の要領でアニメーションを作成します。

例えば、ic_signal_wifi_[0-4].png のようなファイルを用意し、以下のように animation01.xml に記述します。

/res/drawable/animation01.xml

1
2
3
4
5
6
7
8
9
<?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 ResourcesRotateDrawable を使えば、リソースが一つしかなくても回転アニメーションを作成できます。

例えば以下のように1

/res/drawable/animation02.xml

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
    android:pivotX="50%"
    android:pivotY="50%"
    android:fromDegrees="0"
    android:toDegrees="-360"
    android:drawable="@drawable/ic_sync"/>

この方法、速度指定できないですし、細かい制御には向いていません。

参考

速度を N倍にする方法はあるみたい

  1. -360 にしているのは回転方向を反時計周りにするためです。 
?
2017/02/07

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

Cypress PSoC の I2C モジュールを使ってアドレスをスキャンする方法。 こんなの滅多にやらないから、備忘録として。

参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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 する良い方法を探していたら、こんなのを発見。

参考

そうか、一回リストにしちゃえばいいわけだ1

1
2
3
>>> dic={"a":1, "b": 2}
>>> ",".join(["{0}={1}".format(key, value) for (key, value) in dic.items()])
'a=1,b=2'
  1. 動作確認は以下で行いました
    - Python 2.7.12
    - Python 3.5.2 
?
2017/01/16

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

Android Drawable Importer というプラグイン1を使って Vector Drawable を追加すると、drawable-anydpi というディレクトリに追加されます。 前々から気になっていた drawable-nodpi との違いを調べてみたところ、意外と情報が少なかったのですが、こちらのブログに情報がありました。

以下、まとめようと思ったのですが、原文がすばらしかったので、ほぼ翻訳です。

2017/01/08

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

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

やり方は簡単。 まず、通知を長押しします。

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