Emoji

あれ?
Family: Man, Woman, Girl, Boy Emoji

あたりを Gedit にコピペして、更に gnome-terminal にコピペ。

全部違うwwwwwwwwwwwwwwwwwww
Gedit は解りやすいように Monospace フォントをデカく変更しているけどさ。

surrogate-pair | PaePoi

コレをこの記事用途で Gedit に下書きでコピペしたモンが何故かこんな感じに変わっていた。
Gedit 自体はまったくアップデートしていないので仕様だね。
あの記事を書いた時にはあのまんまコピペされたのにいつのまにかこんなことに。

アプリ側のフォント選択でこんな奇妙なことになるようです。
自前でヤルか OS にまかせるか Google さんの気紛れを先読みするか、それとも…

フォントってふぉんとに面倒臭いです(ソレが言いたかっただけ?

GNOME MPV

実は先週から Fedora 26 の GStreamer で動画が再生できなくなっている。
設定は何一つ弄っていないので何かのアップデートが原因だろう。
Linux ではよくあることなので修正をのんびりまっていた。

ぶっちゃけ動画なんて 2017 年現在はほぼ Web ブラウザ上でしか見なくなったし。
来週には Fedora 27 が出るし、多分…

そんなこんなで今日になってやっと気が付いた。
再生できないのは H.264 だけだ。
モーション JPEG 等の昔撮影したデジカメ動画なんかは再生できるじゃん。
今って Web から落とす動画もデジカメ動画も全部 H.264 なんだね。

H.264 ファイルなら Firefox や Google Chrome にドロップすれば再生できる。
いやそれじゃ等倍でしか再生できないしろくな機能が無い。

せっかくの機会だし他の再生ソフトでも使ってみよう。
使うアプリが完全に固定されてしまっている現状もどうかと思うし。
検索してみると今は mpv というのが人気みたいね。

早速 dnf で入れてみたけど、うーん…
Wayland では DnD できないしキーバインドも変だし etc…

メディア プレイヤーは “mpv” で決まり!:ULCAMTCVSMPS:So-netブログ

Ubuntu 屋って F11 でフルスクリーンにならないとかが気にならないのかな?
GNOME と macOS を併用している筆者は Ctrl+Q(command+Q) で終了しないアプリを試しただけでイラッとするんだが。
カスタマイズじゃないんだよ、デフォルトがそうでないとおかしいんだよ。
OS のデフォルトにカスタムして合わせるってそれ違うだろ!

そのてん Visual Studio Code なんかは見事だ。
Linux 版は F11 でフルスクリーンだし macOS 版はウインドウを閉じても終了しない。
アプリケーションの美学と筆者が勝手に思っていることを当然のようにやっている。
それなのに自社の OS では何故こういう統一感が無いも同然なのか?
…ってそれは別の話で。

そんなことよりオンスクリーンコントローラーが気に入らない。
常にシークバーは表示のほうがいい、Youtube みたいに。
で探したら gnome-mpv って mpv のフロントエンドがあるじゃん。

GNOME MPV

当然のように dnf で導入できる。
常にシークバーは表示されている。
Wayland でも問題無し、GTK3 だからあたりまえだけど。
Ctrl+Q, F11 も最初から使える、F9 でプレイリストも GNOME っぽい。
いらない機能満載だけど軽いからどうでもいいや。
おまけにプレイリストは右に出るwwwwwwwwwwwwwwwwwwwwwwwwwww

再生開始で動画サイズにリサイズされるのが今となってはウザい。
でもプレイリストでの切り替え時は固定される eog 式なのでゆるせる範囲。

これはイイ、もう筆者は作る必要が無いな。
でも nautilus でサムネイルできないのが痛い、そのうち直るのだろうか?

GTK+ Cancel Long Keypress

GTK+ にてキーの長押しを判別する手段を発見。
GTK+ はキーの長押しを認識できないようで | PaePoi
こんなことを書いて 8 年もたってしまった、遅すぎるぞ俺!

何かキーを長押しした状態で event.time の値を見ると同一だった。
つまり長押しは最初に押した時間のまま延々とイベントが飛んでくるようだ。
とっととサンプルコードを書いたほうが解りやすいということで。

#!/usr/bin/env python3

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

class CancelLongKeypressWindow(Gtk.Window):
    """
        Wayland Only
    """
    def __init__(self):
        Gtk.Window.__init__(self)
        self.connect("hide", Gtk.main_quit)
        self.connect("key-press-event", self.on_key_press_event)
        self.long_keypress = 0
        self.show()

    def on_key_press_event(self, widget, event):
        #
        # Cancel Long Keypress
        #
        if self.long_keypress == event.time:
            return False
        self.long_keypress = event.time
        #
        print("Press!")
        return False

CancelLongKeypressWindow()
Gtk.main()

これでうっかり長押ししてしまっても早送りみたいな状態を避けられる。
逆に長押しされているのを判別するということも可能、こんなに簡単だった。
Comipoli で使うのと 8 年前の記事に合わせるため Python にしました。
これで我が Comipoli で早送りされてしまうのを防げるぞと。

そういえばあの頃は Ubuntu を使っていたなぁ。
今度から GNOME に戻るんだっけ、良さげなら又使うかな?
って GNOME に Dock を付けるという余計なことを又してる、ヤメた。
筆者は MacBook Air でも Dock はまったく使わないんですけど。
第493回 Ubuntu 17.10の変更点:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社

追記
Wayland 環境だけのようです。
X.org でログインしたら同様にならなかった。

surrogate-pair

JavaScript における文字コードと「文字数」の数え方 | blog.jxck.io

そうだった、Python3 ばかり使っていたのでサロゲートペアのことを忘れていた。
GLib が扱う Unicode も Linux,macOS 版 Python3 の文字列も UCS-4 なんだよね。
Windows は捨てたので Windows 版 Python3 は知らん、ってどうでもいいか。

ES6 では for of を使って Python3 と同様な処理ができるようだ。
もちろん Node.js, JavaScriptCore も同様の結果でした。

UTF-16 はこの件があるし UTF-8 との変換も面倒だしetc…
何故いまだに Unicode の主流なんだろうね。
メモリ効率うんぬんならスクリプト言語や仮想マシンの時点で、って話だし。

おっと、一番下を見逃す所だった。

Family: Man, Woman, Girl, Boy Emoji

Emoji にはこんな文字をくっつけた一文字があったのか!
コピペしたら WordPress で投稿できないぞ、つかイッパイあるなぁ。

Emoji Version 2.0 List

Python3 でも駄目だ、バイナリを見れば当然だけど。
こんな文字まで考慮しなきゃいけない時代になってしまったのか。

JavaScript Arrow Function

前回 Gjs の ES6 がって書いたけど。
よく考えたら現在 JavaScriptCore や V8 も試せる環境じゃないか。
現状 (2017.10.10) ではどうなのか実験。

Gjs(SpiderMonkey) は 1.48.7
Node.js(V8) は dnf で入る v6.11.3
JavaScriptCore はワカラン、Fedora 26 の /usr/libexec/webkit2gtk-4.0/jsc
jjs(nashorn) は1.8.0_144、–language=es6 オプションで。

jsc は .bashrc にエイリアスを作って準備してと。
Node.js だけ console.log なのを無理矢理 print となるようにしてと。

とりあえず無名関数とアロー関数での this スコープの違い。

// @ Node.js
if (typeof print === "undefined")
    print = console.log; 

let obj = {
    func: function () {
        this.str = "優木苗";
 
        let funcA = function () {
            print(this.str);
        };
        let funcB = () => {
            print(this.str);
        };
        funcA();
        funcB();
    }
};
obj.func();

jjs はアロー関数に対応していなかった。
他は全部対応済なのね、ふむふむ。
Gjs はワーニングを出してくれる親切仕様、イラネーけど。

次は同一ブロックでの let 変数名の多重定義。

// @ Node.js
if (typeof print === "undefined")
    print = console.log; 

let n = 13;
let n = 99;
//n = 66;
print(n);

って、おい SpiderMonkey!
jjs ですらエラー判定するのに、まあ次は対応済と解っているけど。
それにしても Node.js のエラー表示はウゼェ。

次に class を作ってみよう、Gjs はまだ対応していないと解っているけど。

// @ Node.js
if (typeof print === "undefined")
    print = console.log; 

class Test {
    constructor(str) {
        print(str);
    }
}
let test = new Test("むったん");

だよね。
JavaScript の仕様策定は Mozilla がやっているはずなのにな。