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

Dinamic Import: Gjs and JXA

現在の JavaScript はダイナミックインポートが可能。
下記ページで Chrome や Safari で動くと解りますね。

全モダンブラウザで使えるJavaScriptのdynamic import(動的読み込み) – Qiita

GNOME の Gjs は imports 関数があるので関係ないんだけど。
そういえば macOS の JXA はファイル分割ができないのが困る。
コレを利用してクラス毎に分割できるかな。

#!/usr/bin/osascript

import('./sub.js')
	.then((module) => {
        console.log('Start!');
		const sub = new module.Sub();
        sub.subMethod();
	});

main.js

export class Sub {
    subMethod() {
        console.log('this is Sub Class Method');
    }
}

sub.js

osa

なんでだよ!
Promise だと認識はしているけど動作しないってことみたい。
JavaScriptCore が全部やってくれるってわけじゃないんかい。

Gjs でも同じかな?
console.log を print に書き換えて実験。

#!/usr/bin/gjs

import('./sub.js')
	.then((module) => {
		const sub = new module.Sub();
        sub.subMethod(); 
	});

main.js

export class Sub {
    constructor(app) {
        print('Hello');
    }
    subMethod() {
        print("this is Sub Class Method");
    }
}

gjs

動いたのでコンストラクタも入れてみた、普通に Class ですね。
いや Gjs は imports を使ったほうが簡単ですけど。
というか、Apple は内製スクリプトには本当にヤル気が無いなって。

rar

Fedora Tips を更新しました。
Fedora Tips – Paepoi

内容はあまり変わっていないけど表記が GNOME3 のままじゃなって。
ついでに公開鍵認証とかを追記して公開っと。

写真もいいけど他の古くなった Tips を書き換えや追記をしなきゃ。
ネタは一応色々あるんだけど。
たとえば現行 Fedora はデフォルトで RAR アーカイブを展開できるけど。

#!/usr/bin/env python3

import gi
gi.require_version('GnomeAutoar', '0.1')
from gi.repository import GnomeAutoar, Gio

RAR_FILE = '[もっとGF] 桃子の遠足!.cbr'

src = Gio.File.new_for_path(RAR_FILE)
outfile = Gio.File.new_for_path('output_dir')

ar = GnomeAutoar.Extractor(
    source_file=src,
    output_file=outfile)

ar.start(None)

できるのよ、cbr の拡張子のままでも。
でも圧縮が上手くいかないってオチがある。

gnome-autoar | Paepoi Blog

しかもコレ標準出力に投げることができない、ファイル化のみ。
我が Comipoli に使おうとかなと思ったけど無理っぽい。

そんな感じで色々中途半端で止まっている。
止まったまま Clutter 等が開発終了してしまったり筆者が忘れ去ったり。
覚書の細かいファイルばかりが溜まっていく、整理しなきゃ。

mpv: rotate

mpv をスクリプトで拡張をまとめてページを作ろうとして、欲が出た。
動画の回転を Eye of GNOME や Totem に合わせたい。
具体的には Ctrl+R で 90° ずつ時計回り、Shift 追加で逆回り。

今まで Ctrl+E を逆回りに割り当てていたけど、やはりおかしい。
それに割り当てする値は 0-359 以内にしないとエラーになる。
input.conf ではどうにもならない、Lua スクリプトを書く。

-- ~/.config/mpv/scripts/mpv_rotate.lua

-- input.conf に 'Ctrl+r add video-rotate 90' でもいいけど
-- 0-359 以内にしないとエラーなのとキーを Eye of GNOME に合わせたかったので

function on_rotate_right()
    angle = mp.get_property('options/video-rotate')
    num = tonumber(angle) + 90
    if num > 270 then
        num = 0
    end
    mp.osd_message('angle:'..tostring(num)..'°')
    mp.set_property_number('options/video-rotate', num)
end

function on_rotate_left()
    angle = mp.get_property('options/video-rotate')
    num = tonumber(angle) - 90
    if num < 0 then
        num = 270
    end
    mp.osd_message('angle:'..tostring(num)..'°')
    mp.set_property_number('options/video-rotate', num)
end

mp.add_key_binding('Ctrl+r', 'rotate_right', on_rotate_right)
mp.add_key_binding('Ctrl+Shift+r', 'rotate_left', on_rotate_left)

osd も入れて。

よし問題なく動くぞ。
macOS な人は逆回転を command+L にすれば Preview.app と同じになる。

ついでに、time-pos プロパティをゼロにすれば先頭に巻き戻しできるけど。
最後まで再生してポーズ状態からだとポーズのまま、即再生させたいのよ筆者は。

-- ~/.config/mpv/scripts/mpv_go_home.lua

-- Home キーで先頭に巻き戻して再生する
-- 最後まで再生しポーズ状態になっていても即再生できるように

function on_go_home()
    mp.set_property_number('time-pos', 0)
    if mp.get_property_bool('pause') then
        mp.set_property_bool('pause', false)
    end
end
mp.add_key_binding('Home', 'go_home_func', on_go_home)

できた。

いやいや input.conf がスッカラカンに。
自分で拡張できるアプリって面白いよね。

PHP8: match switch

そういえば PHP8 について調べなきゃ。
と書いて一ヶ月もたっていたわい。

【PHP8.0】PHP8.0の新機能 – Qiita

変更というよりひたすら機能強化みたい。
筆者に関係ありそうなのは match くらいしかないな。
str_starts_with や str_contains は正規表現でいいし。

#!/usr/bin/env php

<?php

$text = "最初含む最後";

if (preg_match('/含む/', $text)) echo "@含む@";
if (preg_match('/^最初/', $text)) echo "@最初@";
if (preg_match('/最後$/', $text)) echo "@最後@".PHP_EOL;;

//=> @含む@@最初@@最後@

?>

ね。

match は Python 3.10 にも追加されたし流行なのだろうか。
Python と同じ感じなのか試してみよう。

#!/usr/bin/env php

<?php

function switch_func($num) {
    switch($num) {
        case 1:
            echo 'one;';
            //break;
        case 1:
            echo 'once again;';
            //break;
        default:
            echo 'default;';
    }
}

function match_func($num) {
    $s = match($num) {
        1 => 'one;',
        1 => 'once again;',
        default => 'default;'
    };
    echo $s;
}

switch_func(1);
echo PHP_EOL;;
match_func(1);

/* output
one;once again;default;
one;
*/

?>

全然違った。

PHP の match は値を返す式で最後にセミコロン必須。
switch とはそもそもの書式が違うので混同するはずがない。
break が不要なのとマッチしなかった場合の処理があるのは Python と同じ。

match 式内で echo とかはできない、戻り値が必要な場面に限定される。
けれどそういう場合 if や switch より圧倒的に短いコードになるね。
Python の match もこんな感じにすれば良かったのに。

GTK4: TextView

Fedora 36 には adwaita-1-demo が最初から入っていると以前書いた。
GTK Demo(gtk4-demo) は gnome-softwere から入手できるので入れてみる。

demo

なんか勝手に 4 ヶも入ってしまったけどまあいい。
こっちはソースが直接見られるので解りやすいですね。

demo

TextView は文字列中に Widget を入れることができるのか。
よし PyGObject でやってみよう。

#!/usr/bin/env python3

import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk

class Win(Gtk.ApplicationWindow):
    '''
        GTK4: TextView in Button
    '''
    def __init__(self, a):
        Gtk.ApplicationWindow.__init__(self, application=a)
        # Button
        button = Gtk.Button(label='Button')
        button.connect('clicked', self.on_button_clicked)
        # TextView
        self.view = Gtk.TextView()
        buf = self.view.get_buffer()
        it = buf.get_start_iter()
        buf.insert(it, 'This')
        anchor = buf.create_child_anchor(it)
        self.view.add_child_at_anchor(button, anchor)
        buf.insert(it, 'click!')
        # pack
        sw = Gtk.ScrolledWindow()
        sw.set_child(self.view)
        self.set_child(sw)
        self.set_default_size(400, 300)

    def on_button_clicked(self, button):
        with open(__file__) as f:
            s = f.read()
            self.view.props.buffer.set_text(s)

def app_activate(a):
    w = Win(a)
    w.present()

app = Gtk.Application()
app.connect('activate', app_activate)
app.run()

demo

マジでできた、必要性は疑問だけど。
他 tag の利用方法なんかもコレで解るね。
GTK4 はこんな感じで勉強すればいいと思います。

ところで SVG エディタなんだけど。
Vectornator という Mac のアプリを使うことにしました。
M1 Mac なのに Raw 現像専用じゃもったいない。