Fedora 26 Upgrade

Fedora 26 への更新通知が来ました。
ぶっちゃけ筆者は最新の GTK+/Clutter が使えればいいのであって。
むしろ検証に時間を掛ける Fedora は不向きだと本気で思っていたりする。
でも十年後も残っていそうなトコって Fedora, SUSE, Slackware しかないし。

前回は RPM Fusion 絡みで上手くいかなかったので現時点での構成でも。
UnitedRPMs リポシトリと
Google Chrome リポシトリのみ追加
GNOME 自体の設定は全部デフォルト、サルブンツのアレ等と違ってデフォルトでも快適。
って、あんまり参考にならないと思うけど。

今回は普通に gnome-softwere からイケるようだ、ヤッタぜ。
ボタンは [ダウンロード(D)] のほうをクリック。

ダウンロードが終わると [インストール(I)] ボタンが出る。
押してルートパスワードを入力すると再起動。

通常のアップデートとほぼ変わらない感じで進んでいく、筆者の環境で約十分。
自動再起動の後で普通にログインすると Fedora 26 になっていた。
あっけなさすぎて唖然、もちろんイイ意味で。
macOS や iOS 更新に掛かる時間は何なんだ!

UnitedRPMs で入れた GStreamer codec も更新されている。
特にバックアップとかしなかったけどデフォルトアプリの変更等もそのまんま。
Apache の systemctl 指定や SELinux の変更点もそのまんま。

あれ? Gedit が 3.22 のままだ。
Wayland でログインすると Ctrl+F9 が使えないまんまだ、期待したのに。
eog は拡縮のパーセント表示が付いた、他のアプリは何が変わったかワカラン。
dconf-editor 3.23.4 ってこのバージョンは何よ。

GNOME 3.24 Release Notes

GNOME 関連は前回同様に日本語ページは無いようなので英語で確認。
ずっと使ってきた人はアイコンが変わったくらいしか感じないと思う。
GTK+ の大幅な変更は二年毎に変わったし GNOME アプリもメンテ程度っぽい。
よく見ると何故か翻訳されず放置されてきた部分がキッチリ日本語になっている。

ずっとクリーンインストールだったからかヤルこと無さすぎ、ツマラン(褒めてます)

ClutterGst Rotation

今時のスタンドアロンな動画プレイヤーには回転機能が必須だ。
なんたって回転編集していないスマホ動画を結構見かけるようになった。
昨年まではスマホ動画が主体になるなんて思いもしなかったのに。

ということで、ClutterGst で映像の回転を行う関数を探してみよう。

Clutter Gst 3.0.24 Reference Manual: Clutter Gst 3.0.24 Reference Manual

無いんカイ!

生 Gst を直で使うなら手段があった気がするんだがこれは困った。
いやまて、ClutterActor 自体を回転させればいいんでないの?
そのための OpenGL ES じゃないか、ということで実験コード。

#!/usr/bin/gjs

const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Clutter = imports.gi.Clutter;
const ClutterGst = imports.gi.ClutterGst;
const GtkClutter = imports.gi.GtkClutter;

ClutterGst.init(null);

// width:640 height:800
const PATH = "/home/sasakima-nao/movie/GF/動く苗ちゃん(1).mp4";

const RotateWindow = new Lang.Class({
    Name: 'RotateWindow',
    Extends: Gtk.ApplicationWindow,

    _init: function(app) {
        this.parent({
            application: app
        });
        // player
        this.player = new ClutterGst.Playback();
        this.player.set_filename(PATH);
        this.content = new ClutterGst.Content();
        this.content.set_player(this.player);
        this.actor = new Clutter.Actor();
        this.actor.set_content(this.content);
        // embed
        let embed = new GtkClutter.Embed();
        embed.get_stage().add_child(this.actor);
        this.add(embed);
        // size
        this.resize(450, 450);
        this.actor.set_width(320);
        this.actor.set_height(400);
        this.actor.set_position(65, 25);
        // rotation
        this.actor.set_pivot_point(0.5, 0.5);
        this.actor.set_rotation_angle(Clutter.RotateAxis.Z_AXIS, 90);
        //
        this.show_all();
        this.player.set_playing(true);
    }
});

let app = new Gtk.Application();
app.connect("activate", function() {
    new RotateWindow(app);
});
app.run(null);

ピボットポイントを中心にして Z 軸で回せば映像も普通に回転するね。
リサイズ時には 90/270 度の時に縦横の値を入れ替えるだけでイケそうだ。
もっと正しい手段があるかもだけど筆者はコレでいいや。

あぁやっと完全放置だった Y901x を更新するネタができたぞい。
だって Youtube でオッサンが田舎道をバイクで走っているだけのばかり見ていたし。
ドラマやアニメより個人制作な素人動画のほうが妙に面白いよね。

LOKDocView

本日の Fedora アップデートでこんなのが出た。

LOKDocView って何だ?

Development/Integrating LOKDocView and GNOME Documents – The Document Foundation Wiki

libreoffice 文書を GNOME Document で表示する API なのか。
ということは gir でバインドされているのかな。

普通にあったわ、コレって今まであったっけ?
まあそれはいいや、さてサンプルコードを探してみよう。

GitHub – pranavk/lokdocviewer: An application for testing LOKDocView

js/py 両方用意してくれているとは親切ですね。
しかし new メソッドの引数が PyGObject は 2 つで Gjs は 3 つ。
Gjs らしく new キーワードに書き換えるとコアダンプ。

#!/usr/bin/gjs

const Gtk = imports.gi.Gtk;
const LOKDocView = imports.gi.LOKDocView;
const Lang = imports.lang;

const LOKWindow = new Lang.Class({
    Name: 'LOKWindow',
    Extends: Gtk.ApplicationWindow,

    _init: function(app) {
        this.parent({
            application: app
        });
        // Segmentation fault
        //this.view = new LOKDocView.View();
        this.view = LOKDocView.View.new(null, null, null); // OK
        this.view.open_document(
            "/home/sasakima-nao/syokumu.odt",
            "{}",
            null,
            Lang.bind(this, function() {
                this.view.set_edit(true);
            }),
            null);
        let sw = new Gtk.ScrolledWindow();
        sw.add(this.view);
        this.add(sw);
        //
        this.show_all();
    }
});

let app = new Gtk.Application();
app.connect("activate", function() {
    new LOKWindow(app);
});
app.run(null);

前々回みたいな問題があるし…
GNOME はぶっちゃけ Gjs に全面移行したいのだろうけどまだ問題が多いなぁ。
てか Python はサードパーティなのに対応っぷりがスゲェ。
当面は Python と併用が続くのだろう。

コレを使って何か作るかな、ここんとこネタ切れなのは秘密だよ。

Koiking

久々に面白いスマホゲーム発見。
『はねろ!コイキング』公式サイト

どうせまた数日で飽きると思っていたけど続いている。
ただポケ GO みたく現在時刻も表示してほしいな、休憩時間にちょっと育成って時に困る。

検索したらガチな人が結構いてビックリ。
ポケ GO のおかげでキャラがある程度解る人が多いのが大きいのかも。
筆者はガンダム世代だしポケ GO が出なかったらポケモンなんて知らないまま。
ゲームはやはりキャラだよ、豪華声優はゲンナリするだけ。

Linux プログラミングに飽きてきたのでスマホアプリとか考えたけど…
ゲームって内容よりキャラが重要なんだよな、うーん。

ClutterImage PyGObject/Gjs

おまたせ、Comipoli Gjs 版が遅くて出せない原因が判明しました。

#!/usr/bin/env python3

import gi
gi.require_version('Clutter', '1.0')
gi.require_version('GdkPixbuf', '2.0')
from gi.repository import Clutter, Cogl, GdkPixbuf

Clutter.init()

PICTURE = "burgman400.jpg"

pixbuf = GdkPixbuf.Pixbuf.new_from_file(PICTURE)
image = Clutter.Image()
image.set_data(
    pixbuf.get_pixels(),
    Cogl.PixelFormat.RGB_888,
    pixbuf.get_width(),
    pixbuf.get_height(),
    pixbuf.get_rowstride()
)

#!/usr/bin/gjs

const Clutter = imports.gi.Clutter;
const Cogl = imports.gi.Cogl;
const GdkPixbuf = imports.gi.GdkPixbuf;

Clutter.init(null);

const PICTURE = "burgman400.jpg";

let pixbuf = GdkPixbuf.Pixbuf.new_from_file(PICTURE);
let image = new Clutter.Image();
image.set_data(
    pixbuf.get_pixels(),
    Cogl.PixelFormat.RGB_888,
    pixbuf.get_width(),
    pixbuf.get_height(),
    pixbuf.get_rowstride()
);

何ですかこの圧倒的なスピード差は!!!
というより Gjs のこの異様な遅さは何なんだ?
GdkPixbuf を使うだけなら特に差が無いのに。

憶測だけど PyGObject は get_pixels でバイナリ出力を直接使っていると思う。
Gjs は多分バイナリ出力を Uint8Array オブジェクトに変換している。
言語仕様の制限だろうからセット関数の追加が無いかぎりこのままだろうね。

ClutterImage に画像セットはコレしか手段が無い、これは困った。
Gjs でいくなら ClutterCnavas で cairo という手しか無いっぽい。
でもそれなら GtkDrawinArea でいいじゃん、ということになり…

結論、Clutter で画像を使うのに Gjs は絶望的に向いていません。