Vala and GtkBox

そういえば現行 Ubuntu にはデフォルトでは mono は入らない。
覚書ページを書き換えしないといけないですね。
ぶっちゃけ現在は C# なんてまったく使っていないので Python に導く感じで書いたつもりだが、現在なら Vala のほうがいいかなと。

Windows しか使えなかった小僧が Linux に来てプログラミングに興味をもつキッカケだけなら C# は最適だ、続ける奴は今すぐ死ねだが。
ということで Vala を少し。

環境は anjuta 入れれば勝手に揃う(手抜き
anjuta は使い方が解らないので無視(つかイラネ

Tutorial
Vala/Tutorial – GNOME Live!

C# との違い
Vala/ValaForCSharpProgrammers – GNOME Live!

C# が少し解るなら上記だけ見れば大体解る。
インタラクティブシェルは無いけど vala コマンドにソースファイルを渡せばコンパイルせずに実行できる。
valac ならコンパイル、あれ?以外と便利かも。
しかし stdout するにも GLib のお世話にならないといけない。

てか多様性ばかり強調して肝心なことが書いていないような。
最小限のコードは以下のようだ。

Vala

using GLib;

void main () {
    stdout.printf ("最小限\n");
}

C

#include <stdio.h>

main () {
    printf ("最小限\n");
}

C# と違い全部を class に入れる必要は無いし引数の args もオプション。
ただ C と違うのはエントリポイントの戻り値は必ず指定の必要あり。
WriteLine や Python の print ではないので \n を最後に書かないと改行しない。
まあ C と同じということですね。

そういえば vala の文字列ってどう考えても ascii ですよね?
mono(C#) は当然 UCS-2 で、ということは…

C#

using System;

class Foo {
    [STAThread]
    public static void Main(string[] args) {
        string homura = "ほむら";
        foreach (var s in homura) {
            Console.WriteLine(s);
        }
    }
}

Vala

using GLib;

int main (string[] args)
{
    string homura = "ほむら\n";
    stdout.printf(homura);
    //`string' does not have an `iterator' method
    //foreach (var s in homura) {}
    for (var i=0; i<3; i++) {
        stdout.printf ("%c\n", homura[i]);
    }
    return 0;
}

foreach できないし gchar 扱いなので添字だと 1byte 単位になる。
やっぱりこうなるよな、+= で合体できたりスライスも可能なのだけどバイト単位であるのを意識する必要があって C 言語で書くのと変わらない。

こんなことばかりやっても私らしくないからとっとと GTK+ を。
前回 Python3 で書いた奴と同じものを Vala で書いてみる。
ということでテキトに書いてコンパイルするとこんなエラーが。

マジで!

GtkVBox
GtkVBox has been deprecated. You can use GtkBox instead, which is a very quick and easy change.

本当だった、PyGI では何の警告も出ないのに。
代わりに GtkBox を使ってということか。
Gtk.Orientation.VERTICAL, Gtk.Orientation.HORIZONTAL
とスキマの数値を引数に作成すれば同じように使えるみたい。

gi ばかり使っていると気がつかない、C や Vala をたまにはやろう。

関数なんかは gi のバインディングと同じ書き方でいいみたい。
new で作成するので関数に new_ の部分がある所は全部消して。
シグナルのハンドラに引数を書くとエラーになるのは何故…
FileOutputStream 等が何故か GLib のメソッドになっている…

コンパイルで warning が出るけど問題なく動いたコード。

using Gtk;
using GLib;
 
public class Win : Window {
    private Entry entry;
    public Win () {
        this.set_title("たいとるばぁ");
        this.destroy.connect (Gtk.main_quit);
        entry = new Gtk.Entry();
        var button = new Gtk.Button.with_label("保存");
        button.clicked.connect(on_clicked);
        var vbox = new Gtk.Box(Orientation.VERTICAL, 0);
        vbox.pack_start(entry, false, false, 0);
        vbox.pack_start(button, false, false, 0);
        this.add(vbox);
        this.show_all();
    }
 
    private void on_clicked() {
        var f = File.new_for_path("gtk.txt");
        var fstream = f.replace(null, false, FileCreateFlags.NONE);
        var dstream = new DataOutputStream(fstream);
        dstream.put_string(entry.get_text());
        fstream.close();
    }
 
    public static int main (string[] args)
    {
        Gtk.init(ref args);
        new Win();
        Gtk.main();
        return 0;
    }
}
valac --pkg gtk+-3.0 t2.vala

まだよく解っていない、もうちょっとやってみる。
とにかく GTK3 で GtkVBox で書いていた部分は今後変更することにしよう。

Linux Python 3

そろそろ Python を 3 に移行しようと思う。
はて、日本語はどうなるのだろう?
Linux ではまったく使っていなかったから解らない。

Gio Tips – L’Isola di Niente

多分組み込みの open() 関数はツジツマを合わせていると思う。
GIO での読み書きはどうなるやら、実験。

# Write and Length Check
s = '日本語'
f = open('test.txt', 'w')
f.write('{0}\n{1}'.format(len(s), s))
f.close()

# g_file_load_contents
from gi.repository import Gio
gfile = Gio.File.new_for_path('test.txt')
res = gfile.load_contents(None)
print(res)

# Streaming I/O
fstream = gfile.read(None)
dstream = Gio.DataInputStream.new(fstream)
print(dstream.read_line_utf8(None))
print(dstream.read_line_utf8(None))
fstream.close(None)

うん、文字列はシッカリ gunichar(UCS-4) だね。
やはり組み込み関数は仕事キッチリか。

g_file_load_contents だと、、、バイナリ扱いになってしまった。
読み込んでも UTF-8 のままで保持するということみたい。
文字列の読み書きに利用するなということなのだろう。

Streaming I/O では文字列自体は UCS-4 化するみたいだけど文字列長は UTF-8 バイナリでカウントしている。
試しに dstream.read_Line(None) に書き換えたら予想通り文字列がバイナリに。
GFileOutputStream は UCS-4 の文字列を普通に UTF-8 として書き込みできた。

うーん、やはり文字列が UCS-4 だと扱い辛いぞ。

GTK+ の GtkEntry の文字列はどうなるんだろう?

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
 
from gi.repository import Gtk
 
class Win(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.set_title('たいとるばぁ')
        self.connect('delete-event', Gtk.main_quit)
        self.entry = Gtk.Entry()
        button = Gtk.Button('保存')
        button.connect('clicked', self.on_clicked)
        vbox = Gtk.VBox()
        vbox.pack_start(self.entry, False, False, 0)
        vbox.pack_start(button, False, False, 0)
        self.add(vbox)
        self.show_all()
 
    def on_clicked(self, widget, data=None):
        f = open('gtk.txt', 'w')
        f.write(self.entry.get_text())
        f.close()
 
if __name__ == '__main__':
    w = Win()
    Gtk.main()

タイトルバー等の文字列も GtkEntry とのやりとりも UCS-4 の内部文字列のままでイケてしまうようである。
GIO で文字列を扱う場合以外は Python2 時と同様に使えると思ってよさそう。
なんて思っていたら落とし穴がありそうだが…

もう少し検証したいけど Boxes 上の Ubuntu では辛い。
「クリップボードを共有」を ON にしているのに何故かホストと共有できなくて面倒くさいぞコノヤロウ。
Fedora に入れたいけどデフォルトで使えるコードというポリシーに反するし。
18 にはデフォルトで入るみたいだが β すらまだ出ていない。

ちなみに本サイトのメール送信フォームを利用して文字列のやりとりというバカなことをやっていたりする、サイトを作っておくと便利だよ。

Ubuntu 12.10 Programming

せっかく Ubuntu 12.10 を仮想で導入したのでプログラミング環境等をチェック。

やったぜ、mono という巨大なゴミがデフォルトで入らなくなった!
と思ったけど 12.04 から既に無かったのか、気がつきもしなかった。
もしかして valac が…あるわけないか。

なんと Python 3 がデフォルトで入るようだ。
LXDE に変更したから入ったのかもしれないけど。

Python 3 からは pygtk はやっぱり使えません。
その他 Python 2 で提供されていた静的バインディングも当然全滅。
gi による動的バインディングなら問題ない。
一応書くと Python 2 も PyGtk も当然あるよと。

gcc はあるけど g++ は無いのは以前と同じ。
Gjs も Seed も無い、Ubuntu は JavaScript に消極的か。

Fedora なんかは Python に依存する体制から脱却しようとしているみたいだけど結局戻りそうな予感。
今の Linux では GLib 等の動的バインドに対応できるなら言語なんて何でもいいんだけど Python は標準ライブラリが絶妙だからね。

GTK+ のバージョンは…あれ? Nautilus や Totem のバージョンが 3.4 だ。
Gedit と eog は 3.6 って何だこれ。
まあつまり GTK+ は 3.6 であるということか、何故アプリはバラバラ?
Ubuntu って最新環境を最速で提供が売りではなかったのかな。

おかげで Nautilus にメニューバーがあるけどw
Nautilus 3.6 はかなり大胆に変更されているし、アプリケーションメニューに対応できなかっただけかもしれない。
GNOME は今後このメニュー主体になるわけで、GNOME を捨てたくせに GNOME の成果物に依存している Ubuntu の今後はいかに。

Gnome Files (aka Nautilus) 3.6 (3.5.92) Preview | Worldwide Edition – YouTube

しかし LXDE の設定には「ルックアンドフィールの設定」なんてのがあるけど Ubuntu ではまったく適用されない。
GTK2 はクリアルックス固定だし GTK3 に至っては Windows95 みたいだ。

元の Ubuntu が GTK2 と GTK3 を同じ見た目にするために標準を無視して特殊なことをしているからだろうけどカッチョワルイ。
Lubuntu ならこの辺りをなんとかしているのだろうか。
仮想だからいいけどホスト OS でこの環境を使いたくないないな。

というか LXDE 自体が GTK2 であるわけで。
この環境で GTK3 アプリを作ろうと思う人はいないだろうな。

GTK3 に移行したい人は素直に GNOME 3 を使いましょうということでしょう。
良さげならホスト化しようと思ったけどやっぱり次も Fedora にしよう。

GNOME Boxes part 3

前回の続き。

Boxes が勝手に名づける名前が長くて面倒なので変更してみる。

まず libvirtd プロセスが起動していたら終了させる。

仮想イメージ本体は下記ディレクトリにある。
~/.local/share/gnome-boxes/images

設定は以下の XML ファイル。
~/.libvirt/quem

コレを Ubuntu1210, Ubuntu1210.xml とリネーム。

そして XML の <name>, <source file> セクションを書き換える。

SELinux を無効化(又か…)

Boxes を起動、リネームされていることを確認。
ちなみに LXDE に変更済み、3D の Unity 重すぎる。
$ sudo apt-get install lxde
と以前と同じコマンドだけで入るよ。

Ubuntu1210 を起動、成功すると Ubuntu1210.log が作成される。
もう解るよね、またしても SELinux context を restorecon コマンドで変更する必要がある。

Ubuntu を終了、Boxes 自体も終了、libvirtd を殺す。

restorecon コマンドを行って SELinux を戻す。
おしまい、面倒くさいよ。

Boxes 自体の設定は
~/.config/gnome-boxes/sources/QEMU Session
のようだ、見事に超シンプルな本体の設定しか無いけど。

しかし何故ファイル名にスペースを入れるかなぁ…
スペースがあると右クリックメニューから GEdit で開く等ができないんだが。

********************

それにしても。

LXDE だとメモリ使用量たったコレだけかよ。
ワンテンポ遅れる感もまったくなくなったし、Unity って何だろうな。
仮想で使って Linux 使いのフリしているだけの輩を皆殺しにでもしたいのだろうか、自殺行為だと思うけど。

とにかく Boxes は予想していたよりずっと使えるようだ。
後はマウスホイールさえなんとかなればなぁ。

GNOME Boxes part 2

前回の続き。

色々試してみた。
どうやら動作が遅かったのはスワップが起こっていただけのようだ。
Boxes が勝手にメモリ量を決めておいていきなりスワップとは泣ける。

  <memory unit='KiB'>1048576</memory>
  <currentMemory unit='KiB'>1048576</currentMemory>
  <vcpu>2</vcpu>

と XML でメモリ量を倍にしたらかなりストレスは減った。
やはりワンテンポ遅れる感はあるけど Unity が原因かも…

ついでに CPU を 2 つに指定したけどあまり意味が無かった。
4 コア中の 2 つを使うのではなく単にエミュレーションで 2 つあるように見せかけているだけみたい。
無限ループのコードをうっかり書いてしまった時の保険にはなるな。

XML の書き換えを反映するにはホストの Fedora を再起動。
何かのサービスを restart させればいいと思うけど解らなかったので強行手段。

それと一番困った SELinux のブロックは通知ブラウザーのトラブルシュートでアッサリ解決。

$ sudo restorecon -v "/home/sasakima-nao/.libvirt/qemu/log/Ubuntu Precise Pangolin LTS.log"

にて Enforcing のまま起動できた。

ついでに virt-manager というアプリを入れてみたけどまったく関係ないようだ。
GUI で設定を弄くれるアプリがあると思うのだが今は解らない。

仮想マシンの立ち上げはシングルクリックで良かった…

これで後は 1920×1080 にできないこと以外は問題無くなった。
ということで Ubuntu 12.10 は Boxes でいこうと思う。

Windows 8 も出たし安いしで入れてみたいなと思い電気屋に見に行った。
MS ゴシックのガタガタなフォントのままであるのを見て買う気分が一騎に失せた。
無償で使える Linux に劣るのフォントを何時まで使うのつもりだ…
これ Windows しか使えない人は気がつかないみたいね。

********************

とにかく 12.10 だ。

日本語 remix の ISO を落とす。
ISO のままだと余計に面倒くさいので素直に DVD-R を焼いてみた。

まず ISO を焼いた DVD-R を入れる、USB 接続の外部でもイケる。
というか内蔵の奴が壊れているのでミニノート用のを使っただけだが…

SELinux を無効化します sudo setenforce 0

Boxes を起動、「新規」「続行する(O)」とボタンを押す。

ISO を勝手に認識するので選ぶ。

するとフルスクリーンになってインストールが始まる。
解像度はディスプレイと一致しないので注意。
ウインドウ化したい場合は右上の右から二番目ボタンで。

終わったら DVD-R が出て…こなかった。
ボタンで DVD-R を出して virsh コマンドで強制終了させた。

virsh destroy "ubuntu-ja-12.10-desktop-i386.iso 2"

SELinux を元に戻すのを忘れないようにと。

どうせこのまま起動するとスワップが起こるので上記を行ってホストの再起動。
メモリがコッチは 512000kb になっていたので 1024000kb に指定と。
cdrom を取り出しても記憶してしまうようなのでセクションを消して。
sudo restorecon -v “/home/sasakima-nao/.libvirt/qemu/log/ubuntu-ja-12.10-desktop-i386.iso 2.log”

12.10 は Unity 2D が無くなったのか…
なんと 3D で仮想環境が立ち上がった、おかげで超激重!
ウインドウの立ち上げやメニューがスローモーション、駄目だ使えネェwww
立ち上げているだけで CPU ファンが超ウルセェwww

今は実験と確認用途だからいいのだが、LXDE にでも変えるか…
Unity を使ってほしいなら 2D を残せよ。

1024000kb でもスワップしているし、おまえは Vista カヨ!
1536000kb に変更してやっとスワップ地獄から開放された。

この工程で気がついたけど libvirtd プロセスを一旦殺せば XML の指定を反映できる。
Boxes を立ち上げれば自分で殺すまで残りつづけるようだ。

何故か 12.10 では 1920×1080 の指定があった。
ドライバーの違いかな、これならフルスクリーンでもイケるね。
何にせよ別途でドライバー等が不要な仮想環境は嬉しいね。

********************

/usr/lib/girepository-1.0
で ls してみる

Gst-1.0 は無かった…
ぶっちゃけコレの確認のためにだけ入れたんだが。