Archive for 技術

libwnck (ウィンドウマネージャ操作ライブラリ)

サイネージというほどのものではないけど、それ的なもののソフトウェアをつくるために、X上で外部プロセスのウィンドウをいじってどうにかするみたいなのを探した。

いろいろ当り最終的にlibwnckを見つけた。ウィンドウマネージャの操作ライブラリ。Pythonバインディングのpython-libwnckもある。

import wnck, gtk
screen = wnck.screen_get_default()
screen.force_update()
windows = screen.get_windows()

これでウィンドウリスト (WnckWindowのリスト) が得られる。これに対して、

w = windows[0]
w.get_name() # Window Name
w.get_application().get_name() # Application Name
w.get.get_class_group().get_name() # Class Name

こんな感じで情報を取得し、

w.set_geometry(wnck.WINDOW_GRAVITY_CURRENT, wnck.WINDOW_CHANGE_X | wnck.WINDOW_CHANGE_Y, 100,100,0,0)
w.set_title("新しいタイトル")
gdk_w = gtk.gdk.window_foreign_new(w.get_xid())
gdk_w.set_decorations(0) # デコレーションの削除
# 反映させる
gtk.gdk.window_process_all_updates()
gtk.gdk.flush()

こんな感じにウィンドウが操作できる。

uWSGIと併用時のエラー

ちなみに、python-wnckを使用するWebアプリをuwsgi上で動かしたらこんな感じのエラーが出てしばらくこまった。

172.29.4.50 - - [12/Mar/2014:22:59:39] "GET /info HTTP/1.1" 200 4 "" "Mozilla/5.0 (X11; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"
[pid: 15271|app: 0|req: 6/6] *.*.*.* () {32 vars in 508 bytes} [Wed Mar 12 22:59:39 2014] GET /set_center/info => generated 4 bytes in 6 msecs (HTTP/1.1 200) 4 headers in 138 bytes (1 switches on core 0)
Wed Mar 12 22:59:41 2014 - !!! uWSGI process 15270 got Segmentation Fault !!!
Wed Mar 12 22:59:41 2014 - *** backtrace of 15270 ***
Wed Mar 12 22:59:41 2014 - uwsgi(uwsgi_backtrace+0x25) [0x431ea5]
Wed Mar 12 22:59:41 2014 - uwsgi(uwsgi_segfault+0x21) [0x431f81]
Wed Mar 12 22:59:41 2014 - /lib/x86_64-linux-gnu/libc.so.6(+0x324f0) [0x7fa477a794f0]
Wed Mar 12 22:59:41 2014 - /usr/lib/libstartup-notification-1.so.0(sn_xcb_display_new+0x109) [0x7fa47201fa89]
Wed Mar 12 22:59:41 2014 - /usr/lib/libstartup-notification-1.so.0(sn_display_new+0x2d) [0x7fa47201fb3d]
Wed Mar 12 22:59:41 2014 - /usr/lib/libwnck-1.so.22(wnck_screen_get+0x117) [0x7fa474660617]
Wed Mar 12 22:59:41 2014 - /usr/lib/python2.7/dist-packages/gtk-2.0/wnck.so(+0xa809) [0x7fa4748ac809]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x56fd) [0x7fa47521d04d]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5b7b) [0x7fa47521d4cb]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x848) [0x7fa47521e2e8]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0xa6917) [0x7fa475274917]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0x184810) [0x7fa475352810]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_CallObjectWithKeywords+0x47) [0x7fa475304647]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyInstance_New+0x7b) [0x7fa4752ec58b]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x2a57) [0x7fa47521a3a7]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5b7b) [0x7fa47521d4cb]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x848) [0x7fa47521e2e8]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0xa6917) [0x7fa475274917]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x2a57) [0x7fa47521a3a7]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x848) [0x7fa47521e2e8]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0xa6917) [0x7fa475274917]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0x184810) [0x7fa475352810]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0x11c1ac) [0x7fa4752ea1ac]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x2a57) [0x7fa47521a3a7]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x848) [0x7fa47521e2e8]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0xa6806) [0x7fa475274806]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0x184810) [0x7fa475352810]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0xcbdf6) [0x7fa475299df6]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x27dd) [0x7fa47521a12d]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5b7b) [0x7fa47521d4cb]
Wed Mar 12 22:59:41 2014 - *** end of backtrace ***
Wed Mar 12 22:59:41 2014 - DAMN ! worker 2 (pid: 15270) died :( trying respawn ...
Wed Mar 12 22:59:41 2014 - Respawned uWSGI worker 2 (new pid: 15296)

最初はなんかcherrypyかuWSGIのスレッドが有効になっちゃってて変な事がおこっているかと思ったけど、どうやらPython初期化後にforkしてからGTKとかX11のAPI使っているから発生しているよう。(断定的に調べていないので違うかも。)

uWSGIのlazyオプションを指定するとfork後の初期化になるようなので、それで改善した。

Windows ExplorerのWebDAV

Windows (8.1も含む) のエクスプローラーからは、WebDAV経由で50MBオーバーのダウンロードができないらしい。

改修用の「Fix It」というプログラムが有るらしいけど、どうやらWindows 8.1では使用できない模様。(もしかしたら8専用のものが有るのかもしれない)

とりあえず解決方法としては、「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters」のFileSizeLimitInBytesがファイルサイズ制限値になっているらしいのでこれを変更すればOK。

(From Microsoft Communityの該当ページ)

相変わらず不遇なWebDAVである。

 

Gentoo Linux ネットブート (pxelinux)

Gentoo Linuxのネットブート関連のメモ。squashfs+aufsでブートするまで。

いろいろなwebサイト (Gentoo Linux ドキュメント – Gentooを用いたディスクレスノード, Gentoo Wiki Archives – HOWTO_Gentoo_Diskless_Install, etc.) を参考に、GentooのPXEブートにトライしていたが、どうもうまく行かず。

手始めにGentoo LiveのCDからgentoo.igz, gentoo (カーネル), image.squashfs をコピーして、そいつらを使って

APPEND initrd=gentoo-live/gentoo.igz ip=dhcp loop=gentoo-live/image.squashfs looptype=squashfs root=/dev/ram0 real_root=/dev/nfs nfsroot=172.29.4.10:/server/tftp udev nodevfs dodmraid cdroot

的な感じにしてトライ。
が、ブートできない。nfsマウントまで行かなかった。順次追っていく。

まずネットワークにつながっていないようだった。なのでまず現在動いている3.8.4のkernelとinitramfsをコピーして、LiveCDのgentoo, gentoo.igzと置き換えてみた。ネットワークドライバ (e1000e と r8169も一応) もちゃんとinitramfsに入れて。

→しかし起動せず。

仕方ないのでinitramfsのinitスクリプト色々見つつ、パラメータを追っていくとどうやらip=パラメータを指定しているとネットワークの設定 (udhcpc) が走らないようだったので、 APPENDパラメータの ip=dhcp を消した。

→とりあえずDHCPとnfsマウントまでできた。

あとはsquashfs+aufsで起動するようにする。aufsのパッチがデフォルトではカーネルに入って無いのでemerge aufs3する。後はカーネル起動時のパラメータにaufsを追加してOK。最終的にpxelinux.cfg/default の指定は下みたいな感じになった。

KERNEL boot/kernel-genkernel-x86_64-3.8.4-gentoo
INITRD boot/initramfs-genkernel-x86_64-3.8.4-gentoo
APPEND loop=images/gentoo-20130405.squashfs looptype=squashfs root=/dev/ram0 real_root=/dev/nfs nfsroot=xxx.xxx.xxx.xxx:/server/tftp udev nodevfs dodmraid cdroot aufs

ip=dhcpがいらないということに気づくまではしばらくつまづいて時間を食った。

まぁともかく、これで晴れて自在なイメージファイルでGentooをネットブートできるようになりました。めでたしめでたし。

ibus+anthyのかな打ちで「ぼ」が打てない (「ほ゛」になる)

いつぞやか更新したタイミングから「ぼ」が打てなくなった。

かな打ちなので「ほ」キーの後に「゛」(濁点) キーを押して入力するんだけど、どうもそれが別々の文字として出力されてしまう。

まぁ「ぼ」ぐらいいいかと思ったら、「スナガラボ」が打てないことに気がつき結構こまった。仕方ない、直すか。

まずそもそも日本語入力まわりなんていじったことないので、この機能の不具合がanthyのものなのかibusなのか、ibus-anthyなのか、はたまたまったく別のソフトの役割かすらも分からないところからスタートに。

とりあえずAnthyのソースコード落としてそれっぽい所を探したが見当たらず。というかそもそも2009年から更新されていない (この不具合は結構最近からだったと思う) ようなので、ここではないと判断。

次にibus-anthy。一旦落としてみると、engineディレクトリにそれっぽいものが。

/usr/share/ibus-anthy/engine/tables.py

 (484行目付近から)
kana_voiced_consonant_no_rule = {
    u'か' : u'が',
    u'き' : u'ぎ',
    u'く' : u'ぐ',

    ・・・

    u'ふ' : u'ぶ',
    u'へ' : u'べ',
}

kana_semi_voiced_consonant_no_rule = {
    ・・・

おお、あった。「ほ→ぼ」が抜けている。ビンゴ。
ここに「ぼ」のエントリを入れる。

    ・・・
    u'ふ' : u'ぶ',
    u'へ' : u'べ',
    u'ほ' : u'ぼ',  # <- 追加
}
    ・・・

一応、pycとpyoを削除

cd /usr/share/ibus-anthy/engine; rm tables.pyc tables.pyo

これで無事に入力できるようになりました。

なんかgitで最新版落としても「ぼ」が欠落してることもあるし、ibus-anthyの中のひとに報告した方がいいのかなぁ。

HTML5 Audio 対応表

HTML5 でサウンド鳴らすための規格。

ただし、jPlayer (http://www.jplayer.org/) を使えば古いIEやAndroidでもどうになかるもよう。

 

 

Mercurial入門の導入関連

大まかな概念図

Mercurialのリポジトリの概念

Mercurialのリポジトリの概念

Mercurial チートシート 日本語版 (カンペ的なもの)

困ったときは・・・

  • とりあえずcommit→push→pull→updateの流れを一周してみる
  • hg revertする
  • もう一旦あきらめて、新しくフォルダ作っちゃってhg cloneからやりなおす

MercurialのSSLエラー → [hostfingerprints]

スーパーemergeタイムかましてからなんかMercurialの様子がおかしくなった。

https://www.hogehoge.com/repository への反映中
中断: エラー: _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

SSL関連のエラー。今まではでなかった。証明書かえたわけでもなく。

どうやら1.7.4から設定ファイルにhostfingerprintsセクションなるものが出来て、それを設定しなければいけなかったらしい。

~/.hgrcに以下のようにfingerprintを追加したらなおった。

...
[hostfingerprints]
www.hogehoge.com = 11:22:33:44:55:66:77:88:99:10:aa:bb:cc:dd:ee:ff:1a:2b:3c:4d

ちなみに、cloneとかpush時に–insecureオプション追加してもとりあえずいけるっぽい。

Gentoo-Prefix上でMercurialのSSL関連エラー

Gentoo-Prefix@MacでMercurial使おうとしたら謎のエラー。

user@hogehoge ~/projects $ hg clone https://***.com/***
abort: Python SSL support not found

Python用のSSLが入っていないようだ。

とりあえずpythonをemerge -avしてみる。

taka@mobuild ~/projects $ emerge -av python

 * IMPORTANT: 3 news items need reading for repository 'gentoo_prefix'.
 * Use eselect news to read news items.

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R    ] dev-lang/python-3.3.0:3.3::gentoo [3.3.0:3.3::gentoo_prefix] USE="ipv6 ncurses readline sqlite* ssl threads xml -build -doc -examples -gdbm -tk -wininst" 0 kB

Total: 1 package (1 reinstall), Size of downloads: 0 kB

おやおや、SSLフラグは入っている。おかしいなぁ。

と思ったらPython 3をemergeしていた。スロット分けされている2.7の方をemerge -avしてみると・・・

taka@mobuild ~/projects $ emerge -av "<=dev-lang/python-3.0"

 * IMPORTANT: 3 news items need reading for repository 'gentoo_prefix'.
 * Use eselect news to read news items.

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R    ] dev-lang/python-2.7.3-r2:2.7::gentoo [2.7.3-r2:2.7::gentoo_prefix] USE="aqua ipv6* ncurses readline* sqlite* ssl* threads (wide-unicode) xml (-berkdb) -build -doc -examples -gdbm -tk -wininst" 0 kB

Total: 1 package (1 reinstall), Size of downloads: 0 kB

ビンゴ。sslフラグが入ってませんでした。

Gentoo Prefixはデフォルトではsslフラグ入って無いんですね。Python 3のほうは入ってるのに。まぁなんか事情があるんでしょう。

とりあえず無事にhg cloneできるようになりましたとさ。

 

FirefoxとiPadブラウザ

FirefoxでJavaScript+HTML+CSSのプログラムゴリゴリしていたんだけど、予想以上にiPadで動かない。iPad3。動かないというか重いっぽい。

原因を探している。。。

 

SSL公開鍵と秘密鍵ペアの確認方法

SSLの秘密鍵・公開鍵ペア確認の方法

$ openssl x509 -in public.crt -noout -modulus
$ openssl rsa -in private.key -noout -modulus

が一致すればOK。