Ubuntu and Vista comparison 1

Ubuntu を壊しちゃった…

何を思ったか Youtube での CPU 付加が高いのをなんとかしようと考えた。
んで ATI ドライバーを入れたらログイン画面に到達できなくなってもーたわ。
他は何も問題無いのにアホなことやったら駄目だね。

こりゃ再インストールかな、データは 9.04 のライブ CD から取り出しできるはず。
ということで日曜まで Vista HDD に取り替え。

しかしせっかく HDD を取っ替え引っ替えしながら使っているのだから…
Ubuntu 9.04 と Windows Vista を私的に比較、なんて記事を超私的に書いてみよう。
なんたって HDD 以外は同じ構成だ、両方を使い込んだ人間として誰かの参考になるだろう。
Windows 7 も基本的には Vista と同じだしね。

ちなみに CPU は AMD Athlon 64 X2 4200+(2.2GHz)
VGA は AMD 690G 内蔵 ATI RADEON XPRESS 1250 の環境にての話である。

○ 起動時間

Vista はシャットダウンからの起動が死ぬほど遅いのはご存じのとおり。
その欠点を補ってあまりある「スリープ」は素晴らしいの一言ではありますが…
Ubuntu と併用な私のような使い方ではシャットダウンすることのほうが多いわけで…
上記環境でも 20 秒で起動できる Ubuntu 9.04 はやはりありがたいとしか言えない。

しかしアプリケーションの起動時間にまったくストレスが無い Vista も捨てがたい。
SuperFetch のおかげだが Gedit 一つ起動するにも待たされる Ubuntu とは比較にならない。

○ Compiz と Aero について。

見た目はどっちも良い、Windows XP 以前を使っている奴は「仕事用カヨ!」と。
一時期流行した「スキン」みたいなウインドウは過去の遺物にしか思えない。
決してタイトルバーをシマシマとかにしてはいけません(ぉい!

どちらが優れているかなら間違いなく Aero だろう。
3D がどうのより Compiz 環境ではダイアログがアクティブにならない場合が多々ある。
ウインドウを移動した直後の描写安定性も Aero が圧倒的。

楽しいのは Compiz だ。
ブヨンブヨン動くことよりデスクトップの隅に吸着等の動作が統一されるのが嬉しい。
こういうのは Windows ではアプリ側の仕事だったけど環境側がやったほうがイイね。

○ アプリケーション

箇々のアプリがどうとかよりインストール場所が決定的に違う。
Linux は実行するファイルが /bin か /usr/bin ディレクトリに集中している。
なので長々とパスを指定する必要が無い、Firefox も端末で firefox と打ち込むだけ。
bash 等の端末を利用する時にとても楽である。

Windows は主にショートカットを利用するが実際は長い長いパスを経由している。
なので Windows Power Shell 等で端末操作をやるにしても非常に面倒。
しかし利点もある、沢山の実行ファイル管理やバージョン違いの同時利用が簡単である。

スクリプトをよく利用する人は Linux のほうが便利。
小物アプリを細かく使い分けするような人は Windows のほうが便利。
なんて結論になるでしょう。

ぱっと思いついたものだけでも両方に長所短所があるわけで。
どちらかが良いとか比較するより良さを生かした使い方をすればいいかなと思う。
多分続く。

realize signal

Y901x はステータスバーを GtkVBox で自作しているわけなんだが…

今まで GtkWidget 上のマウスカーソルを変更するのに expose-event シグナルを利用していた。
Widget 表示後に変更しないと例外でスローされてしまうからである。
でもそれって realize シグナルでイケたのね…

class CStatusBar(gtk.VBox):
    """
        Instead GtkStatusbar
    """
    def __init__(self, num, window, arg=None):
        #
        # etc...
        #
        ##self._first_show = False
        ##grip.connect("expose-event", self.__on_expose)
        grip.connect("realize", self.__on_realize)
        #
        # etc...
        #

    def __on_realize(self, widget, event=None):
        """
            cursor change
        """
        cur_grip = gtk.gdk.Cursor(gtk.gdk.BOTTOM_RIGHT_CORNER)
        widget.window.set_cursor(cur_grip)

    """def __on_expose(self, widget, event):
        if not self._first_show:
            cur_grip = gtk.gdk.Cursor(gtk.gdk.BOTTOM_RIGHT_CORNER)
            self._im.window.set_cursor(cur_grip)
            self._first_show = True"""

余計な自前フラグも不要だし圧倒的に簡単じゃないですか。
realize はマウスカーソルを変更したい Widget 自体のシグナルを利用しませう。

もう一つ実は気にしていてほったらかしていた部分。
Resize Grip を画像で表示していたこと、結構違和感がある。
せめてデフォルトの Grip Image を表示できないものか。

gtk.Style

色々探して GtkStyle に paint_resize_grip というメソッドを発見。
コレだとよく解らないので Devhelp から gtk_paint_resize_grip を検索。

paint_resize_grip

しかし思うんだが C 言語が解らないで PyGtk アプリを作るなんて不可能だ。
最低 Devhelp が理解できないと誰かが書いたコードのコピペしかやれない。

まあそれはよくて、ということは下記でイケそうだ。

class CStatusBar(gtk.VBox):
    """
        Instead GtkStatusbar
    """
    def __init__(self, num, window, arg=None):
        #
        # etc...
        #
        """self._im = gtk.Image()
        path = os.path.dirname( __file__ ) + "/img/grip.xpm"
        self._im.set_from_file(path)
        grip = gtk.EventBox()
        grip.add(self._im)"""
        grip = gtk.DrawingArea()
        grip.set_size_request(16, 16)
        grip.set_events(gtk.gdk.EXPOSURE_MASK | gtk.gdk.BUTTON_PRESS_MASK)
        grip.connect("expose-event", self.__on_grip_expose)
        #
        # etc...
        #

    def __on_grip_expose(self, widget, event):
        """
            Draw Resize Grip
        """
        widget.style.paint_resize_grip( widget.window,
                                        gtk.STATE_NORMAL,
                                        None,
                                        None,
                                        None,
                                        gtk.gdk.WINDOW_EDGE_SOUTH_EAST,
                                        event.area.width - 16,
                                        event.area.height - 16,
                                        16,
                                        16)

nomal_statusbar

GtkDrawingArea では GtkEventBox とは違い set_events する必要がある。
grip のサイズを 16×16 に限定しているけどコレでいい?

というかこれだけだと Dust とかのテーマでは Grip Image が追従しない。
と思ったけど Firefox も同じじゃん、それならコレでいいやという感じ。
素直に GtkStatusbar を使えば Gtk+ が勝手にやってくれる。
けど Gedit のように境界線が途切れてしまうし、Gtk+ も困ったものだ。

最後に何だかよく解らなかったので *.pyc のキャッシュは毎回同梱していた。
けど無駄にも程があるので今回から省いて配布するようにした。

ということで Y901x 0.1.8 の公開です。
単なるお知らせだけじゃツマランのでコードも貼ってみました。

Y901x 0.1.7

結局スクロール関連はそのまま公開。
別にイイや、問題があったら後で直せばよいのだし。

ついでに Windows Y901 はリストの次や手前をゴミ箱移動できる機能があるのを思い出した。
ので適当に機能追加、GtkTreeView の手前イテレータ取得は前にやったので簡単だった。

ところで Shift + Delete とかをアクセラレータで処理する方法だが

self.accelgroup0.connect_group(gtk.keysyms.Delete, 0, gtk.ACCEL_VISIBLE, self.on_keydown)
self.accelgroup0.connect_group(gtk.keysyms.Delete, gtk.gdk.SHIFT_MASK, gtk.ACCEL_VISIBLE, self.on_keydown)
self.accelgroup0.connect_group(gtk.keysyms.Delete, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE, self.on_keydown)

という感じで GtkAccelGroup を作って

def on_keydown(self, accelGroup, window, keyval, modifier):
    # メニューに無いキーボード操作まとめて
    if keyval == gtk.keysyms.Delete:
        if modifier == gtk.gdk.SHIFT_MASK:
            self.delete_prev()
        elif modifier == gtk.gdk.CONTROL_MASK:
            self.delete_next()
        else:
            self.delete()

とすれば modifier で振り分けできるようです。
GtkAccelGroup でイチイチ modifier も指定しなきゃいけないのね。
これくらいは勝手にやってもらいたいと思うけど意図があるんだろうな。

GtkTreeView Scroll

何を今頃だが昨日旧 Blog の「ぱぇぽぃ」を削除した。
月単位で逆アクセスがまだ百を越えていたので意図的な放置だったんですが…
流石に三年前の「あの頃の私」が書いた記事は情報が古すぎると思ったもので。

なんたってバリバリな「 Windows 以外の OS なんて知らないよ!」なデルヒャァ屋だったし。
今になって考えればキャーリックスが大失敗に終わったのは当然過ぎて笑える結果。
mono で WindowsForm よりはマシだったがせめて GTK+ にすればよかったのに。

他にサイトの一部を整理したり、伴って外部リンクしていたコードの Blog 起こしとか。
さぼっていたわけじゃないんですけど Blog で書くようなネタが作れなかった。

ということで久々にコードを。

Y901x のリストが再生開始時に選択行が見えない場合がある。
ということでリストアップしたら表示配位内にスクロールさせようと考えた。

何故この時期に Y901x をやっているんだと言わないでくれい。
自分が作ったアプリの中ではやはり一番コイツを使うんだよということで。

Windows 版 Y901 ではやっていたんですけどね、Cinema は忘れた。
一つ上と一つ下を残すようにしないと次をクリックしにくいんで結構考える。
正直メンドイ、WPF ListView の ScrollIntoView メソッドみたいなのは無いかな?

Gtk::ScrolledWindow – Ruby-GNOME2 Project Website

Ruby だが value は upper – page_size 以下にしなければいけないとか見つかるんだが
そうすると何故かうまくいかないので無視こいて

def selection_scroll(self):
    """
        def __on_selection_changed(self, selection):
        を利用だと上手くいかない
    """
    # Get GtkAdjustment
    adjustment = self.view.get_vadjustment()
    # calc
    n = self.__get_select_num()
    if n == -1:
        return
    page_size = adjustment.get_property("page_size")
    column_height = self.column1.cell_get_size(gtk.gdk.Rectangle())[4]
    # 計算値
    sc = column_height * n
    # 現在の表示範囲に入っているか検証
    v = adjustment.get_value()
    h = page_size + v - (column_height * 2)
    if sc == 0.0:
        adjustment.set_value(sc)
    elif sc < v:
        adjustment.set_value(sc - column_height)
    elif sc >= h:
        adjustment.set_value(sc - page_size + (column_height * 2))

def __get_select_num(self):
    model, it = self.selection.get_selected()
    if it:
        path = model.get_path(it)
        return path[0]
    return -1

def __on_size_request(self, widget, event=None):
    self.selection_scroll()

てな感じでリストアップしたらこのメソッドを呼んでやる。
というところまでできた、まだ検証が甘いので今日はここまで。

Cryptic Specifications as Google

shword

マジで Google のボットやデータベース開発者の意図がワカラン。
少なくとも日本人なら誰も検索しないような単語での結果を無謀にも先取り…の結果かな?
cjk 出身の中の人さん、もっとガンバってくださいよ。

あ、minipoli は Windows 7 でイケましたよ。
と、翻訳に苦しみそうな行で意図的に書くのは私のイケナイ部分です。