Fedora」タグアーカイブ

Fedora 17 64bit Install (HDD)

あぁ Fedora インストールから半年経ってしまった。
恒例の OS 更新の季節がやってきた、メンドクセエ…

ということで。

久々の blog 更新ですがマジで全然プログラミングしていなかった。
二月にスマホを Android に変更して新しい OS にドップリはまり
何故かバイクの免許が欲しくなり取りにいき 250cc のバイクを買い
スマホと GPS と Google Map の組み合わせは最強だ!と思い知る。

こんなのがライバルではデスクトップ Linux なんて流行るわけがない…

今後デスクトップ OS は仕事用以外はクリエイターしか使わなくなるかと。
とはいえ絵描き、動画編集、プログラミング等とクリエイターにも色々ある。
結局何か作りたいならデスクトップ OS が必要になるはず。

そんなこんなで恒例の Fedora インストール。
基本的に前回と同じだが細かく違いがある。

Fedora 16 64bit Install (HDD) | PaePoi

マシン構成は前回と同じ、新規 HDD に入れて旧 HDD はバックアップ。
ただ Fedora 17 からは「いますぐダウンロード」が 64bit になった。

Oh no! Something has gone wrong.
A Problem has occurred and the system can’t recover.
Prease log out and try again.

ライブ CD を試そうとすると上記の警告が何度も出る。
一度ログアウトしてログインのやりなおし(以下再ログイン)をすると消える。
インストール CD に不具合があるのは毎度のことだ。

インストールボタンがあるウインドウが初期状態で出るようになった。
でもそのまま選択するとやはり英語でインストールというオチになる。
やはり System Settings から Language を変更して再ログイン。
するとボタン付きウインドウも日本語化されるのでこの状態からインストール。
後は指示に従いお好みに、私は英語キーボードなのでほぼデフォルト。

問題なくインストールできたけど終了しようとしたらいきなりエラー。
即座にアップデートをかけたほうがいい。

出たばかりなのにコレか、まるで Ubuntu みたいだ。

毎度のように旧 HDD をスレーブ接続でデータコピー。
今回はどういうわけか HDD マウントで所有者が自分になった。
これなら Nautilus からコピペのみでいいのでファイルコピーも楽チン。
いくつかは SE Linux ポリシーの変更が必要になると思うけど。

RPM Fusion と Flash YUM と Google Chrome だけを狐でダウンロード。
いつまでこの激重で使いにくくて未来が無い狐がデフォルトなんだよ!
Opera とかは Chrome で落とす、狐を使うことはもう無い。

てか現在大量増殖しているスマートフォンは WebKit なんだよね。
他は私を含む一部のマニアが Opera Mobile を併用しているだけだと思う。
Windows8 の空気っぷりを考えると多分 IE と狐は消える運命だろうね。

Google Chrome の SELinux ブロックが今のところ無い。
改良してくれたのかな、もし出ても前回と同じ回避策でいいと思うけど。

てゆーかいいかげんにデスクトップにものが置けるのをデフォルトにしてほしい。
つか dconf-editor は必須なのだから最初から入れてくれよ…

我がアプリ Y901x, clipoli, memopoli はまだ全部動く。
PyGtk や GStreamer 静的バインディングはそのうち消えると解っているが。
GI 動的バインディングの情報がもっと集まらないと動けないのよね。

# 削除したもの

ibus-hangul
libhangul

メリケン供には日本人とチョンの区別ができないようです。

# Fedora 16 との違い。

Fedora 17 SourceForge.JP Magazine

/bin, /sbin, /lib, /lib64 などのディレクトリが/usr以下に
って移動してシンボリックリンク貼っているのでは結局同じことだろうに。

リムーバブルメディアのマウント先が /media/ から /run/media/$USER/ か。
あぁだからスレーブ接続した旧 HDD が自分所有になったのね。

他はデスクトップ利用ではあまり関係無いな。

見た目では GTK3 アプリのみだが非アクティブ化したウインドウのフォントやチェックボタンまで色が薄くなるようになった。
ますます GTK2 アプリが古くさく感じてしまうわな。
これはテーマ側だろうけどスクロールバーやスピンボタンも変わっている。
ボタン自体を大きくしたかったのだろうけどこれは…

それより、右下のリサイズグリップが消えた!

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

from gi.repository import Gtk

class Win(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.set_title("Fedora 17")
        self.connect("delete-event", Gtk.main_quit)
        self.show_all()
    
if __name__ == "__main__":
    Win()
    Gtk.main()

デフォルトで付かなくなったということみたい。
これではリサイズがやりにくい、何か設定はあるのだろうか?

リサイズグリップ以外は今のところ不満無く使えている。
しかし初期状態で Gedit にまったく問題が無いのって初めてかもしれないw
プログラミング関係は次回、次回があったらだが。

Digital camera with Linux

Canon のデジカメを買った。
写真ド素人の私がレビューしても無意味だが幸い私は Linux 使いである。
コレを Fedora 16 に USB 接続してどうなるか試してみる。

なんか Canon だということを自動認識して勝手に処理してくれた。
ちなみに Panasonic だとこうなる、カメラアイコンにならないんだが。

そこいらに売っているデジカメなら何の問題もなく認識しそうだね。
Fedora や Ubuntu なら本当に素のままで何でもできてしまうわな。
もはや Windows にできて Linux でできないことってエロゲだけかも。

でも実際にはいったいドコにマウントされているのだろう?
場所はどうなっているのか Nautilus で Ctrl+L してみる。

コレは gphoto2 プロトコルで接続していますってことかな。
gPhoto – Wikipedia

とにかく USB 接続している状態で普通に Eye of GNOME 等から観覧可能。
しかし動画は何故かサムネイル作成や再生開始まで異様に時間が掛かる。
HDD にコピーすれば何も問題なく観覧できるのだが気になる。
というか Y901x では動画が再生できなかった…

理由がよく解らないので gnome-terminal にドロップしてみる。

こんなところにマウントしていたのか!
しかし Nautilus から W クリックすると Canon Digital Camera 部に転送される。
というかツリーを辿れない、シンボリックリンクでは無いようだし。

端末からならツリーを辿って eog 等でファイルも開ける。
けど gvfs-open 指定で Tab キーを使うと gphoto2 プロトコルに変換される。
あ、GNOME3 で関連付け起動は gnome-open ではなく gvfs-open を使います。

それなら Y901x でも開けそうなんだが…
同じようにカレントディレクトリから Y901x を使っても再生できなかった。
もちろん sys.argv も同じエラー、フルパスではアクセスできない。

つまり実際にマウントされるのは ~/.gvfs 以下。
だけど GVfs 経由で参照しなきゃアクセスはできないようだ。
gphoto2:// で始まるプロトコルに変換する必要があるのね。
つか、GVfs なら GTK3 化しなきゃいけないな…

平日にハマると怖いのでコレ以上の検証は後日に続く。
久々にアプリの更新ネタができたけど最近忙しいので…

Celeron su2300 mini Note @ Fedora Dual Boot

Acer Aspire 1410 ミニノートの電源を三ヶ月ぶりくらいで起動。

当然のごとく二時間半程度ひたすらアップデート、更に何度か再起動…
電源すら入れていないのにセキュリティエッセンシャルがスキャン開始…
ゲンナリして使う気をなくしそのまま電源オフ…
をやったのが三ヶ月前、そして今回も…

このままでは永久ループだ!
必要になった時に即使えないモバイルなんてまったくの無意味。

Windows に文句を言ってもしかたがない。
とにかくアップデート時間の短縮と無意味スキャンをなくしたい。
ならば Linux にするしか無い、しかし Windows7 を消すのも躊躇する。

ということで Fedora 16 とのデュアルブートにすることにした。
ミニノートに Linux で無線 LAN とかは大丈夫だろうか、実験を兼ねて。

とりあえず Windows7 を起動して Linux を入れる空き領域の確保。
「スタートボタン」→「コンピューター」右クリして「管理」を選択。
「ディスクの管理」から C ドライブを選択、右クリして「ボリュームの縮小」
表示された最大値で圧縮、簡単に空き領域確保。

画像は Fedora を入れた後だから埋まっているけど右二つ分ほど領域が開いた。
後は Fedora Live CD を立ち上げ以前と同じようにインストールする。
Fedora 16 64bit Install (HDD) | PaePoi
Live 時に無線 LAN の指定をしておいたらそのまま引き継がれたよ。
デュアルブートにするにはインストール時に「空き領域に…」を選択。
だけで見事 GRUB でのブート選択ができる環境の完成。

Fedora 16 の起動時間は約 3 分…
Windows7 も安定するまではそのくらい掛かるけど、やっぱり遅すぎ。
起動後にバックでガリガリとかはまったく無いのは嬉しいけど。

当然のように最初から 1366×768 画面で起動。
GMA4500M のショボイグラフィックでも問題なく 3D デスクトップ。
ノートなのを認識して画面や電源の設定で節電項目が増える。
Windows の NTFS 領域にもマウントしてアクセスできる。
無線 LAN は選択して暗号化キーを打ち込むだけで接続完了。
Bluetooth マウスもアッサリ認識。
タッチパネルの指二本スクロールもマウス設定から指定可能。
天板を閉めると普通にサスペンド。

今の Linux って凄い、何の苦労もなくほぼ全自動だった。

そうそう音も普通に鳴る、昔は凄い苦労をした記憶があるが。
Intel グラフィックでも問題無い、以前は相性最悪だったのだが。
Compiz の Ubuntu だと解らないけど、GNOME 3 は Clutter なので。

動画再生支援は無いけど 1080p もギリギリ再生できる。
支援機能の利用はライセンス料がいるからしかたがないよ。

これでもうアップデートとスキャンでゲンナリすることは無い。
デスクトップと同じ OS だと 1.2GHz CPU の遅さを体感できるw

それにしても Linux は快適だ。
非アクティブのアプリでもホイールスクロールできるのが嬉しい。
たまに Windows7 を使うと「あれ?」ってなる、特に Explorer で。

ついでに Windows7 からもいらないアプリを削除。
Live 全削除、Adobe は Flash だけ残して削除。
RealPlayer Mini は配布が無くなっているって何よ、これも削除。
PDF は evince、メールは Opera、動画はノートで見ない。
よしスッキリ、でも次に Windows を使うのは又三ヶ月後くらいだろう。

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 に書き直しメンドクセ!
まあその財産があるからこんなコードが数時間で書けるのであるが。