Fedora」タグアーカイブ

Linux shift-jis zip file

とある ZIP を展開しようと思ったら Shift-JIS ファイル名を使っていて展開できない。
Ubuntu 日本語 Remix 付属の /usr/bin/zip なら展開できるのだけど Fedora だし。
仮想マシンの Ubuntu から頂いて、と思ったけど我が Fedora は 64bit だった…

仮想マシンな Windows XP から共有を利用して展開。
とソレだけの理由で仮想 Windows を立ち上げるのも面倒だ。
そういえば Python には zipfile モジュールがある、作ってみよう。

とりあえず日本語のドキュメントを探してみた。
13.4. zipfile ? ZIP アーカイブの処理 ? Python v2.6.2 documentation
extractall なんて便利なメソッドがあるじゃん、これは簡単そうだ。
ということで Nautilus スクリプトにしてみた。

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

import zipfile
import os

filenames = os.environ["NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"].split("\n")

for f in filenames:
    z = zipfile.ZipFile(f)
    z.extractall()
    z.close()

こんなに単純なコードでいいみたい。
ファイル名は見事に化けてしまいますが展開だけは成功する。

そういえばパスワード付きの場合もある。
GTK+ でダイアログでも出して入力すればいいかな。

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

import zipfile
import os
import gtk

filenames = os.environ["NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"].split("\n")

for f in filenames:
    z = zipfile.ZipFile(f)
    dlg = gtk.Dialog("password", None, 0, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
    def dlg_ok(self):
        dlg.response(gtk.RESPONSE_ACCEPT)
    entry = gtk.Entry()
    entry.connect("activate", dlg_ok)
    dlg.vbox.pack_start(entry)
    dlg.show_all()
    dlg.run()
    p = entry.get_text()
    dlg.destroy()
    z.extractall(pwd=p)

展開が終了するまでダイアログが閉じないのは何故だろう…
それと展開は死ぬほど遅い…

せっかく作ったけど素直に仮想 Windows から展開するとかのほうが良さそう。
まあ使いたくなる場合もあるだろうからスクリプト登録だけはしておくか。

ところで今頃気がついた。
Nautilus スクリプト位置にディレクトリを作れば入れ子にできるんだね。

まだまだ増やしても大丈夫そうだ。

gi.repository GTK+ Version

Fedora 15 と Ubuntu 11.04 の PyGtk について。

その前に VirtualBox ose 上で Ubuntu を使っているけど \ や | が打てない。
Ubuntu日本語フォーラム / Virtualbox 4.0 で一部のキーが使えない?
VirtualBox ose の Update を待とう…
今回はホストの fedora からクリップボードコピペでなんとかした。

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

from gi.repository import Gtk

message = "「はい」を押すと終了"

while 1:
    dlg = Gtk.MessageDialog(
            None,  
            Gtk.DialogFlags.MODAL,  
            Gtk.MessageType.WARNING, 
            Gtk.ButtonsType.YES_NO,  
            message)  
    r = dlg.run()  
    dlg.destroy()
    if r == Gtk.ResponseType.YES:
        break
    elif r == Gtk.ResponseType.NO:
        message = "それは「いいえ」だろ!"
    elif r == Gtk.ResponseType.DELETE_EVENT:
        message = "閉じるボタンじゃネェ!"
    else:
        message = "不明な動作..."

このコードで Fedora 15, Ubuntu 11.04 のどちらでも動く。
Ubuntu 10.10 以前では例外になる、つか gi から無いわけで。
Fedora のダイアログは「閉じる」ボタンが出ないので右クリックで「閉じる」とやる。

import が変更になり gtk を Gtk に全置換。
以前は定数だったものの大半が enum 名のアトリビュートに変わっている。
それ以外はほとんど同様と思っていいみたい。

つまり Ubuntu 11.04 も GTK3 なのか。
と思ったけどインタラクティブシェル上でコレをやってみる。

from gi.repository import Gtk
Gtk._version

Ubuntu 11.04 の場合はこの形式で書いても GTK2 になるってことなのか。
/usr/lib64/python2.7/site-packages/gi/overrides/Gtk.py
がバージョン違いを振り分けているみたい、とにかくそういうこと。
ソースコードを見てもなんだかよくワカンネェ!

なんにしても早めにこの形式なコードへ書き換えしたほうがいいみたい。
API ドキュメントは既に GTK+ 3.0 になっているのだし。
PyGtk ドキュメントが遅いのはいつものこと。
GNOME 開発センター

ついでに

EyeOfGnome/Plugins – GNOME Live!

このとうりにやっても全然 eog が自作プラグインを認識しない…
~/.local/share/eog/plugins や ~/.local/lib64/eog/plugins
にも試しに置いてみたけど無意味だった。
/usr/lib64/eog/plugins に置くしか無いのだろうか。
ついでに IAge 指定が 2 のままじゃん、Gedit と違ってヤル気が無い感じ。
おかげで自作 eog プラグインの更新ができないよ、まいった。

Fedora 15 007

Fedora 15 (GNOME 3) 64bit 生活七日目。
Ubuntu から Fedora へ乗り換えの覚書日記フィナーレ。

※ samba

Ubuntu でやっていてまだやっていないのは Windows との接続だ。

Ubuntu と Windows でファイル共有 – L’Isola di Niente
と同じように簡単ではない、つか共有なんてプロパティタブは Fedora 15 には無い。

とにかく「追加/削除」から samba 導入。
chkconfig コマンドを root で使って起動時にサービスが立ち上がるように。
ついでに先日導入した Apache も、Ubuntu は導入すれば全自動でやってくれたけど。

$ su
# chkconfig httpd on
# chkconfig smb on

ファイアーウォールの設定で Samba の項目にチェックを入れて適用。

ついでだが、 dconf-editor で workgroup を書き込んでおいたほうがよさそう。

再起動、Nautilus の「移動」メニューから「ネットワーク」に移動。
ひたすらクリックしていくと私のノート PC が見つかった。

これで Windows ノートからファイルをコピーできるようになった。
だけどこれだけでは fedora のファイルは Windows にはコピーできない。
SELinux を弄くる必要があるみたい。

Apache を動かしているのでとりあえず http で今回がお茶を濁した。
ifconfig コマンドで自分の ip アドレスを調べる。
ファイアーウォールで www を有効にする。
コピーしたいファイルを www ディレクトリにコピーする。
んで Windows のブラウザに ip アドレスを打ち込んでダウンロード。
面倒くさいけどコレなら SELinux に左右されないようだ。
以上多分誰もやらない Tips でした。

**********

で、一週間ほど x86_64 の Fedora を利用してみた結果。
問題無さそうだということで半年間継続利用することにします。

来週あたりに 8 GByte 以上のメモリを買ってきてみるか。
今まで仮想 Vista を使っている時にホストで何もできなかったもの。

追記

FTP のほうが簡単だった…

vsftpd を導入
SELinux の FTP 設定変更 # setsebool -P ftp_home_dir 1
使いたい時だけ FTP 有効 # /etc/init.d/vsftpd start
ファイアーウォールの FTP ポートを開ける。
Windows Explorer で ftp://Linux ユーザー名@IPアドレス/ホーム以下で FTP したい場所
例 ftp://sasakima-nao@192.168.1.21/_temp
Explorer がダイアログを出すので Linux のログインパスワード

終わったらファイアーウォールのポートを閉じればセキュリティもばっちり、と思う。
SELinux 自体はあまり弄くりたくないんでコレでいこうかと。

Fedora 15 006

Fedora 15 (GNOME 3) 64bit 生活六日目。

※ Gedit Plugin

Gedit/PythonPluginHowTo – GNOME Live!

Gedit 3 のプラグインは妙に複雑になった感じだけどやってみると簡単。
Gedit プラグインの作り方 – L’Isola di Niente
私の公開しているこのページを Gedit 3 用に改造してみる。

*.gedit-plugin 拡張子であったファイルは *.plugin と拡張子を変更。
セクション名を [Plugin] に、IAge を 3 に変更、v2 との違いはコレだけだ。

肝心のコード

#-*- coding:utf-8 -*-

import gedit
import gtk

class TestPligin(gedit.Plugin):
    def __init__(self):
        gedit.Plugin.__init__(self)

    def activate(self, window):
        self.window = window

    def deactivate(self, window):
        pass

    def update_ui(self, window):
        pass

#-*- coding:utf-8 -*-

from gi.repository import GObject, Gedit, Gtk

class TestPligin(GObject.Object, Gedit.WindowActivatable):
    __gtype_name__ = "TestPligin"
    window = GObject.property(type=Gedit.Window)
    def __init__(self):
        GObject.Object.__init__(self)

    def do_activate(self):
        pass
        
    def do_deactivate(self):
        pass

    def do_update_state(self):
        pass

ということみたい、コールバックに引数は無くなったんだね。
__gtype_name__ は class 名と同じにしなければいけないみたい。

多重継承の敬称元を Gedit.AppActivatable とか3つから選べになっている。
普通なら Gedit.WindowActivatable だけでいいだろう。
下のほうにあるサンプルコードは継承元を書き忘れているじゃん…

後は self.window のメソッドを辿って弄くっていく。
v2 のコードから gtk → Gtk に全置換する必要がある。
それと activate のコールバックは引数を3つにしておく必要があった。
user_data を指定しなくても None が送られてくるみたい、注意ね。

ついでに GtkMessageDialog の引数は enum 形式に変更されていた。
指定がよく解らない人は dir() で辿って(私はそうやった)

testtest.plugin

[Plugin]
Loader=python
Module=testtest
IAge=3
Name=testtest
Name[ja]=テストテスト
Description=plugin test
Description[ja]=プラグインのテスト
Authors=sasakima-nao 
Copyright=Copyright © 2011 sasakima-nao 
Website=http://palepoli.skr.jp/

testtest.py

#-*- coding:utf-8 -*-

from gi.repository import GObject, Gedit, Gtk

ui_str = """<ui>
  <menubar name="MenuBar">
    <menu name="EditMenu" action="Edit">
      <placeholder name="EditOps_3">
        <menuitem name="testtest" action="testtest"/>
      </placeholder>
    </menu>
  </menubar>
</ui>
"""

class TestTest(GObject.Object, Gedit.WindowActivatable):
    __gtype_name__ = "TestTest"
    window = GObject.property(type=Gedit.Window)
    def __init__(self):
        GObject.Object.__init__(self)

    def do_activate(self):
        # GtkUIManager を得る
        manager = self.window.get_ui_manager()
        # GtkActionGroup を新規で作成
        self._action_group = Gtk.ActionGroup("TestTestActions")
        # GtkActionEntry を作成
        # name, stock_id, label, accelerator, tooltip, callback
        actions = [("testtest", None, "引用に変換", None, "すてーたすばー", self.on_testtest_activate)]
        # GtkActionGroup に挿入
        self._action_group.add_actions(actions)
        # GtkUIManager に追加
        manager.insert_action_group(self._action_group, -1)
        self._ui_id = manager.add_ui_from_string(ui_str)
        
    def do_deactivate(self):
        manager = self.window.get_ui_manager()
        manager.remove_ui(self._ui_id)
        manager.remove_action_group(self._action_group)
        manager.ensure_update()
        

    def do_update_state(self):
        pass
    
    def on_testtest_activate(self, action, data=None):
        view = self.window.get_active_view()
        buf = view.get_buffer()
        try:
            begin, end = buf.get_selection_bounds()
        except:
            self.messagebox("変換したいテキストを選択してください")
            return
        text = begin.get_text(end)
        lines = text.split("\n")
        # list の join に変更
        result = []
        for line in lines:
            result.append("> {0}".format(line))
        buf.delete_selection(True, True)
        buf.insert_at_cursor("\n".join(result))
            
        
    def messagebox(self, text):
        dlg = Gtk.MessageDialog(
                self.window,  
                Gtk.DialogFlags.MODAL,  
                Gtk.MessageType.WARNING, 
                Gtk.ButtonsType.OK,  
                text)  
        r = dlg.run()  
        dlg.destroy()

と2つのファイルを作成して ~/.local/share/gedit/plugins に置く。
Gedit を再起動して設定からこのプラグインを選択。

GtkUIManager のメソッドや XML UI 指定は v2 と変わっていないようだ。
これで Gedit 3 のプラグイン作りはなんとかなりそう。

ついでに、外部ツールで実行前にファイルを保存するように指定すると動作しない。
gedit って更新毎に必ず一ヶ所はおかしな所があるよね。

Fedora 15 005

Fedora 15 (GNOME 3) 64bit 生活五日目。

※ データ移動

そういえば、毎度のように旧 STAT HDD をスレーブ接続してファイルコピーしたんだけど。
よく考えたら 64bit OS で 32bit 記録データを普通に認識できるんだ、今頃気がついた。
デスクトップ PC 限定の話だけど 64bit Linux への移行でデータコピーは悩まなくていいね。

※ GNOME 3

【レポート】Fedora 15に搭載された新機能 (1) GNOME 3を採用したFedora | エンタープライズ | マイコミジャーナル

GNOME3 の機能についてはココが一番解りやすかった。
コピペしてもしょーがないしリンクだけ、Alt キーでシャットダウンメニューを出すのか…
ログアウトしないとシャットダウンできないかと思っていたよ。

※ VirtualBox ose

VirtualBox が v4 になって標準の vdi 作成位置が変わって面食らった。
とりあえず v3 のデータはコピペで動きますけど。

【レポート】VirtualBox 4.0でデータの保存場所が変更された理由とは? | エンタープライズ | マイコミジャーナル

変換するより使わないのを整理と入れ直しで綺麗にしたほうがいいと思うけど。
Vista は Visual Studio を含めると再インストールに二日掛かるんだよね。
v3 形式のままでも動くんだからしばらくはこのままでいこうかと。

つかドットディレクトリ内に入れてくれよ、手書き編集なんかしないんだから。
デフォルトじゃ標準ディレクトリが全部アルファベット小文字な私は一番上に来て困る。
設定を変更して Ubuntu 11.04 は入れ直しするはめになったぞこのやろう。

ose 版だと USB が使えないとか見かけるけどマウスもキーボードも USB だけど動く。
そういえば USB メモリって全然使わなくなったなぁ。

※ 個々アプリケーション

gcc が入っていない、ヘッダも lib も何もない。
Ubuntu でさえ入るようになったのに。

evince (ドキュメント・ビューア)が凄い進化をしている。
手持ちの PDF で見れないものは無くなった。

gksu の代わりに beesu なのは以前と同じだ。
でも sudo は自分をユーザー登録しないと使えない。
su で充分だしホーム以下以外はほとんど弄くらないで使えるからどうでもいい。

gnome-tweak-tool ってのを入れたけど dconf-editor とあまり変わらない。

※ 自作アプリケーション

Y901x が x86_64 環境で動画再生できない原因がやっと解った。

Unicode Manipulation

g_utf8_collate_key_for_filename ()
の引数は gchar* と gssize なので char* と size_t が実体だ。
_t が付く型名はコンパイラ依存なので x86_64 では 64bit サイズになる、と思う。
つまり numsort.py の argtypes 指定は int ではなく size_t にする必要がある。

glibc = ctypes.cdll.LoadLibrary('libglib-2.0.so.0')
cmpstr = glibc.g_utf8_collate_key_for_filename
cmpstr.restype = ctypes.c_char_p
#cmpstr.argtypes = [ctypes.c_char_p, ctypes.c_int]
cmpstr.argtypes = [ctypes.c_char_p, ctypes.c_size_t]

それとgtk.gdk.threads_init() 処理を入れるとリピートで死ぬ。
全然使わないので気がつかなかった、終了前に次を再生にするもので。

gtk.gdk.threads_enter()
self.next_menu.emit("activate")
gtk.gdk.threads_leave()

とやってみたら上手く動いた、実はイマイチ解っていない(ぉい!
エ○動画連続再生の要望しか来なかったあの頃を思い出す…

VirtualBox ose 上 Ubuntu 11.04 (x86) でも動作確認してと。
てなわけで Y901x 0.3.7 公開、次は gedit プラグインの作り替えか…