Linux」カテゴリーアーカイブ

gnomevfs to gio.File

GIO tutorial: File operations ? Johannes Sasongko’s blog

こんな Blog を見つけた。
そうか、こうやれば gio.File からファイルタイプが取得できるんだ。

これでやっと gnomevfs の呪縛から逃れられそうだ。
もうすぐというか GNOME 3.0 から使えなくなるはず。

PyGObject Reference Manual
gio Constants#gio-file-attribute-constants

上記を見れば名前空間は何を指定すればいいか解るね。
standard::type 指定だと GFileType が戻ってくるので standard::content-type かな。

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

import sys
import gio

s = sys.argv[1]
f = gio.File(s)
info = f.query_info("standard::content-type")

print "name: {0}\ntype: {1}".format(s, info.get_content_type())

おぉ、これで拡張子が無くても content_type が取得できる!
MIME Type とずっと書いていたけど content_type であったみたい…

沢山の info を query するにはコンマ区切りで書くかワイルドカードを使う。
ただしコンマの前後にスペースを入れると上手くいかないのは何故だろう。

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

import sys
import gio

s = sys.argv[1]
f = gio.File(s)

# Not Space
info = f.query_info("standard::type,standard::size,standard::content-type")
#info = f.query_info("*")

print info.get_file_type()
print info.get_size()
print info.get_content_type()

ついでに GStreamer から得られる uri も gio で変換できるようだ。

uri = self.player.get_property("uri")
#t = urllib.unquote(uri)[7:]
t = gio.File(uri).get_parse_name()

意図的に日本語ファイル名にしても問題なく変換できた。
というより gio.File() ってフルパスでも uri でもどっちでもいいんだね。
とにかくこれなら urllib モジュールもいらないな、gio スゲェ便利。

ということで Y901x 0.3.4 公開。

そうそう、0.3.3 で dbus を取っ払ったんで本体は gtk.Window 派生に変更した。
多重起動防止はなくなったけどやっと普通な PyGtk アプリになった感じ。
追加機能はほとんどやらずにこんなことばかりやっていていいものか…

wnck get_application

Ubuntu マシンを AMD 880G と Phenom II X4 955 に変更して一週間。
何もかも早くなったのは当然として終了に 10 秒掛からないのは衝撃である。

しかし Y901x が更に落ちやすくなった…
CPU が 4 コアになったからとしか思えない…

gtk.gdk.threads_init()

を呼ぶと落ちなくなるようだ、もう少し様子見。
マルチスレッドで動いている GStreamer をシングルスレッドで動かしていたから???

だけどコレを呼ぶと dbus による uri 転送でフリーズするんだなコレが。
これは uri 転送方法を変更するか、いっそ多重起動を許すか…
多重起動を許すのは簡単だ、多重起動防止処理を取っ払うだけだもの。

何か参考は無いかと /usr/bin を漁る。
少し違うけど gwibber のコードがおもしろい。

# Don't run again if we are already running
progname = "gwibber"
screen = wnck.screen_get_default()
while gtk.events_pending():
  gtk.main_iteration()
for w in screen.get_windows():
  if w.get_application().get_name() == progname:
    w.activate(int(time.time()))
    w.move_to_workspace(screen.get_active_workspace())
    quit()

そうか、今のワークスペースに移動って処理もあったほうがいいな。
ウインドウが移動するのではなくタスクバーに現れるのね、なるほど。

gwibber も Python 製だったのか。
インデントが滅茶苦茶だ、これでデフォルトアプリかよ…
ついでに、wnck を使うと WARNING が出るんだが…

get_application().get_name() と get_name() で違うんだね。
get_name() だけだとタイトルバー文字列になるんだけど。

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

import gtk
import wnck

screen = wnck.screen_get_default()
while gtk.events_pending():
    gtk.main_iteration()
for w in screen.get_windows():
    print w.get_application().get_name()
    print w.get_name()

さて Y901x はどうしよう、今日はもう寝るけど。

ubuntu C# matome

とりあえず Ubuntu での C# をまとめてみた。
Ubuntu で C# – L’Isola di Niente

-pkg 指定で pkg-config 展開ができるはずなんだが方法が見つからない。
MonoDevelop 使えで済ませようか、とも思うけどインストールするかどうかも迷っている。
というか見ての通りコッソリと Python を勧めているわけでw

とりあえずこんな感じで覚書ページを小分けで移植していこうと思う。

AMD 690G to 880G for Ubuntu

AMD 880G マザーボードを買ってきた、これに Ubuntu 10.10 を入れる。
AMD 690G と Athron64 x2 2.2GHz にそろそろ限界を感じてきたので。
コイツの内蔵グラフィックで fglrx は大丈夫なのかな?

ついでに Phenom II X4 955 と DDR3 4G メモリ。
今まで Duron とかしか買わなかった私なのに 4 コア CPU とはなんてリッチ。
全部で二万円ちょっとだったけど、安くなったもんだ。

三年前のドスパラマシンの中身を全とっかえ、自分で組むのも三年ぶり。
LED 配線のプラスマイナスを間違えた以外は問題なく終了。
余っている HDD に Ubuntu をインストール、これも問題無しで再起動。

流石は CPU パワーが 1.5 倍かつ 4 コア、体感速度も超早くなった。

fglrx は普通に有効になった、標準ドライバもよくできているけど一応。
とにかくコレで動画の CPU 負荷は減るはず。
標準ドライバの時と違ってスクリーンショットのラインが解りにくい…

後はいつものように旧 HDD をスレーブ接続してデータコピー。
Gedit プラグインや Nautilus スクリプト、Opera の設定はコピーだけで使える。

ところで Ubuntu 関連を探すとディレクトリ名変更に変なことしている人が多いけど

コレを off にして F2 キーで普通に変名するだけなんだが…
~.config/user-dirs.dirs も連動して書き換えしてくれるし。

後は必要なアプリを日本語セットアップヘルパと追加と削除から。
Opera を追加と削除にデフォルトで入れてくれないかなぁ…

Opera
Y901x
Gimp
VirtualBox ose
Sylpheed
Ghex
KeepassX
Apache2
PHP
Gjot2
Gnote

再構築完了まで四時間、旧 HDD はそのまんまバックアップになるので一石二鳥。
問題はコピーした VirtualBox 仮想マシンな Vista はアクチが通るかだ。
Vista を買った時に使っていた DVD-R は同じなのでライセンスは間違っていないが。

問題なかった、数値はあまり変わらないけど明らかに快適さが違う。
CPU を 2 に割り当てしたけどタスクマネージャは一つ、何故だろう。
ついでに起動時のサウンドが歪んでいたのも良くなった。

ま、仮想マシン上での Visual Studio が重すぎるのでパワーアップしたんだが。
それと Y901x とかの動画ファイル切り替えで落ちなくなると嬉しいんだが様子見。

やはり Linux もなるべく新しいハードで使わなければ快適にはならないや。
とにかく AMD 880G + SB710 なら Ubuntu 10.10 は問題無いみたい。

よし動画を見まくるぞ!
いや、サイト整理は地味にやっているけどちっとも進まないんで…

Fake System.IO

System.IO.File.ReadLines は .NET 3.5 や mono で使えない。
だったら自分で作ってしまえ、と思ったのでやってみた。

どうでもいいけど gmcs も csc.exe と同じオプションが使えるんだね。
/out:FILENAME は -out:FILENAME みたくハイフンにするだけ。

いや、yield を使ったことが無いのでやってみようかと。
こんな強引というよりアホなメソッド追加なんてできるのかな?

using System;
using System.Collections.Generic; //IEnumerable

namespace System.IO
{
    public static partial class File
    {
        public static IEnumerable ReadLines(string path)
        {
            using(var sr = new System.IO.StreamReader(path))
            {
                string buf;
                while ((buf = sr.ReadLine()) != null)
                {
                    yield return buf;
                }
            }
        }
    }
}

File クラス (System.IO)
File クラスは partial class では無いみたいだけど。

コンフリクトか、やっぱりダメだった。
Windows でもやってみたけど同じ、こんなことをやろうと考えるほうがおかしい。
しかたがない、名前空間には追加できるはずだから違うクラス名にしてみる。

fakeio.cs

using System;
using System.Collections.Generic; //IEnumerable

namespace System.IO
{
    public static class FakeFile
    {
        public static IEnumerable ReadLines(string path)
        {
            using(var sr = new System.IO.StreamReader(path))
            {
                string buf;
                while ((buf = sr.ReadLine()) != null)
                {
                    yield return buf;
                }
            }
        }
    }
}

readlines.cs

using System;
using System.IO;

class __main__
{
    [STAThread]
    public static void Main(string[] args)
    {
        if (args.Length == 0)
        {
            Console.WriteLine("no arg...");
            return;
        }
        int n = 0;
        foreach (var line in FakeFile.ReadLines(args[0]))
        {
            n++;
            Console.WriteLine("{0}: {1}", n.ToString("000"), line);
        }
    }
}

で、cat.exe という実行ファイルを作るコマンド。

gmcs -out:cat.exe *.cs

何故か exe という拡張子を付けないとエラーになる。
Linux でも強制するんかい、まぁ解りやすいと思えばいいし。
アスタリスクでディレクトリ内をまるごとコンパイルしてくれるのはありがたい。

なるほど、yield はこういう時に使うと確かに便利だ。
C#4.0 の ReadLines って上記を自作する以上のメリットがあるのかな?