Empty the trash from PyGI

我が公開 Linux アプリでまだ PyGI 化していないものがあった。
trash だ、しょーもないアプリだと思って作ったが意外に本人は結構使う。

PyGI 化だけだと二分で終わるし何かないかな。
そうだ、ゴミ箱を空にするオプションを付けちゃえ!
実際にそんな機能を使うかどうかは別の話。

Nautilus のソースを参考にすれば多分手段は解るだろう。
ということでソレっぽい名前で grep しまくる。

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

"""
    Empty the trash.
"""

from gi.repository import Gio

# Get Trash URI
trash_uri = Gio.file_new_for_uri("trash:")
# Get Child
enum = trash_uri.enumerate_children(
        "{0},{1}".format(
            Gio.FILE_ATTRIBUTE_STANDARD_NAME,
            Gio.FILE_ATTRIBUTE_STANDARD_TYPE ),
        Gio.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,
        None )
# Delete
for info in enum:
    f = trash_uri.get_child(info.get_name())
    f.delete(None)

こんな感じでやっていた。
当然元の C 言語はもっと複雑だったけど Python は楽だ。
普通に g_file_delete しているだけなんだな。

Nautilus から Ctrl+L でロケーションバーを表示させる。
んで trash: と打ち込んで Enter するとゴミ箱が開くんだね。
Explorer の sendto みたいなことができたのか、知らなかった。

んでファイルリスト作成と同様に enum を得る。
g_file_get_child でゴミ箱内の GFile を個別で得る。
既に GFile なのでそのまま g_file_delete できる。

パス名に変換して rm コマンドに渡すとか最初は考えていたけど不要だった。
Nautilus のゴミ箱アイコンは監視しているようでしっかり連動する。
何かメッセージを送らないといけないかと思ったけどコレも不要だった。

より手段は解った。
あとはコマンドラインオプションをどう実装するか。

15.4. optparse ? より強力なコマンドラインオプション解析器 ? Python 2.6ja2 documentation

こんな便利なモンが標準モジュールにあったのか!
使わないと損だ、ということで適用。

ただバージョン情報を -V, –version にしようと思ったけど手段が無い。
書くまでもなく Python と同じにしたかっただけですけど。
自前で –version を定義するとコンフリクトしていると怒られる。
素直にあきらめよう。

ということで trash-1.0.0 公開。
全アプリの PyGI 化完了、去年からの目標だったけど長かった。

Y901x 1.0.0

この連休中にどうしても Y901x を正式版にしたい。
Boxes 仮想マシンにした Ubuntu 13.04 で映像が出ない原因を色々と調べてみる。

Xubuntu の Parole で動画再生できない件はアッサリ見つかった。
[xubuntu] gstreamer videosink error

$ parole --xv false

コマンドを打ち込めば以降再生できるようになる。
つまり、関係無かった。

やっぱり OpenGL 関係なんだろうな。
あれ、Ubuntu には glxinfo が入っていないじゃないの。

$ sudo apt-get install mesa-utils

んでレンダラの確認

$ glxinfo | grep renderer

次のように出力された

OpenGL renderer string: Gallium 0.4 on llvmpipe (LLVM 3.2, 128 bits)

Gallium3D – Wikipedia

なので OpenGL レンダラ自体は Boxes 上でも動いているわけだ。
そりゃ 3D デスクトップが動くし、ソフトウエアエミュレートだから激遅なりに。

gst-launch-1.0 での再生は上手くいった。
Raspberry Pi ? View topic – Gstreamer 1.0 for raspbian

でもコッチだと音しか出ない。
gst-launch-1.0 playbin uri=file:///path/to/file

つまり playbin だとダメだということか。
playbin が OpenGL 関係のものを読み込もうとしてコケているっぽい。
そこを作り替えれば、ってソレだと全部作り替えジャン!

いや、これって Boxes つか qemu-kvm 側がコケているのかも。

仮想マシンではなく通常インストールだと動くのかな?
でも我がミニノートは Ubuntu 12.10 が起動できなかったんだよなぁ…

ということで 19,800 円の激安中古ノートを勢いで買ってきた。
Core2Duo P8700, GM45, 2G メモリの今でも充分なノートがこんな値段とは。
無線 LAN が付いていない事に気がつかず後で USB 子機を買いに走ったのは内緒。

Windows XP はいらなかったが、というか XP の使い方を忘れたw
ライブ DVD を入れるためだけに起動したが IE6 で笑った。
Ubuntu 13.04 x86_64 ライブ起動、64bit でも問題なく動いた。

USB 無線 LAN も問題なく認識、接続して XP に上書きインストール。
Fedora もそうだが別途ドライバ不要で全部認識してしまう今の Linux 凄すぎる。
この超まっさらな状態で Y901x をインストールしてみる。

ubuntu_y901x

普通に動いちゃった、やっぱり qemu-kvm 側の不具合だったのか。
parole もネイティブなら問題無かったのかもしれない。
あんなに悩んだのにこんなにアッサリ…
まあ充分使えるノートパソコンを激安で手に入れたし満足。

ということで Y901x 1.0.0 はめでたく公開となりました。
仮想マシン上 OS で動画を見る人なんていないはずだ。

しかしネイティブで使うと当然だが Unity は 3D でもサクサク動く。

ただ GNOME3 では Alt+F1 からはコマンドを全部打たずとも選択状態になった時点で Enter すれば起動できるという動作をするのでイチイチクリックするか全部打ち込む必要があるのが面倒くさいぞ。
Alt+F2 で Tab キー保管ができないのも面倒くさいぞ。
ランチャはどこかをクリックするまで隠れているほうがウザくないぞ。
メニューバー位置を勝手に変えるのはアプリ作り手としてイラッとするぞ。
端末は Fedora みたくカレントディレクトリのみ表示にしてくれよ。
Monospace の半角空白が等幅ではないって何だよ。
デフォルトアイコンは人によるんだろうけど…

サクサク動いても Unity はやっぱり気に入りそうにないな。

Xubuntu 13.04 and GtkApplication

Ubuntu 13.04 は少し軽くなったとはいえ相変わらず 3D しか使えない。
テスト用途にしか使わない仮想とはいえ重すぎる。
しかも操作性最悪、何故カスタマイズしてまで Unity を使う人がいるのか?

なので今回も LXDE…
では芸が無いので Xubuntu にしてみた、実は初めてです。

sudo apt-get install xubuntu-desktop

ってなんだこれ、ちっとも軽くないというより重すぎ!

XFCE は GTK2 ベースだけど 3D 表示しているんだな。
[ウインドウマネージャ(詳細)]で合成処理の有無を切り替えできるようだ。
ということは有効状態なら下記で背景が透けるはず。
Transparent GtkWindow | PaePoi

xubuntu_visual

off にすると Lubuntu ほどではない気がするけど充分軽くなった。
コレなら継続利用できそうだ、ということで気になる部分をチェック。

デフォルトプレイヤーの parole で動画が再生できないぞ!
しかしコイツもやはり GStreamer なのか。

xubuntu_video

gnome-session-properties に何も無い。
あれ?と思い 12.04 LTS のを見ても何もない、独自処理だったのか。
キーリングとかはどうしているんだろう、便利なのに。

ub_session

つまりディレクトリ名監視なんかしていない。
普通に不要なデフォルトディレクトリを削除したり F2 キーで変名できる。
何故かデスクトップだけは変名できなかったけど。

GTK+ のバージョンは 3.6.4 って今の Fedora と同じかい。
でも pygobject が変わっているのだからもしかして。

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

from gi.repository import Gtk, Gio
import sys

class Win(Gtk.Window):
    """
        Test "HANDLES_OPEN"
    """
    def __init__(self):
        Gtk.Window.__init__(self)
        swin = Gtk.ScrolledWindow()
        self.view = Gtk.TextView()
        swin.add(self.view)
        self.add(swin)
        self.resize(320, 240)
        self.show_all()

    def add_uri(self, uris):
        buf = self.view.get_buffer()
        buf.set_text(uris)

class AppClass(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(
                self,
                application_id="org.gnome.test_id",
                flags=Gio.ApplicationFlags.HANDLES_OPEN )
        self.connect("startup", self.on_startup)
        self.connect("activate", self.on_activate)
        self.connect("open", self.on_open)

    def on_startup(self, data=None):
        self.window = Win()
        self.add_window(self.window)

    def on_activate(self, data=None):
        self.window.present()

    def on_open(self, application, files, n_file, hint, data=None):
        """
            Ubuntu 13.04 @ SUCSESS!
            Fedora 18    @ FAILED...
        """
        s = ""
        for f in files:
            s += "{0}\n".format(f.get_uri())
        if s == "":
            s = "FAILED..."
        self.window.add_uri(s)
        self.window.present()

if __name__ == "__main__":
    app = AppClass()
    app.run(sys.argv)

gtkapplication

ついに HANDLES_OPEN に対応してくれたようだ。
コレで多重起動防止アプリを Python で作るのが簡単になったね。
Fedora 19 が待ち遠しいぜ!

clipoli も動く、よしコイツはこのままでいいな。
memopoli も動く、いや初期状態に問題があることは解っているんだが。
とりあえず我がアプリは Y901x 以外は大丈夫であるようだ。

肝心の使い勝手は Lubuntu とたいして変わらない。
しかし標準テキストエディタはショボすぎだろ、GtkSourceView なのに。

Xubuntu は合成オフ可能なことに気がつくまではキレそうだったけど悪くない。
別に GTK2 ベースのデスクトップでも GTK3 開発は可能なわけだし。
ただ 3.6 なので Fedora 18 から乗り換える理由は何も無いけど。

FTP やスマホ接続で Nautilus が絶対にファイルマネージャである必要があるのでホスト OS は今後も GNOME にしますが。

There is no pygst in Ubuntu 13.04

Ubuntu 13.04 が出たので早速 Y901x の Gst 1.0 版をテスト。
の前にインストールしなきゃ、メインで使う気は無いので Boxes の仮想に。

日本語リミックスはまだ無いし今回も時代遅れの x86 のみかよ…
Amazon といい糞メニューバーといい、何故メインで使っている人がいるのか不思議だ。
x86 なんてイラネ、本家から x86_64 版の ISO を落とす。

インストール時に「サードパーティうんたら」のチェックを忘れずに。
GStreamer 関連は 1.0 と 0.10 が見えた、両方インストールされたみたい。

Boxes 仮想マシンにしたが 12.10 時と何も変わっていなかった。
設定 XML の tablet 項目を消して libvirtd プロセスを再起動しないとマウスホイールを認識しない。
仮想 3D でもチョッピリ軽くなった、本当にチョッピリだけど。

Amazon に関しては何も言うまい、一応私は dconf-editor で消した。
他相変わらず使い勝手が最悪だがテスト用仮想マシンだからどうでもいい。

あぁ GNOME アプリが本当に全部 3.6 になっている。
アプリケーションメニューにもしっかり対応したようだ。

nautilus3.6

3.6 ということは今ホストで使っている Fedora 18 と同じなわけで。
やっぱり新たに書くことが無いや。
Ubuntu しか知らない人は多分 Nautilus の変化にに面食らうと思うけど。

さて GStreamer について調べなきゃ。

girepo

やはり Fedora 18 同様に 1.0 と 0.10 が共存か。
「サードパーティうんたら」のチェックで m4v や flv も再生できた。
Totem や Nautilus は 3.6 なので GStreamer 1.0 を使っているはず。
しかし…

python_gst

pygst が無くなった!
もしかして Python3 側に、あるわけないか。
別途で入れられるとは思うけどこれではデフォルトでは Y901x 0.3.9 は動かない。

更に gst 1.0 対応作りかけ版を試すと再生できない…
URI からパス名への変換に GLib.filename_from_uri を使っているけど

filename_from_uri

おいおい、pygobject まで何か地味に変わっていやがる。
そこを別の方法で何とかしてみると…

opengl_error

OpenGL のエラーで音は出るけど映像は真っ暗という結果に。
仮想だからかとも思うけど Totem では普通に再生できるしワカラン。

もう嫌がらせとしか思えない、ヤル気なくしてきた。
まだ出たばかりだし単なる初期不具合だといいな、今はお手上げ。
という状態だけどバックアップ、Fedora 18 では動くんだけど。
y901x-0.99.3.tar.gz

File List in Numeric Order

よく見たら TreeView にファイルリスト配置までに物凄く無駄が多かった。
os.listdir でファイルリストを作成し更に隠しファイルを取っ払って新たに作成。
ディレクトリ名までリストに含めたソートを行い配置直前にディレクトリを弾く。

なんだこの非効率さは、実用上では問題ない速度とはいえ流石に書き換えたいわ。
当時は os.listdir 以外でファイルリストを作る手段を知らなかったわけで。

今なら Gio を利用して自力でファイルリストを作れる。
ディレクトリと隠しファイルを除き、数値優先ソートまで終わったリストを戻す関数を作ればいいかな。

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

from gi.repository import GLib, Gio

def get_file_numsort_list(dirname):
    """
        param dirname: Directory Full Path Name
        return: List in Numeric Order
    """
    files = []
    d = Gio.file_new_for_path(dirname)
    enum = d.enumerate_children(
            Gio.FILE_ATTRIBUTE_STANDARD_TYPE,
            Gio.FileQueryInfoFlags.NONE,
            None )
    for info in enum:
        if info.get_file_type() == Gio.FileType.REGULAR:
            s = info.get_name()
            if not s.startswith("."):
                if not s.endswith("~"):
                    files.append(s)
    files.sort(lambda x, y : cmp(GLib.utf8_collate_key_for_filename(x, -1), GLib.utf8_collate_key_for_filename(y, -1)))
    return files

イマイチな気もするけど予定していた動作にはなった。
G_FILE_TYPE_REGULAR 判定ならディレクトリではないと解る。
隠しファイルは自力判定、not を使うと or の動作がおかしかったので階層に。

体感速度は、全然変わらないなやっぱり。

それと。
Gstreamer の Volume 調節は何故か valadoc で見つけた。

Gst.Audio.stream_volume_convert_volume ? gstreamer-audio-1.0

Namespace: Gst.Audio ということだが Gst のアトリビュートには無い。
Python では GstAudio を gir から import すれば使えるようだ。

from gi.repository import Gtk, Gst, GstAudio

class Prayer(Gtk.Window):
    ###
    # etc...
    ###
    def set_volume(self, value):
        if self.player.get_volume(GstAudio.StreamVolumeFormat.CUBIC) != value:
            self.player.set_volume(GstAudio.StreamVolumeFormat.CUBIC, value)

    def on_volume_value_changed(self, widget, event=None):
        self.set_volume(widget.get_value() / 100.0)

get_volume, set_volume は引数に GstStreamVolumeFormat が必要。
PyGtk, gst-0.10 では LINEAR からの変換が必要だったけど直でイケる。

Vala も少し勉強していて良かった!
というか、こんなにドキュメントが充実しているなら Vala で作ったほうがいいのかな。

初回再生時に上下が少し潰れる現象で現在詰まっている。
一度リサイズすれば直るのだが、0.3.9 と同じ処理をしているのに。
GtkAspectFrame ではなく自力でアスペクト比と配置調節をしたほうがいいのかな?

他細々、ということでココまでのバックアップ。
現状では Fedora 18 で Gst デコーダーを揃えた環境しか動かせないけど。
y901x-0.99.1.tar.gz

追記 @ 2013.04.24
多分コレで日本語環境なら当面は問題無いと思う、けど次 Ubuntu 公開まで様子見しますんで。
もっと弄くりたいこともあるにはあるけどメジャー更新は安定させるのが最優先なので。
GTK3, GStreamer 1.0 環境以外は弾くようにしました。
y901x-0.99.2.tar.gz
追記終わり

ついでに。

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

from gi.repository import GLib

s = "/home/oyaji/エロ画像/乳.png"

# ディレクトリ名
print GLib.path_get_dirname(s)
# ファイル名のみ
print GLib.path_get_basename(s)
# 絶対パスチェック
print GLib.path_is_absolute(s)
# URI に変換
u = GLib.filename_to_uri(s, None)
print u
# パス名に戻す
print GLib.filename_from_uri(u, None)
# フルパス作成(区切り文字の有無を自動調節)
print GLib.build_filenamev(["/home/oyaji/", "/エロ画像", "尻.png"])

なんだ GLib で日本語ファイル名もイケるんだ、os.path は使わなくていいじゃないの。
特に os.path.join と同じように使える g_build_filenamev は素晴らしい。
日本人の Python 屋って標準モジュールで止まっている人が多すぎだから少し違ったことをすると通っぽく見えて素敵かもよ。