Category Archives: Python

Permalink to single post

Livestreamer

ストリームいじってるプログラムを書いたりしていたんだけど、なんかいろいろあるストリーミングサービス (ustreamとか) のURLなげたらうまい具合に探ってもらって簡単にストリームを抜き出せるライブラリとかあったら便利そうじゃね?

とかおもってたけどまぁフツーにありました。

コマンドラインから利用できて、あとPythonでできてるのでPythonのライブラリとして使用できる。あと使って無いけどWindowsでも動きそうなかんじ。大変素晴らしい。

25個ぐらいのサービスに対応してるようです。さすがにニコニコとかは無い。

Permalink to single post

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後の初期化になるようなので、それで改善した。
Permalink to single post

F-PLUG (消費電力モニタ) をLinuxで使ってみた

大地震からも日が経ち、節電という言葉もだんだん聞かなくなりつつあるなか皆様いかがお過ごしでしょうか。

なんて偉そうな事言いつつ今回のはあまりそれとは関係ないんですが、前々から会社のいろいろな機材 (サーバーとか) で使ってる消費電力のモニタとかやりたいなぁと思っていたりして、ワットモニターUSBとか、スマートコンセントとか電力計の類をいろいろ調べてたんだけど、先週とある電気量販店でF-PLUGなるよさげなものを発見した。

F-PLUG

F-PLUG 近影

  • 一口 15Aまで
  • Bluetooth (RFCOMM)
  • この手のものにしては比較的安め (約5000円)
  • 電力に加えて、温度、湿度、照度まで図れる
  • リアルタイムの電力計測が可能、また一時間ごとの積算値もF-PLUG側で記録される

とまぁこんな感じです。これを使って、いろいろとデータをとってLinuxサーバーでモニタすればなにかいいことが起きるに違いないということでこれを購入。ソフトウェアは公式にはどうやらWindows用しかないようだったけど、とりあえずBluetooth (RFCOMM) ならLinuxでも比較的簡単に何とかなるだろうという目算。

現在値取得までは比較的容易に…

とりあえず/dev/rfcomm0を使えるようにするまでの接続はググって出てきたところ (→Rasperry PiにF-PLUGを2個繋いでみた 等) を参考に。まぁ普通のRFCOMM機器の接続手順です。

あとどうやらOBDNマガジンなるものにはfplug_for_linuxなるソフトウェアが掲載されているようで、とりあえずそれを使えば現在値の取得 (電力値[W]と温度・湿度・照度) まではできた。

しかし機能が足りない

リアルタイムでのいろいろな値をモニタするものやりたかった事だけど、一番やりたかったのは積算の消費電力量 [Wh] を出すこと。上記のものではそこまでの機能は提供されていない。

まぁ一秒ごとに電力値を計測して足していけば積算電力もだせるだろという話もあるけど、なんか無駄な感じするし、そもそも二秒おきぐらいにしか計測できないので誤差がけっこう出る気がして気持ちが悪い。

ということで作る。上記は簡単な小物作りには面倒なC言語で作られていたので、結局全部Pythonで書き直すことにした。

幸いなことに、(というかなぜか?) データの仕様がまるっと公式ページ (F-PLUGメッセージ一覧) に掲載されていた。正直かなり見づらい上に若干不正確  (というか舌足らず?) だったりもするけど、こういうものがあるだけでかなり助かる。なんかもともと業務用のなんかの製品だったりするのかな。

まぁということでひたすらこのコードを打ち込む。

成果物

とりあえず制御用ソフトウェアをせっかく作ったので、現段階までにできたものを公開しときます。

まだUIはありません。作ってません。pyfplugモジュールにある FPlugDevice クラスでF-PLUGの操作ができます。ほとんど全ての機能が使えると思います。

ちなみにDebian 7とGentoo Linux (ともに64bit) で動作確認してます。

ところで精度は・・・?

それは分かりません。かなりざっと不真面目にしか確認してないです。

  • 温度: 壁掛け時計の数値が23℃の時、F-PLUGの計測値は27.0℃
    • マシンに近かったり、F-PLUG自体たぶん発熱してるから高めになった?
  • 湿度: 壁掛け時計の数値が55%の時、F-PLUGの計測値は湿度は42%
    • 温度が高い分湿度が下がってるのかも
  • 照度はほかに計測機器がないから不明
  • 電流:
    • うちの安物クランプメーターで1.4 (A) 前後のとき、F-PLUGでは170 (W) 前後
    • 同様に10.90 (A)のとき 1063 (W)
    • 電圧100 (V)、力率1.0として計算すると、それぞれ21%、2.5%ほどの差になる
    • しかしそもそもこのクランプメーターも怪しい

これじゃ (精度計測としては) 参考にもならないですね。ただまぁこの感じからすると大きく外れた値はないので、とりあえずつくったプログラムはある程度正しく動いてるんでしょう。

他の所の報告ではそもそも個体差がけっこうたったりして、それなりの誤差があるようです。

怪しげなクランプメーター

怪しげなクランプメーターで計測するの図


今後…

  • かんたんなコマンドラインのUIつくる
  • Zabbixとかで使ってみる
Permalink to single post

PIL (Python Imaging Library) のImage.thumbnailがうまく出ず小一時間・・・

PILのthumbnailで小一時間悩んだ。以下のソース
size = ***
img.open(hoge)
img.thumbnail((size, size))
img.save(fuga)
これでなぜかサムネイルがfugaに保存されるはずが、そのまま変換前の画像が保存される。 エラーも何も出ず。 いろいろ探っていたらsizeが文字列型なのが問題だった。エラーぐらい出てほしかった・・・。
Permalink to single post

RubyKaigi2011で発表しましたよ

Rubyで使えるリアルタイムプロファイラって題目で発表しました。とはいえ実態はPythonのほうが(ry

何だかんだで言いたいことは言えたし、Pythonのところで狙いどおりウケてくれたので、よしといった感じでしょうか。

実際に使っている方もいらっしゃってそれはうれしかったです。

公開場所→sunagae.netのllprofページ

取り上げていただいたサイト

とかを自己満のためリストする。(順不同)

デモ動画

これだけみてもなかなか分かりませんが・・・

Permalink to single post

並列実行の視覚化ツール

個人的なプログラム書いてるとき、並列実行の視覚化ツールがあったら便利だなぁと思って作ってしまった。

マルチスレッドとかで並列実行されるプログラムを実行させて、記録されるログからシーケンス図っぽいものを自動的に作ってくれます。

なんかそれなりにまとまったものができたので、たまにはちゃんと公開してみる。

まぁなんか似たようなソフトってあるんだろうなぁ。。

VizEXECのページ

・・・なんかこういう脇道にそれるのばっかりで、メインの作業がなかなか進まないんだよなぁ。

Permalink to single post

島めぐりマップつくってみた

旅行する時には必ずGPSロガー(Holux M-241)をもってって、なんとなく軌跡を記録していたりします。

いままでデータを適当にためてっただけでしたが、そろそろいくらかデータがたまって来たので、適当に可視化ツール作って、いままで巡った島をマップにしてみました。

ツールはPython + PIL(Python Imaging Library)でつくりました。PILは初めて使ったけどこれは便利ですね。

下図ができたマップ。(クリックして拡大)

青い線がGPSによる軌跡です。誤差があったり、一部補完してたりするので、完全に正確ではありません。途切れ途切れになっているところは、GPSの感度が悪かったり、GPSの電源を入れ忘れていたりでデータが取れなかったところ。かつ、まだ補完してないところ。結構多くて残念。

あと伊豆諸島とかは、GPS買う前にいったから軌跡がかけず。とても残念。

東京−大阪間に三本くらい軌跡があるのは、東海道線乗ったときと中央線乗ったときと、あとなんだろう。高速バスかな。福江島の右の奴は長崎本線、新潟の方も北陸本線。小笠原の右に走ってる線はグアムにいくときの飛行機ルート。

あー、日本の輪郭とかも書きたいけどフリーのデータ拾ってこないとなぁ。SVGとかで転がっているところ誰か知りませんかねぇ。いや自分でGPSもって日本一周すればいいのかな。

いやー、それにしてもまだまだ24島しか回ってないのかぁ。まだまだだなぁ・・・。

あ、あと「島図鑑なるものが・・・」で書いた原色 日本島図鑑をやはり買ってしまった。

Permalink to single post

色々制作

niconico.py

ニコニコ動画というかニコニコ実況のPython向けライブラリを書いた。というよりは、ニコニコ実況の解析プログラム的なものかいてて、それの副産物のような感じではあるけど。

とりあえずniconico.py公開リンク

LoafCMS(仮)

なんか写真とか動画とかも含めて適当に管理すれば、それなりのページができるようなCMSがほしいなーと思っていて、それを実現すべくLoafCMS(仮)なるものを書いています。

が、しかしデザインとか何度も考え直していて一向に進まず。困ったものだ。

使えるレベルになったら公開したい。

で、それを使ってsunaga-labを構築したいなぁとか思っていたのですが、なんからちがあかないので、とりあえずwikiだけ構築してしまうことにした。

URL: http://www.sunaga-lab.net/w/

コンテンツがなにもないのも寂しいので、niconico.py関連だけ書いておいた。

http://www.sunaga-lab.net/w/doku.php?id=niconicoと
Permalink to single post

激しくgoogle作成中

超速でgoogleを作成中。なんかあれ作ったりこれ作ったりで最近取り留めがなくなっている感じも否めないが。

それについてとりあえず現状の記録しとく。

» 続きを読む…

Permalink to single post

python2.5

Gentooで適当にemerge worldしてたら

なんかpythonが2.4からpython 2.5にアップデートされたらしくて、pythonつこうてるアプリケーションが一通り動かない。どうやらモジュールが一通りインストールされていないらしい。

「No module named gtk」とかいろいろなモジュールに対してメッセージがでる

調べたらpython-updaterというものが使えるらしい

せっせとemergeしとったのに不要だったか。。。

Permalink to single post

glade+PyGTKがウルトラ便利な件

gladeキャプチャ

GUIのプログラムを作るとき、コントロールを視覚的にはっつけたりできるのは非常な便利なわけですが

あんまりそのようなツールを知らず、やっぱりMS様の.NETには敵わないななんて思ってたわけですが

gladeとPyGTKでプログラムを組んでみたら非常に楽。これはいい。

とうとう念願だった、Linuxでの満足なGUI作成環境が見つかった。かも。

時間あるときにチュートリアルでもこのページに組むかな