2015/12/29

GTK+ で Label の背景色を変更する

Windowless Widget は背景色を変更することができない

Label, Button, Paned, Frame などの Windowless Widget は背景色を変更することが出来ないそうです。
そのため、以下のようなコードを書いても背景はデフォルトのままです。

// 以下は Gtkmm のコードですが、GTK+ でも同様に書くと動作しません
Gtk::Label* label = Gtk::manage(new Gtk::Label());
label->modify_bg(Gtk::STATE_NORMAL, bg_color);
label->set_label(message);
widget->add(*label);

背景色は EventBox で変える

ではどうするのかと言うと、以下のように EventBoxLabel 等を入れ子にして、 EventBox の背景色を変えるという方法を使うようです。

Gtk::Label* label = Gtk::manage(new Gtk::Label());
label->set_label(message);
Gtk::EventBox* ebox = Gtk::manage(new Gtk::EventBox());
ebox->modify_bg(Gtk::STATE_NORMAL, bg_color);
ebox->add(*label);
widget->add(*ebox);

参考
以下に情報がありますPython インターフェースですが
PyGTK FAQ Entry

2015/12/25

zsh でインストールされていないコマンドを叩いた場合、パッケージ名を推測して教えてくれるようにする

@Ubuntu 14.04 LTS

zsh では bash のような機能が働かない

Ubuntu の bash では、インストールされていないコマンドを叩いた場合、以下のように類推したパッケージ名を教えてくれて便利です。
$ vld
No command 'vld' found, did you mean:
 Command 'gld' from package 'postfix-gld' (universe)
 Command 'vlc' from package 'vlc-nox' (universe)
 Command 'bld' from package 'bld' (universe)
 Command 'fld' from package 'kon2' (universe)
 Command 'vl' from package 'atfs' (universe)
 Command 'ld' from package 'binutils' (main)
vld: command not found

ところが、zsh だとエラーメッセージだけ。
% vld
zsh: command not found: vld

zsh でも出来るようにする

これを bash 風に変えるには以下を設定ファイルに追加します。

~/.zshrc (or /etc/zshrc)
if [[ -f /etc/zsh_command_not_found ]] then
  source /etc/zsh_command_not_found
fi

command-not-found がインストールされていない場合

/etc/zsh_command_not_found が存在しない場合は、インストールしましょう。

% sudo apt-get install command-not-found
2015/10/10

AndroidStudio で Generate Signed APK を実行したら "Unable to compute hash of ..." と出た場合の対処方法

AndroidStudio で署名した APK を作成しようとしたら以下のようなエラーがでてしまいました AndroidStudio 1.4
compileSdkVersion 23
buildToolsVersion "23.0.1"

2015/09/20

AVD を立ち上げようとしたら libstdc++.so.6 が無いと言われた on Ubuntu 14.04

諸事情で Ubuntu 14.04 LTS (64bit) をクリーンインストールしました。

その後、Android Studio を立ち上げ、普通に使っていたのですが、AVD を起動しようとすると、以下のようなエラーが。

Cannot launch AVD in emulator.
error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory


確認してみるも、libstdc++6はちゃんとインストールされている様子。
これ、以前もハマったやつだ!
というわけで、32bit 系のライブラリを用意してやることで解決しました。
$ sudo apt-get install lib32stdc++6

ちょっと古い記事だと「ia32-libs をインストールせよ。」と書いてあるものもあるのですが、Ubuntu 13.10 からはライブラリが分割されたみたいです。
2015/09/13

VirtualBox で Raw disk vmdk を作ろうとした時に VERR_ACCESS_DENIED が出る時の対処方法 on Ubuntu 14.04

VirtualBox で Raw disk にアクセスできるようにするには、vmdk ファイルを作るのが一般的のようです。
しかし、普通に作成しようとすると、以下のように VERR_ACCESS_DENIED が出てしまいます。
VBoxManage internalcommands createrawvmdk -filename ~/text.vmdk -rawdisk /dev/sda
VBoxManage: error: Cannot open the raw disk '/dev/sda': VERR_ACCESS_DENIED
VBoxManage: error: The raw disk vmdk file was not created

アクセス権の問題なので、sudo を使えば回避できるのですが、その場合、virtualbox 自体もスーパーユーザー権限で起動しないといけません。 そうしないと、以下のようなエラーが発生してしまいます。
Failed to open the hard disk file /home/yusuke/text.vmdk.

Permission problem accessing the file for the medium '/home/yusuke/text.vmdk' (VERR_ACCESS_DENIED).

Result Code: VBOX_E_FILE_ERROR (0x80BB0004)
Component: Medium
Interface: IMedium {05f2bbb6-a3a6-4fb9-9b49-6d0dda7142ac}
Callee: IVirtualBox {fafa4e17-1ee2-4905-a10e-fe7c18bf5554}
Callee RC: VBOX_E_OBJECT_NOT_FOUND (0x80BB0001)

しかし、せっかくの仮想環境をスーパーユーザー権限で起動するのはセキュリティ的にも問題があります。

自分を disk グループに追加するだけで良い

実は、これには簡単な回避方法があります。
以下のように自分を disk グループに追加してやるのです。(追加したあとは、再起動が必要です)

$ sudo gpasswd -a YOUR_USERNAME disk

すると、vmdk の作成も、virtualbox の起動も、先のユーザで問題なく実行できるようになります。

グループを調べる

Ubuntu 14.04 であれば、disk グループで間違いないと思いますが、こういうのは時々変わったりするので書いておきます。
以下のように、 デバイスファイルのグループ名とグループアクセス権を確認可能です。
% ls -al /dev/sd*
brw-rw---- 1 root disk 8,  0  9月 13 14:17 /dev/sda
brw-rw---- 1 root disk 8,  1  9月 13 11:36 /dev/sda1
brw-rw---- 1 root disk 8,  2  9月 13 11:36 /dev/sda2
brw-rw---- 1 root disk 8,  3  9月 13 11:36 /dev/sda3
brw-rw---- 1 root disk 8, 16  9月 13 11:36 /dev/sdb
brw-rw---- 1 root disk 8, 17  9月 13 11:36 /dev/sdb1
brw-rw---- 1 root disk 8, 32  9月 13 11:36 /dev/sdc
brw-rw---- 1 root disk 8, 33  9月 13 11:36 /dev/sdc1
brw-rw---- 1 root disk 8, 48  9月 13 11:36 /dev/sdd