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

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 化しなきゃいけないな…

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

Gio Streaming I/O @ Seed and PyGI

そういえば Seed で環境変数を使うにはどうすればいいのだろう?
Python のように便利な標準モジュールみたいなのは無いわけで。
多分 glib 等に頼るしかないのだろう。

Miscellaneous Utility Functions

glib に env 関連はあるね。

#!/usr/bin/env seed

GLib = imports.gi.GLib;

Seed.print(GLib.getenv("HOME"))

GLib.setenv("HOGE", "Madoka Magica")
Seed.print(GLib.getenv("HOGE"))

これでイケる、GLib.get_home_dir() でも $HOME は取れる。
でも日本語を getenv だと ? になって print されてしまった。

インタラクティブシェルなら問題なく日本語表示している。
? の文字数は合っているから UTF-8 だと認識はしているみたいだが何故だろう。
Python の coding:utf-8 指定のようなものが何か必要なのか?

そういえばファイルを読み書きする open() も無いよな。
gio で読み書きするしか方法が無いと思うけど。

Seed/Tutorial – GNOME Live!
Seed/Tutorial/Simple_file_io – GNOME Live!

GDataInputStream, GDataOutputStream を噛ます必要があるようです。
Streaming I/O
なんか面倒くさいけど以下で読み書きできた。
読み込みはよくある一行毎に処理する方法にしている。

#!/usr/bin/env seed

/*
    Streaming I/O File Read and Write Sample
    if the Seed
    ( null parameter is not needed )
*/

Gio = imports.gi.Gio;

var filename = "test_js.txt";
var lines = "madoka\nhomura\nmami\nsayaka\nkyoko";

// Write
var f = Gio.file_new_for_path(filename);
var fstream = f.replace();
var dstream = new Gio.DataOutputStream.c_new(fstream);
dstream.put_string(lines);
fstream.close();

// Read
f = Gio.file_new_for_path(filename);
fstream = f.read();
dstream = new Gio.DataInputStream.c_new(fstream);
while (1) {
    var text = dstream.read_line_utf8();
    if (text == null) break;
    Seed.printf("%s(%d)", text, text.length)
}
fstream.close();

日本語でも書き込みはできた、けれどアウトプットはやはり ? になる。
それと length を取得する方法が無いみたい、int では値渡しになるし…

コレで gi にて Streaming I/O を使う方法が解ったぞと。
ということは PyGI で同様にするには以下のように。
ほぼ同じだったけど微妙に違う。

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

'''
    Streaming I/O File Read and Write Sample
    if the Python
    ( All None parameter @ GCancellable )
'''

from gi.repository import Gio

filename = "test_py.txt"
lines = "madoka\nhomura\nmami\nsayaka\nkyoko"

# Write
f = Gio.file_new_for_path(filename)
fstream = f.replace("", False, Gio.FileCreateFlags.NONE, None)
dstream = Gio.DataOutputStream.new(fstream)
dstream.put_string(lines, None)
fstream.close(None)

# Read
f = Gio.file_new_for_path(filename)
fstream = f.read(None)
dstream = Gio.DataInputStream.new(fstream)
while 1:
    text, length = dstream.read_line_utf8(None)
    if text == None:
        break
    print "{0}({1})".format(text, length)
fstream.close(None)

Seed は基本的に NULL でいい引数は書く必要は無い、書いても結果は同じ。
Python は GCancellable を強要する、None で通常なら問題ない。
つか Python はやっぱりタプルを戻す、つまり Python なら length も取れる。
慣れていないと困惑するよなこの仕様。

DataInputStream の c_new って何だろう?

#!/usr/bin/env seed

Gio = imports.gi.Gio;

for (var s in Gio.DataInputStream) {
    Seed.print(s);
}
/* output
type
c_new
prototype
*/

static 状態では prototype のメソッドを使えないということか。
そういうことなら new という名前でイイと思うが理由があるのだろう。

とりあえずこれだけ解れば小物スクリプト程度なら作れると思う。

どうでもいいけど。

var f = Gio.File.new_for_path(fn)
var f = Gio.file_new_for_path(fn)

PyGI でも同じである、gi ってどっちでもいいんだね。

Gedit External Tools and Seed argv

Linux に移行してからテキスト編集のほぼすべてで Gedit を愛用している。
Windows から Linux に移行できたのも Gedit が存在したからなのは確実といえる。
Gedit をシンプルという人はただの無知、Windows 的思考を早く捨てろといいたい。
Windows ではほとんど意味が無くなった環境変数が Linux では重要なのです。

前置きはこれくらいにして。
私は Python コードの Debug に長いこと以下の外部ツールを使っていた。

#! /bin/sh
python $GEDIT_CURRENT_DOCUMENT_PATH

を F5 キーに割り付けて結果をボトムペインに表示させている。
しかし最近 Seed を少しかじってたりするが、つい F5 を押してしまう。
F6 等に割り付けしても ibus に取られるのか無視されるし何より間違える。

それなら F5 からソースによりで振り分けしてしまえばいいじゃないか!
環境変数 $GEDIT_CURRENT_DOCUMENT_TYPE で ContentType が得られるので

#!/bin/sh
PYTHON="text/x-python"
SEED="application/javascript"
HTML="text/html"
BASH="application/x-shellscript"
echo @Lunning $GEDIT_CURRENT_DOCUMENT_TYPE
if [ $GEDIT_CURRENT_DOCUMENT_TYPE = $PYTHON ]; then
    python $GEDIT_CURRENT_DOCUMENT_PATH
elif [ $GEDIT_CURRENT_DOCUMENT_TYPE = $SEED ]; then
    seed $GEDIT_CURRENT_DOCUMENT_PATH
elif [ $GEDIT_CURRENT_DOCUMENT_TYPE = $HTML ]; then
    google-chrome $GEDIT_CURRENT_DOCUMENT_PATH
elif [ $GEDIT_CURRENT_DOCUMENT_TYPE = $BASH ]; then
    sh $GEDIT_CURRENT_DOCUMENT_PATH
else
    echo Non Support File
fi

こうしておけば ContentType 次第でコマンドを変更できるじゃない。
私が現在利用するのはコレくらいだ、好みで追記とかすればいい。
ちなみに Perl の ContentType は application/x-perl である。
一部の人は「Opera じゃないのか?」とツッコまないでください。

これで Python でも Seed でもボトムペインに結果を出力できる。
そういえば Seed 名前空間にはどんなメソッドがあるのかな?
Seed で Python の dir() に相当するのは for in 文なので

#!/usr/bin/env seed

for (var s in Seed) {
    Seed.print(s);
}

と、こんな感じで利用できます。
なるほど、argv オプションはココから得るのかと解った。
for 文で取り出して、argv.length でコマンド数が得られるようだ。

#!/usr/bin/env seed

for (var i=0; i < Seed.argv.length; i++) {
    Seed.print(Seed.argv[i]);
}

Python とは違い引数の最初に seed が含まれてしまうようだ。
+x して ./ でも結果は同じ、注意しないと間違えそう。

後は for in 文を使って各名前空間のメソッドをボトムペインで調べてと。
かなり Seed プログラミングが楽になったぞと。
いや、間違えて js を Python で、というのが無くなるのが一番嬉しいか。

ここまで Gedit を利用してアプリ作ったりコードをバリバリ書いていても…
Linux 屋からみれば「コイツ vi 使えないの?ププッ!」と思われているかも…
使い方はマジで知らないですけど、サブのエディタは nano ですし。

Gio GFileEnumerator and load_contents

seed をやっている日本人がいた、あぁ日本語で読めるのは素晴らしい。
とはいえ海外でもあまり盛り上がっていないわけですが。
前ページを見て笑った、日本語で探すとそうなってしまうんだよ。

seedでGIOしてみる – ふとしの日記

なるほど、Gio でディレクトリ内容列挙したい場合はこうするのか。
引数は必ずしも JSON でなくてもいいのか?又解らないことが増えた。
while は for in 文でいいんじゃない?と思ったが…
そういえば JavaScript ではオブジェクトメソッドの列挙になるのよね。

ま、私は PyGI でヤルんですけど。
ということで $HOME のファイルを列挙するサンプルコード。
“standard::name” だと byte になるので “standard::display-name” にした。

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

import os
from gi.repository import Gio

# set Directory Name
d = Gio.file_new_for_path(os.path.expanduser("~"));
# Get GFileEnumerator
enum = d.enumerate_children(
        Gio.FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME,
        Gio.FileQueryInfoFlags.NONE,
        None )
for info in enum:
    # info: GFileInfo
    print info.get_display_name()

Python だと当然のように for in 文でイケるようだ。
seed は JavaScript の仕様そのままなので面倒かも。
逆に enumerate_children 等は引数を全部指定する必要がある。
seed は引数が曖昧でいいところもやっぱり JavaScript なのね。

ついでに Gio もう一つ、海外。
GIO tutorial: Stream IO ? Johannes Sasongko’s blog

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

import os
from gi.repository import Gio

# set File Name
fn = os.path.expanduser("~/.gtk-bookmarks")
# Create GLocalFile
f = Gio.File.new_for_path(fn)
# load_contents
result, contents, length = f.load_contents(None)
if result:
    print contents

で .gtk-bookmarks 内容が print される。
PyGtk を PyGI に書き換えしたのだが引数も戻り値も微妙に違った。
とにかくファイルの一騎読み込みはこうすればいいみたい。

でも stream のほうは PyGI では上手く行かない。
何か手段があるのだろうけど今はまだ Gio 勉強中。

# おまけ

fedora 16 アップデート通知に Gedit があった。

やっとドラッグアンドドロップ編集で落ちるのを修正してくれた!
ついやってしまっていったい何度書いたコードを無駄にしたことか。