Python」タグアーカイブ

Linux Opera Starting Check in ps command

せっかく Y901x を Mandriva KDE に対応させたのだから SeeMe もやりたい。
問題は Python の wnck モジュールだ、KDE 版にはデフォルトで入っていない。

seeme102_kde

動画プレイヤーならともかくコイツはモジュールを入れてくれにしたくない。

基本的に私は得に何もインストールさせないで使えるものを作るのがポリシー。
Windows で .NET は IronPython しかやらなくなったのはそのポリシーから。
だって 7 や Vista なら .NET 自体は最初からあるし SDK もコンパイラも必要無い。

ということで wnck を使わずに Opera が起動しているかどうか判別する方法は…

まてよ、Linux は Windows とは違ってコマンドライン OS に GUI が被さっているだけだ。
Window を探して名前を調べなくてもコマンドからチェックできるんじゃないの?
探せば他も見つかるだろうけど単純に ps コマンドの出力から調べられるかも。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

"""
    opera_init_check.py
    Find in "ps ax" command output
"""

import commands

r = commands.getoutput("ps ax")
if "/usr/lib/opera/opera" in r:
    print "starting Opera"
else:
    print "not starting Opera"

こんな手抜きバリバリなコードでアッサリ判別できてしまった。
Linux は多分この位置にしか Opera 本体が入らないだろうからイケそうだ。
Windows 的な考え方がまだ抜けていないみたいだな私は。

この判別方法に書き換えて VirtualBox 上の KDE 版で動かしてみよう。

seeme103_kde

問題なく起動できるようになった、Opera の起動判別もバッチリ。

ということでバグ修正を含めて SeeMe for Linux 1.0.3 公開。
ただダウンロード数が強烈に寂しいんだがコイツ…

Python property Decorator

INotifyPropertyChanged and databinding in IronPython WPF

Wonderful!
私が書いた下記を「理想的じゃネェ」と断言しているだけある。

ぱぇぽぃ2 ? Blog Archive ? WPF ListView DataBinding for IronPython

OnPropertyChanged を先に呼ぶことになるのが気になるけど…
問題なく動くから多分 OnPropertyChanged は Queue に入るのだろう。
組み込み以外で Decorator の実用的な使い方を初めて見た。

PyGtk 製 Y901x にて

@dbus.service.method("org.y901x.Interface1")
def set_uri(self, uri):
	###

と使っているが何故これで D-Bus 経由で別インスタンスから関数が呼べるのか実は知らない…
自身で関数を呼んでいるのではないし、もっと調べると面白い使い方ができそうだ。

とにかく良いものを見つけた、こんな Blog をやっているといいことあるよ。
てかこの Blog へのリンク元を見ると海外からばかり、co.uk とかもあるし。
日本の Python 屋って非実用的コードばかり書いている人が多いですからね。

Y901x 0.2.0 release

Y901x 0.2.0 公開、トップページから。

beta からの変更点、せっかくだから Mandriva KDE 版にも対応。
Dolphin 及び他からのファイルドロップに対応するためにこうした。

def on_drag_data_received(self, widget, context, x, y, selection_data, info, time):
    # D&D FilenNmes split CRLF or LF
    if "\r\n" in selection_data.data:
        drop = selection_data.data.split("\r\n")[0]
    else:
        drop = selection_data.data.split("\n")[0]
    if "//" in drop:
        self.set_uri(drop)
    else:
        self.set_uri("file://" + drop)

Nautilus は CRLF 区切りで file:// の URI で送られてくる。
Dolphin は LF 区切りだ、後は file:// になっているかで振り分ければいいだろう。
これで多分どんな場合でもドロップに対応できる…かもしれない。

それより Mandriva には install というコマンドがあるお!
./ を付けてでは…しかたがないのでインストールスクリプトは名前を変更!

KDE での D-Bus については dbus-python を入れてくれでいっちゃえ!
試しに入れてみたら動いたからそれでいいや。

GtkAspectFrame の件はかなり前に Blog に書いたのに公開版はまだやっていなかった…

てなわけで思ったより差があるので 0.2.0 とマイナーバージョンアップということにする。
しかし気がつくとトップページの更新を 1 か月以上忘れていた、反省。
やっぱり Blog というか CMS のほうが楽なのでコッチばかり更新になってしまう。

get the X Window ID from gtk.Drawingarea

私は Y901x という GStreamer フロントエンドな動画プレイヤーを作った。
もちろん自分で使っているのだが Mandriva 2010.0 に乗り換えたら落ちまくる。
でもタマに問題なく動く場合もがあるからややこしい。

ついでに、ソースディレクトリに pyc キャッシュを作成しなくなっているのだが…
Mandriva 2010.0 だからなのか? Python がヤメたのか?それとも他の場所にあるのか?

0.1.9 を色々弄くって以下の処理を行っている場所
GtkDrawingArea の X Window ID を得ようとすると X server Error になると解った。

imagesink.set_xwindow_id(self.video_window.window.xid)
# これさえも error
print self.video_window.window.xid

gtk.DrawingArea.window は gtk.gdk.Window であり gtk.gdk.Drawable のメソッドを持つ。
なので xid アトリビュートで X Window ID が得られるようになっている。

コレが現行の GTK+ ではできなくなったのかな?
と疑って xwininfo をインストールして使ってみた。

xwininfo

何も問題無く root window の xid が得られている。
それなら root な gtk.Window.window に割り当てたらどうなる?

imagesink.set_xwindow_id(self.w.window.xid)
#imagesink.set_xwindow_id(self.video_window.window.xid)

fullwindow

コントローラやメニューが塗りつぶされたけどコレなら問題無く xid が指定できる。
ということは gtk.DrawingArea の window.xid の取得方法がマズイということだろう。
ならば簡易なコードを書いて試してみる。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import pygtk
pygtk.require('2.0')
import gtk

class Xid():
    def __init__(self):
        w = gtk.Window()
        vbox = gtk.VBox()
        self.da = gtk.DrawingArea()
        button = gtk.Button("Press me")
        button.connect("clicked", self.show_xid)
        vbox.pack_start(button)
        vbox.pack_start(self.da)
        w.add(vbox)
        w.set_title("xid")
        w.connect("delete-event", gtk.main_quit)
        w.show_all()

    def show_xid(self, widget):
        widget.set_label("gtk.DrawingArea xid: %s" % (self.da.window.xid))

if __name__ == '__main__':
    w = Xid()
    gtk.main()

あらら、この方法では問題無く取得できてしまった。
ということはタイミングが問題なのか、何か event が起こった時に取得すればイケそうだ。
ということで検索しまくった、日本語で見つかるはずがないのでやはりメリケンの Google で。

Re: [pygtk] get the XID from gtk.Drawingarea

expose-event を吐いた所で xid を保存してソレをブチ込めばいいということかな?
でも expose-event を待つ必要があるので __init__ で sys.argv を処理できない。
show シグナルにて sys.argv を処理するように書き換えて実験。
コードの解説は長くなりすぎるからバックアップを見てくれで済ます。

y901x-0.1.10beta.tar.gz

kkobato

あぁやっと Ubuntu 9.04 で使っていた頃のように Mandriva で動くようになった。
GTK+ が厳密になったのか Ubuntu がいいかげんだったのかは今は解らない。
ところで Mandriva でも Ubuntu と同じインストールスクリプトが使えるね。

もうしばらく自分で試してから本サイトの奴は更新します。
Ubuntu 9.10 でも試さなきゃなぁ、多分同じだと思うけど…
てか RPM にしたほうがいいのだろうか?需要はシラネ。

FizzBuzz

どうしてプログラマに・・・プログラムが書けないのか?

Python でやってみた。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

for i in range(100):
    j = i + 1
    if j % 3 == 0:
        if j % 5 == 0:
            print "FizzBuzz"
        else:
            print "Fizz"
    elif j % 5 == 0:
        print "Buzz"
    else:
        print j

何のヒネリも無いコードで 6 分も掛かった、私はこの人の会社にはいけないようだ。
というか後で気がついたが

for j in range(1, 101):

と書けばいいことを忘れていた、しょんぼり。

Fizz Buzz – Wikipedia

リンク先を見ると本当に日本人はワンライナーが大好きなんだなーと思う。
海外で FizzBuzz を探すとだいたいどの言語でもこんな感じなんですけどね。

Geek School ? Get Hired With FizzBuzz

実際の話、ワンライナーで書けたところで実践に役立つとは思えない。
剰余(%記号等)を用いないなんて何が目的なのかさえ解らないのだが。
そんなことよりユーザー入力がまったく無いプログラムに凝ってどうするの?と。

まず fizz と buzz という整数を保持する変数を用意してユーザーに数値を入力させる。
fizz の倍数のときは数の代わりに「Fizz」
buzz の倍数のときは「Buzz」
fizz, buzz 両方の倍数の場合には「FizzBuzz」
どちらにも該当しないなら数値そのままの文字列
の値を返す関数を使って 1 から 100 までの数をプリントするプログラムを書け。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

print "\nFizz と Buzz の値を指定してください"
fizz = input("Fizz=")
buzz = input("Buzz=")

def fizzbuzz(n):
    if n % fizz == 0:
        if n % buzz == 0:
            return "FizzBuzz"
        else:
            return "Fizz"
    elif n % buzz == 0:
        return "Buzz"
    return str(n)

for i in range(1, 101):
    print fizzbuzz(i)

みたいな感じのほうが実践的かなと。
初めはつい関数の最後で else を入れちゃうんだよね、いらないのに。