月別アーカイブ: 2011年11月

Gio get_description

最近は溜まりまくっている Python 平書きコードの整理をしている。
といっても大半が PyGtk の覚書だったものを PyGI に作り直しであるが。
こんな状態だっったりする。

ソレより GNOME3 で gnomevfs が使えなくなったのをなんとかしないと。
Gio で「ファイルの種類」を得る方法が中々見つからず苦労した。
一旦 Content Type を得て変換するようだと解った。

とりあえず GLocalFile を作成。
query_info の引数に得たい情報文字列をコンマ区切りで突っ込む。
Gio.FILE_ATTRIBUTE_STANDARD_SIZE 等は只の #define された文字列。
GFileInfo
後はメソッドで取り出し、こんな感じかな。

ということで解ったところまで。
ファイルを何かドロップすると詳細が書き出されるウインドウ。

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

import sys
import gi
try:
    gi.require_version("Gtk", "3.0")
except:
    print "This Program is GTK+ 3.0 or later."
    sys.exit()

from gi.repository import Gtk, Gdk, Gio

res = """----------
Name: {0}
Size: {1} byte
Content Type: {2}
Mime Type: {3}
Description: {4}
----------
"""

attr = (
    Gio.FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME,
    Gio.FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
    Gio.FILE_ATTRIBUTE_STANDARD_SIZE )

class Win(Gtk.Window):
    """
        Information at Dropped File
    """
    def __init__(self):
        Gtk.Window.__init__(self)
        # DnD
        dnd_list = Gtk.TargetEntry.new("text/uri-list", 0, 0)
        self.drag_dest_set(
                Gtk.DestDefaults.MOTION |
                Gtk.DestDefaults.HIGHLIGHT |
                Gtk.DestDefaults.DROP,
                [dnd_list],
                Gdk.DragAction.MOVE )
        # GtkLabel
        self.label = Gtk.Label("Please drop your files")
        self.add(self.label)
        # Gtk.Window
        self.drag_dest_add_uri_targets()
        self.connect("drag-data-received", self.on_drag_data_received)
        self.set_title("dnd_type")
        self.show_all()

    def on_drag_data_received(self, widget, drag_context, x, y, data, info, time):
        uris = data.get_uris()
        s = ""
        for uri in uris:
            # Create GLocalFile
            f = Gio.file_new_for_uri(uri)
            # Create GFileInfo
            info = f.query_info(
                    ",".join(attr),
                    Gio.FileQueryInfoFlags.NONE,
                    None )
            # Anyway Get Content Type
            ct = info.get_content_type()
            # splintf
            s += res.format(
                    info.get_display_name(),
                    info.get_size(),
                    ct,
                    Gio.content_type_get_mime_type(ct),
                    Gio.content_type_get_description(ct) )
        self.label.set_text(s)

class App(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(
                self,
                application_id="apps.test.akemi.homura",
                flags=Gio.ApplicationFlags.FLAGS_NONE)
        self.connect("activate", self.on_activate)
        
    def on_activate(self, application, user_data=None):
        w = Win()
        w.set_application(self)
    
if __name__ == "__main__":
    app = App()
    app.run(None)

うんコレで拡張子無しでもキチンと description が得られる。
Mime Type って Content Type と何が違うのかイマイチ解らない。

後は Last Write Time 等なんだがまだ解っていない。
os.stat から得られるのは知っているが Gio でやりたいので。

てゆーか昔のコードはほとんど役に立たなくなってしまったような。
もう少し纏めたら又 Tips ページを作ります。

ll command and GtkSourceView3

Fedora 16 の update 通知があったので適用。
100 個もあるのか、まぁ chrome や flash も含まれていることだし。

PyGI が上書きされちゃったみたいだけど GBoxed 関連は修正されていた。
修正してくれたようで、放置されると疑ってごめんなさい。

ところで Fedora は ~/.bash_profile, ~/.bashrc どちらにもエイリアス指定が無い。
けど ll が通る、’ls -alF’ ではなく ‘ls -l’ のエイリアスのようだが。
Ubuntu から乗り換えて半年以上たつのに今頃違いに気がついた私って…

Ubuntu は ~/.bashrc で指定だけど Fedora はチト違うんだね。
てか Fedora は which コマンドのみで alias も探せるようにしているのか。
alias コマンドで充分だと思うけど。

【88】シェル(bash)を自分用にカスタマイズ【alias の覚書】 – 分室の分室

ついでに見つけたページ、lls は早速真似させていただくことにする。
Content Type でソートできれば拡張子もいらないけどさすがに無理か。

**********

ところで上画像のように Update に GtkSourceView があった。
何って Gedit や Anjuta の GTK+ 製エディタ部品そのものです。
テキストの DnD 編集で Gedit が落ちるのは、直っていなかった…

思いついた、コレを使って Gjot2 の代わりでも試しに作ってみようかなと。
Gedit のハイライト設定をパクれば表示は Gedit と同じになって便利かも。

API ドキュメントは以下にある。
GtkSourceView 3 Reference Manual

PyGI からは GtkSource の import で使える。
とりあえず基本読み書きと行番号表示のみの最小限コード。

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

from gi.repository import Gtk, Gio, Gdk, GtkSource

class TextEditor(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        # GtkUIManager and GtkAccelGroup
        self.uimanager = Gtk.UIManager()
        accelgroup = self.uimanager.get_accel_group()
        self.add_accel_group(accelgroup)
        # GtkActionGroup
        self.actiongroup = Gtk.ActionGroup("editor_menu")
        # GtkActionEntry
        ae = [  ("open", Gtk.STOCK_OPEN, "_Open", "<Control>O", "open", self.on_open),
                ("save", Gtk.STOCK_SAVE, "_Save", "<Control>S", "save", self.on_save),
                ("save_as", Gtk.STOCK_SAVE_AS, "Save as...", "<Shift><Control>S", "save as", self.on_save_as),
                ("quit", Gtk.STOCK_QUIT, "Quit", "<Control>Q", "quit", self.on_quit),
                ("file", None, "_File") ]
        self.actiongroup.add_actions(ae)
        self.uimanager.insert_action_group(self.actiongroup, 0)
        self.uimanager.add_ui_from_string(menu_xml)
        # MenuBar
        menubar = self.uimanager.get_widget('/MenuBar')
        # Toolbar and Style
        toolbar = self.uimanager.get_widget('/ToolBar')
        toolbar.set_style(Gtk.ToolbarStyle.ICONS)
        style = toolbar.get_style_context()
        Gtk.StyleContext.add_class(style, Gtk.STYLE_CLASS_PRIMARY_TOOLBAR)
        # StatusBar
        statusbar = Gtk.Statusbar()
        #
        #
        # Create GtkSourceView
        self.view = GtkSource.View()
        # Show Line Number
        self.view.set_show_line_numbers(True)
        #
        #
        # Add
        sw = Gtk.ScrolledWindow()
        sw.add(self.view)
        vbox = Gtk.VBox()
        vbox.pack_start(menubar, False, True, 0)
        vbox.pack_start(toolbar, False, True, 0)
        vbox.pack_start(sw, True, True, 0)
        vbox.pack_start(statusbar, False, True, 0)
        self.add(vbox)
        # self
        self.open_filename = ""
        self.resize(300, 300)
        self.set_title("Text Editor")
        self.show_all()
        self.set_focus(self.view)

    def on_open(self, widget, data=None):
        dlg = Gtk.FileChooserDialog(
                "Open File",
                self,
                Gtk.FileChooserAction.OPEN,
                (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, 
                Gtk.STOCK_OPEN, Gtk.ResponseType.ACCEPT))
        r = dlg.run()
        if r == Gtk.ResponseType.ACCEPT:
            self.open_filename = dlg.get_filename()
            f = open(self.open_filename, "r")
            t = f.read()
            f.close()
            buf = self.view.get_buffer()
            buf.set_text(t)
        dlg.destroy()

    def on_save(self, widget, data=None):
        if self.open_filename == "":
            self.on_save_as(widget)
        else:
            buf = self.view.get_buffer()
            t = buf.get_text(buf.get_start_iter(), buf.get_end_iter(), False)
            f = open(self.open_filename, "w")
            f.write(t)
            f.close()

    def on_save_as(self, widget, data=None):
        dlg = Gtk.FileChooserDialog(
                "Save File",
                self,
                Gtk.FileChooserAction.SAVE,
                (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, 
                Gtk.STOCK_SAVE, Gtk.ResponseType.ACCEPT))
        r = dlg.run()
        if r == Gtk.ResponseType.ACCEPT:
            buf = self.view.get_buffer()
            t = buf.get_text(buf.get_start_iter(), buf.get_end_iter(), False)
            self.open_filename = dlg.get_filename()
            f = open(self.open_filename, "w")
            f.write(t)
            f.close()
        dlg.destroy()

    def on_quit(self, widget, data=None):
        self.emit("destroy")

menu_xml = """<ui>
    <menubar name="MenuBar">
        <menu action="file">
            <menuitem action="open"/>
            <menuitem action="save"/>
            <menuitem action="save_as"/>
            <separator/>
            <menuitem action="quit"/>
        </menu>
    </menubar>
    <toolbar name="ToolBar">
        <toolitem action="open"/>
        <toolitem action="save"/>
    </toolbar>
</ui>"""

class App(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(
                self,
                application_id="apps.test.editor",
                flags=Gio.ApplicationFlags.FLAGS_NONE)
        self.connect("activate", self.on_activate)
        
    def on_activate(self, data=None):
        w = TextEditor()
        w.set_application(self)
    
if __name__ == "__main__":
    app = App()
    app.run(None)

FileChooserDialog の save で WARNNING が出て困っていたけど…
Gedit でも出るヤン、FileChooserDialog 自体のバグだろう。

読み書きに関しては Gio を使うべきなんだろうけど今はワカンネ!
これで問題なく読み書きできるから充分かと。

ついでに今頃解ったけど destroy を emit すれば閉じることができる。
GtkApplication が管理するので delete-event は使えない。

しかし GtkSourceView のみなら DnD 編集しても落っこちないのね。
Gedit 側のバグだったみたい、とにかく気長に修正待ちするけど。

ということで Gedit と同じ行番号表示ができるエディタでっきあっがりぃ。

コレを上手く使って Gjot2 の代わりっぽいを作りたいな。
平書きな Python コードも既に 1000 個を越えているしもっとまとめたい。
っっってその大半が PyGtk のコード、PyGI に書き直しメンドクセ!
まあその財産があるからこんなコードが数時間で書けるのであるが。

Gedit Snippet Japanese Language GEDIT_SELECTED_TEXT

# Gedit

前回書いたように Fedora 16 で Gedit 3 のコードスニペットを利用できるようにした。
けど $GEDIT_SELECTED_TEXT で日本語が流し込めなくて困っていた。

Gedit 2 は問題なく流し込めていたのに、何とかしようと試行錯誤。
んで、何を今頃 Sunippet の公式解説サイトがあることを知った。

Gedit/Plugins/Snippets – GNOME Live!

$(echo $GEDIT_SELECTED_TEXT)

と書けば日本語でもイケた、こんなにアッサリ…
ということで Gedit Tips ページにこんなのを追加しました。

Gedit のコードスニペット – L’Isola di Niente

こんなページを作る時は本当にスニペットは重宝する。
Linux でコード補完とかほざいている輩がバカにしか思えない。

# gnome-terminal

chown コマンドでオプションを除く最初の引数はユーザー名なのだが。
コレも Tab キーで補完できるのか、知らなかった!
端末って便利だなぁ、どんどん GUI を使わなくなっていくよ。

# Nautilus

Shift+マウスでの複数選択が Explorer 同様に利用できるようになっていた。
今までは無意味にサブディレクトリが開くというワケワカな動きだったものね。
もう Shift+矢印キーに手が慣れちゃっているので気がつかなかった。

# mono

Ubuntu 11.10 には gmcs が入っていないや、もう C# はどうでもいいけど。
gcc は入っているが g++ は無い、なんだこれ…
ちなみに Fedora には絶対に mono は入れない、圧倒的に Python のほうが便利だし。
素の GNOME に含まれているのにわざわざ省いているディストリに入れたらアホだよ。

Fedora 16 Application etc…

GNOME 3.2 自体の変更点は以下で間違いないようだ。
gnome-documents が入っていなかったので入れたけど微妙…

GNOME 3.2 リリースノート

以下は個別アプリケーションで気がついたこと覚書。

# VirtualBox

Fedora 16 リポジトリに含まれる VirtualBox ose を導入。
だが起動できないって何だよ、削除…

Re: VirtualBox does not start in F16 x64 — Fedora Linux Users

最新版なら問題ないみたい、Linux ではよくあることだ。
しかし検索すると Fedora がゲストの記事ばかり、ホストで使っている日本人いないの?

VirtualBox

から Download を辿り 64bit なら以下を導入。
VirtualBox-4.1-4.1.6_74713_fedora16-1.x86_64.rpm

これで起動はできるが Guest OS は立ち上げることができない。
setup を行う必要あり、ようするにカーネルのコンパイルだ。
しかし Fedora は gcc や DKMS がデフォルトで入らないので入れる。

これで以下のコマンドが成功する。

$ sudo /etc/init.d/vboxdrv setup

後は普通に使うだけ。

# Gedit

コード・スニペットが何故か適用できない、それは困る!
この手のバグは自力でなんとかしないと Fedora は修正してくれないと思う。

Ubuntu では問題無い、ということはプラグイン自体の問題ではなさそう。
例外を見ると gi が怪しい、propertyhelper.py を Ubuntu と比較。

Ubuntu にはサブクラスチェック項目に GBoxed というのがある。
Ubuntu 用 gi のほうが新しいの?とにかく追記して試してみよう。

$ beesu gedit /usr/lib64/python2.7/site-packages/gi/_gobject/propertyhelper.py

で開き 193 行め issubclass に _gobject.GBoxed を追記。
307 行めを以下に書き換え
elif ptype.is_a(TYPE_OBJECT) or ptype.is_a(TYPE_BOXED):

で有効にできた、a.py を作り py と打ち込み Tab キー

よし完璧、思っていたより簡単に修正できた。
こんな時に Python をやっていて良かったよと思う。

他に Fedora 15 では外部ツールで保存指定ができなかったけど修正されている。
$GEDIT_SELECTED_TEXT 環境変数が日本語未対応なのは変わっていなかった。
Ubuntu とは違いファイルのドロップで落っこちたりなんかしない。
しかしテキストのドラッグ&ドロップ編集で落っこちる…

# ibus

ibus のトリガを Release+Zenkaku_Hankaku のみに変更してみた。
これで「全角/半角」キー認識は問題無くなったようだ。
だから Ctrl+Space は Gedit のスニペット保管だから被るというのに…

デフォルトのトリガにチョン語がある、フザケルナボケ!
というかあの半島はサーバーを含めて全部 Windows じゃなかったっけ?

# Nautilus

Update を掛けたら
$ beesu Nautilus
ができるようになった、これでコピーは簡単に。

space キーでのプレビューは正直イラネ。
削除は Ctrl+Delete のままか、Ubuntu は Delete のみなのに。

# ORBit2

Gjot2 を入れようと思ったけど GNOME 3 非推奨の ORBit2, libDL が必要と出る。
まだ GConf を使っている Ubuntu じゃあるまいしヤメにする。

.gjotsfile 自体は単なるテキストなのでとりあえずは困らないがやはり見にくい。
しかたがない、互換のを自作するか文書まとめに別の方法を探るかだ。
編集は Gedit 観覧は WWW ブラウザで連携、というのが理想なんだが、うーん。

# Keepassx

Keepassx は小細工しなくても @ が入力できるようになった。
でも Opera では入力速度が追いつかない、Chrome で使おう。

# Opera

いやぁ、やっぱり Opera は快適、単なる慣れなんだけど。
Chrome もイイんだけど file:// がジェスチャで閉じなかったり右クリックメニューがジェスチャとのバッティングからか出たり出なかったりで困っていたけど組み込みのおかげか歴史が長いせいか Opera は完璧、他は全部負けている気がするけどw

Opera の美点はソコだと思うんだがまとめブログとかを見ると呆れる。
自分が作ったわけでもない使っているだけのアプリに誇りを持っている人達って何?

今のところこのくらい。

Fedora 16 64bit Install (HDD)

半年毎恒例の Linux アップデート、今回も Fedora でいく。
新規で HDD に入れて旧 HDD はバックアップという毎度の流れで。

古い記事へのアクセスが結構あるが二番めか、何故だ!

それ Fedora 12 だよ、コッチに誘導するよう追記しておこう…

ちなみに現在のマシンは
AMD Phenom2 x4 955 CPU
AMD 880G, SB710 マザーボード
4GB バルクメモリ
880G オンボードグラフィックという構成です。

4GB メモリのままなので 64bit の必要は現在無いのであるが…
今後を考えると慣れておいたほうがいい、64bit Flash も出たことだし。

Fedora Project ホームページ

「いますぐダウンロード」だと 32bit 版がダウンロードされる。
「すべてのダウンロードオプション」をクリック。
GNOME の 64bit を選ぶ、以下は GNOME 版以外を試していない。

とにかく GNOME 版 x86_64 の iso を落として CD-R を焼く。
遊んでいる HDD に取り替え Live CD を立ち上げる。

Fedora 15 の時は気がつかなかったが日本語でインストールできた。

右上 Live System User → System Settings をクリック。
Region and Language アイコンをクリック。
Language タブの + ボタンをクリック。
Japanese を Selectt する。
ダイアログを閉じて再ログイン、見事日本語環境に。
解りやすくなったところで他タブにてキーボード等の設定を行う。

この状態でランチャから HDD に V が重なったアイコンをクリック。
見事日本語でインストーラが立ち上がりました。

・ファイルで開く
・取り出し
という唖然メッセージが下からニョキッと出るけどガン無視でよろし。
ウザいなら「ファイルを開く」を選択すると開く Nautilus を即閉じる。
Windows だとボロクソに叩かれそうなミスだな。

とにかく全部デフォルトのまま進める、LVM がどうとか気にしないw
後で変更できるけど最初から sudo を使いたいなら所有者グループにチェック。
普通にインストールを終了すると最初から日本語環境でユーザー設定に。
Ubuntu と違いユーザー設定は再起動後に行うので戸惑わないように。
適当に指定し右下のボタンを押していくとインストール完了。

15 に比べ起動中画面がモノクロっぽくなった。
ほんのちょっぴりだけ起動時間も早くなったような気がする。

軽く使用してみる。
GNOME 3 の 3D デスクトップは上記構成で問題なくバリバリ動く。
Fedora 15 に比べ若干タイトルバーやツールバーの高さが小さくなった。
あの細すぎる枠線はそのままだが認識範囲が大きくなりリサイズしやすくなった。
Firefox のアルファベットが最初からキチンとプロポーショナルになる。
ibus の「全角/半角」キーをたまに認識しなくなる、またかよ…

やはり今回もデフォルトではデスクトップに物が置けない。
後で dconf-editor を導入して設定変更しよう。

Gnome 3 の設定 (gsettings)

とりあえず大きな問題は無かったので旧 HDD をスレーブ接続でデータコピー。
で問題が、 Nautilus で旧 HDD のホームを開けない!
beesu をインストールして使ってもダメ、なんて高いセキュリティなんだw

端末から cp コマンドなら使えた、後で chown と chglp を -R で。
やっぱりコマンドを打てない人には Fedora はお勧めできない。

まず gnome-session-properties でフォルダ名監視を無効にしておく。
んで ~/config/user-dirs.dirs を書き換え再ログインで以前のとおりと。
.gtk-bookmarks なんかも忘れずにコピーしよう。
naitilus-scripts, gedit/plugins, config/gedit 色々あるな。
私的なものは .gjotsfile と .clipolix も大事なデータ。

動画デコーダー等のリポジトリ導入。
RPM Fusion – RPM Fusionに必ず Firefox で行く。
Enable RPM Fusion on your system をクリック。
Graphical Setup via Firefox web browser の 16 両方をクリック。
Totem を立ち上げ動画をドロップ、ひたすら指示に従えば導入完了。
コレをやらないと Nautilus でサムネイルできないのよね。

あら Totem は Ubuntu みたいな色に。

PyGtk のままな自作公開アプリ Y901x, clipolix, trash はまだ動かせる。
早く GTK3 化しなければいけないと思うけど。

Google Chrome の導入、残念だけど Flash は別に入れる必要あり。
Google Chrome – ブラウザのダウンロード
設定や拡張は ~/.config/google-chrome のコピーでイケた。

でもってやはり Chrome は SELinux に何かがブロックされる。
コレってスパイ行為かも…と気になって怖い人は導入を避ければいいと思うよ。
RealPlayer を未根拠でスパイ扱いしていた無知な人達は特に。

# grep chrome /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp

Flash の導入、Firefox で行くと YUM が選択できる。
Adobe – Adobe Flash Playerのインストール
リポジトリ追加だけなので「追加/削除」から改めて入れる必要がある。

Opera next も導入、と思ったら 11.60 beta が出ていた。
Opera Desktop Team – Desktop Team
終了時にクラッシュしなくなっているしブロックもされない、よしよし。
デフォルト Font は相変わらず、GTK+3 テーマは 11.60 で適用であるようだ。

Opera を終了すると Nautilus のフォントが又変わる場合があるな、なんだこれ?
再ログインで元通りだけどさ。

狐は相変わらず起動が遅すぎだしドレを選ぼう…

他は「追加/削除」からお好みで。
プロポーショナルフォントの VL P ゴシックは今回も入っていない。
dconf-editor は必須だと思う。
ghex が GTK3 化されコマンドも ghex のみと 2 が付かなくなった。

ということで、Fedora 15 と基本あまり変わっていない。
ウインドウのリサイズが行いやすくなった事が一番嬉しいかな。
他何か気がついたら後日。