月別アーカイブ: 2010年4月

.NET 4.0 on IronPython

.NET Framework 4.0 の日本語版が出たようだ。

窓の杜 – 【NEWS】マイクロソフト、“.NET Framework”の最新版「.NET Framework 4」を公開

そういえば Windows 7 を立ち上げるのは一ヶ月ぶりくらいのような…
もう Windows に対しては .NET がどうなった?以外に興味が無いのかも…
せっかく買ったんだから使いたいんだけど Linux のほうが圧倒的に便利だし…

とにかく早速インストール。
二十分くらいで終わった、以外に早かった。

早速 4.0 を動かして…
ってアプリが無い。

そういえば IronPython 2.6.1 の .NET 4.0 版ってのがあった。
.NET 2.0 版を削除して入れ替えて使ってみよう。
普通にダウンロードすると 4.0 版が落ちてくるんだね。

IronPython.net /

4.0 版のデフォルトインストール位置は以下になる。

C:\Program Files (x86)\IronPython 2.6 for .NET 4.0

2.0 版から入れ替える人は環境変数の変更なんかを忘れずに。

それから、これは IronPython が悪いわけではないけど。
私は IronPython 関連の関連付けをこうしていた。

ぱぇぽぃ2 ? Blog Archive ? IronPython への関連付け

んでこんなのを作ってスタートアップ登録して利用していた。

ぱぇぽぃ2 ? Blog Archive ? NotifyIcon to use from IronPython

ファイルの右クリでプロパティから新しい ipyw64.exe に関連付け変更ができない!
2.0 時の情報がレジストリに残っていて存在しない exe 扱いになっちまったようだ。

HKEY_CLASSES_ROOT\pyw_auto_file
HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\Shell\MuiCache

なんかの関連するものを丸ごと削除したけど EXE 情報が空になる。

HKEY_CLASSES_ROOT\Applications\ipyw64.exe\shell\open\command

を書き換えて、まあコレで関連付けはなんとかなったが…

なんだこりゃ、これはレジストリのドコを弄くれば修正できるのだ?
とにかく何でもかんでもキャッシュするのは迷惑なだけだ、特にアイコンキャッシュが。
Linux のほうがイイや、こういう細かいところで Windows を使う気が失せる。

ってコレは Windows への不満だし、気を取り直して実行。

さて ipy64.exe の初期化速度は、全然変わっておらずスゲェ遅い。
予想していたけど DLR はもう少しなんとかならないものか。
初期化さえ終われば実行速度も不満が無いし 2.0 版と同様に使えるのだけど。

上記の自作トレイアイコンもそのまんま動いた。

ぱぇぽぃ2 ? Blog Archive ? WPF Simple TextEditor example

も問題なく動く、3.5 までのコードはほとんど弄くらないまま 4.0 で動きそう。
新機能は知らないので後で調べる。

Mandriva 2010.1 Spring Beta

気がついたらもう四月後半、半年毎に Linux の新版がワンサカ出る季節である。
Mandriva One 2010.0 GNOME で何一つ不満が無いので見送りも考えているけど一応調べる。
クリアールックスにミストアイコン、更に VL ゴシックにして Fedora 臭い見た目だけど。

DistroWatch.com: Put the fun back into computing. Use Linux, BSD.

あらら、次の mandriva は 6/3 とチト遠いのですね。
ならばベータを VirtualBox で試してみよう、今回も One の GNOME 版を。

ftp://ftp.kddlabs.co.jp/Linux/distributions/Mandrake/devel/iso/2010.1/beta1/

から mandriva-linux-one-2010-spring-beta1-GNOME-africa-asia-cdrom-i586.iso をば。
md5sum –check コマンドも成功、仮想 HDD を作ってライブ CD を iso から起動。

あれ、one africa-asia を選んだのに Japanese が選択肢に無いぞ?
とりあえずデフォルトの英語を選んで進めてみる。
タイムゾーンは Asia 内に Tokyo が、キーボード選択には japanesee106 があったけど。

やっぱり Japanese は無い、入れ忘れなのかそれとも完全に見限られたのか…
ベータなせいか壁紙やテーマが 2010.0 と同じで変な気分。
Live CD 状態では追加もできないし、とりあえず細かいところを見てみよう。

やはり今回も Guest Additional は最初から適用済み状態で Live CD を起動できる。
Flash も入っているのでそのまま YouTube 観覧可能である。
このプロプライエタリ・ソフトウエアにも柔軟な姿勢は他の Linux もやってほしい。
だって結局デスクトップ用途ではみんな入れるんだもの。

日本語入力できないけど SCIM の設定があった、iBus にはしないのかな?
Font には UmePlus がしっかりあった、VL ゴシックは無いです。
Ubuntu はデフォルト状態では Gimp を外すとか見かけたけどコイツはしっかりある。
gnome-screenshot のアイコンがカッチョよくなっているけど得に変わっていないっぽい。

というか標準搭載アプリは 2010.0 と同じ。
というより KDE メインのディストリビューションだし、正式版では解らないけど。

Python が 2.6.5 に、mono が 2.6.3 に、まぁ mono は今となってはどうでもいい。
Python 依存度が低い部類のディストリなんだから 3.0 系でも…企業ユーザーが困るか。

Epiphany 2.30.0 の WebKit が普通に使える、仮想環境での試用だから何ともいえないが。
私の現環境の 2.28.1 では起動するだけで OS が不安定になる、ATI と相性が悪いのだろうか。

Nautilus のデフォルトディレクトリには Fedora 等と同じくアイコンが付くように。
GNOME の仕様なのかな?何にせよ解りやすくなったのは嬉しい。
デザインも Ubuntu の「何故こんなにダサいの…」なアイコンとは違い大人しめでイイ。
それでもウザいなら user-dirs.dirs で全部無効にすればいいだけだ。

他、Nautilus は F3 キーでもう一つペインが出せるようになった、タブより使いやすい。
しかし一覧とアイコン表示切り替えがツールバーに移動してしまった。
ツールバー非表示で使いたいのに、他に場所バーが直接入力できなくなっていたり。
新機能は嬉しいけどバー追加の結果としてこれらが犠牲になった感じ。

チビッと使ってみて気がついたのはこんなところ。
とにかくデフォルト状態は 2010.0 とあまり代わり映えしない、個々が地味に更新されただけ。

ものは試しとインストールしてそのままアップデートしてみたら日本語 local が。

africa-asia を選ぶ意味無いジャン!
と思ったけど /etc/sysconfig/i18n 編集して再起動しても適用できん…
つか、ということは最初からあったのに適用されないってことなのかな?
次版は Ubuntu を選ぶほうが正解なんだろうけど、あの超ダサいアイコンがなぁ…

続く、かも。

gtk.Widget.allocation.height

4/18 に gtk.Widget.allocation.height が表示後でないと取得できないと書いた。
で、フルスクリーンコントローラを一旦表示するまで 50px という仮に値を入れてごまかした。

いや、よく考えたらフルスクリーンコントローラ自体のサイズを得る必要は無かった。
フルスクリーンにする前に既に toolbox, statusbar は表示されているのだから。

ということでやってみたら縦サイズが 1 に、あれ?
そうか、parent 変更すると property が消えて非表示扱いになるんだった。

ということはオブジェクト作成側で調べてパラメータで渡す…
のコードを一度書いてみたけれど何故か気に入らない、なるべくパーツ側で処理したい。
もっと上手い方法は…と考えてみたらこうすりゃいいじゃんと思いついた。

class CFullCtrl(gtk.Window):
    """
        Full Screen Controrer
    """
    def __init__(self, parent, box, parent2, bar):
        """
            GtkWindow at GTK_WINDOW_POPUP
        """
        gtk.Window.__init__(self, gtk.WINDOW_POPUP)
        # memory pointer
        self.p1 = parent
        self.p2 = parent2
        self.box = box
        self.bar = bar
        # Get Desktop Window Geometry
        root = gtk.gdk.get_default_root_window()
        x, y, w, h, d = root.get_geometry()
        # move and resize
        self.set_size_request(w, -1)
        self.y_pos = h - box.allocation.height - bar.allocation.height
        self.move(0, self.y_pos)
        # Change parent
        vbox = gtk.VBox()
        self.box.reparent(vbox)
        self.bar.reparent(vbox)
        vbox.show_all()
        self.add(vbox)
        self.connect("destroy", self.on_destroy)

    def on_destroy(self, widget, event=None):
        """
            Return Parent
        """
        self.box.reparent(self.p1)
        self.p1.set_child_packing(self.box, False, True, 0, gtk.PACK_END)
        self.bar.reparent(self.p2)
        self.p2.set_child_packing(self.bar, False, False, 0, gtk.PACK_START)
        return True

そうだよ、parent 変更する前に値を調べておけばいいじゃないの。
後はフルスクリーン切り替え時に作成や削除をやればつじつまが合うじゃないか。

def change_fullscreen(self):
    if self.fullscreen:
        self.fullscreen = False
        self.w.window.unfullscreen()
        self.w.unfullscreen()
        self.fullobj.destroy()
        self.fullobj = None
        self.w.resize(self.fullsize[0], self.fullsize[1])
    else:
        self.fullscreen = True
        cx, cy = self.w.get_size()
        self.fullsize[0] = cx
        self.fullsize[1] = cy
        self.fullobj = CFullCtrl(
                self.hbox_ctrl,
                self.toolbox,
                self.vbox_main,
                self.statusbar
            )
        self.w.fullscreen()
        self.w.window.fullscreen()

こんな感じの関数を作ればいいしパラメータも増やさずにすんだ。
しかしよく考えたらパーツ作成のパラメータは本体ポインタのみでいいような気がしてきた。
アトリビュートやメンバ関数はそのポインタから得ることができるのだから。

class CStatusBar(gtk.VBox):
    def __init__(self, owner, arg):
        self._win = owner.w
        self._owner = owner
        gtk.VBox.__init__(self)

みたいな感じで、後は self._owner 経由で本体 class のメンバを参照できる。
というか本体のコードをなるべく少なくしたいのですよ、後々のメンテナンスを考えると。
ラムダ式とかは数学系の人は好んで使うようだけどメンテが多いアプリでは怖くて使えませんわ。
ちなみに Windows 用の Y901 最終版は本体コードだけで九千行、この手では短いほうだ。

他、再生停止でマウスカーソルを表示させるのを忘れていた。
ということで Y901x-0.2.5 公開、作った本人以外に使っている人がいるかどうか知らない。

gtk.gdk.Display.get_pointer

Y901x-0.2.3 は大失敗だった。

motion-notify-event で処理しているから VideoArea 領域を外れたら認識しない。
つまり 16:9 の動画を 16:10 ディスプレイで表示した場合とかでは下に黒帯が出る。
その黒帯部分では領域外なので motion を認識なんてするはずがない。
つまりフルスクリーンでのコントローラは出ないわけだ。

んー Cinema では WM_MOUSEMOVE で計算してやっていたんだけどなぁ。
GTK+ ではレイアウタなので超ややこしいし、WindowsAPI の GetCapture みたく…
ってソレどうやるの?面倒なので Timer で処理するようにしよう。

# GetCursolPos
a, x, y, b = gtk.gdk.display_get_default().get_pointer()

で x と y にスクリーン座標で現在のマウスカーソル位置が取得できるようだ。
a は gtk.gdk.Screen、b は Shift や Ctrl の Mask、ここでは使わないのでダミー。
この値を元に処理したらとりあえずディスプレイより横長動画でも処理できた。

せっかくタイマー処理でマウスカーソル位置を取得しているんだからカーソル消去も。
只の Y901 からの伝統で通常時でも画面上は静止状態マウスカーソルを一秒後に消す。
っっって、GTK+ で WindowsAPI の ShowCursor(FALSE); ってどうするの?

gtk.gdk.Cursor

の下のほうに普通に書いていた、つまり自分で作らないといけないんだね。
これが解れば処理方法自体は同じなので Python コードにて書き換えるだけだ。
ということで細かい処理は Y901x のコードを見てもらうとして簡単に。

class Y901window(dbus.service.Object):
    def __init__(self, bus_name):
        # ...
        self.mousepoint = [0, 0]
        self.invisiblecount = 0;
        # Create invisible cursor
        pixmap = gtk.gdk.Pixmap(None, 1, 1, 1)
        color = gtk.gdk.Color()
        self.noncursor = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0)

省略しすぎかな、とにかくタイマーで

    def on_timer(self):
        # ...
        # GetCursolPos
        a, x, y, b = gtk.gdk.display_get_default().get_pointer()
        # FullScreen at Controler
        if self.fullobj:
            if self.fullobj.y_pos < y:
                self.fullobj.show_all()
            else:
                self.fullobj.hide()
        # Cursor Auto Invisible
        if self.mousepoint[0] == x and self.mousepoint[1] == y:
            if self.invisiblecount < 5:
                self.invisiblecount += 1
            else:
                self.video_window.window.set_cursor(self.noncursor)
        else:
            self.invisiblecount = 0;
            self.mousepoint[0] = x
            self.mousepoint[1] = y
            self.video_window.window.set_cursor(None)
        # return True is Repeat
        return self.is_playing

と時間表示とフルスクリーンコントローラとカーソル消去を全部やってみた。
とりあえずこれでつじつまが合っている、かなり Windows 用 Y901(Cinema) を再現できた。
ということで Y901x-0.2.4 公開しました。
やっぱり全然人増えねぇ、Windows 用のようにいかないわな。

gtk.Widget.reparent

いいかげんに Y901x もフルスクリーンでコントローラを出すようにしよう。

方法は色々あるんだが、一番簡単なのは show() hide() だけで済ませる方法。
しかしこれではムービー画面が拡大縮小されてみったくない。
WMP12 や Cinema のように浮き上がらせて表示させる、の方法は解らない…

オーソドックスに下からヒョッコリ出てくる方法にでもとりあえずやっとこう。
これも方法が沢山あるけど別ウインドウを作って被せるのが一番簡単だろう。

とりあえずコントローラ用の gtk.Window を gtk.WINDOW_POPUP 指定で作成。
gtk.Widget の reparent() メソッドで parent の gtk.Box をコッチに変更。
unparent() set_parent() を使うとうまくいかなかった、つか実態が消滅するんだが。

parent を変更すると property が消える、パッキング情報は Box 側が持つんだから当然か。
.NET Framework の WPF なら子オブジェクト側が持っているんだよね、色々あってややこしい。
なので set_child_packing メソッドでパッキング情報を追加するのを忘れずにと。

んでディスプレイサイズを取得して…ってどうやるのだ?

ぱぇぽぃ2 ? Blog Archive ? デスクトッププロパティ

なんだ、自分でやっていたや。
でも Python の勉強を始めたばかりな頃にやったことなんで効率悪すぎる。
wnck を使えば簡単だけど KDE 対応でまた…
ということで、何か他の方法は無いか探したら恐るべきコードを発見。

pygtkだけ でスクリーンショットをとる

何コレ、たったこれだけ(八行)で本当に全画面スクリーンショットアプリが完成!
PyGtk 恐るべし、gnome-screenshot が強力すぎて自分で作ろうとは思わないけど。

つーか画面サイズを調べるのって get_geometry() メソッドを呼ぶだけだったのか。
やはり知識が無いと無駄なコードを書くことを自分で証明した。

とにかくコレでディスプレイサイズがゲットできたので作ってしまえだ。
表示後でないと gtk.Widget.allocation.height が取れないのをどうするか悩む。

ごまかしたらイマイチなコードになっちゃった、けど開発途中なんだからいいや。
後マウスカーソルを消す処理もいれたいけど出したいからこのまんま出してしまえ(ぉい!
具体的なコードは Y901x の common.py の CFullCtrl class を見てくれ。
更新毎に少しずつマトモなコードになる、多分。

ということで Y901x-0.2.3 を公開しました、本サイトからぞうぞ。
listbox 表示状態を記憶せず毎回表示していたのも修正した、今まで何故気がつかない…

だから Linux 用を作ったところで全然金にも人気にもならないなんて解っているよ。
いいじゃないか、作りたいんだから。