Gtk Next/Prev Dialog

Fedora を 32 (GNOME 3.36) にして一ヶ月たった。
今更気が付いたんだけーが GtkMessageDialog のバグが直っている。

GNOME 3.34 modal dialog bug | Paepoi Blog

この時に拙作 Comipoli は GtkInfoBar に変更した、そのまんまだ。
コレってフルスクリーンで cbz を見ていた時には解り辛いんだよね。
ダイアログのほうが視覚的に理解しやすいので元に戻すことにした。

戻すだけじゃつまらない、何か機能の追加か変更をしたい。
pixivコミックやニコニコ漫画のように「前の話」機能を追加することに。
って、GtkMessageDialog では YES/NO しか選択できないんだが。

ということで、GtkDialog を使って自作することにした。
Prev のショートカットはどうするか、Enter/Esc は勝手にやってくれるが。
ええい面倒だ、ニーモニックをそのまま描写しちゃえばいいや!

#!/usr/bin/env python3

from gi.repository import Gtk

class ComipolNextDialog(Gtk.Dialog):
    def __init__(self, text):
        Gtk.Dialog.__init__(self)
        self.set_resizable(False)
        # Buttons
        self.add_button('_Cancel (ESC)', Gtk.ResponseType.CLOSE)
        self.add_button('_Next (Enter)', Gtk.ResponseType.YES)
        self.add_button('_Prev (Alt+P)', Gtk.ResponseType.NO)
        self.set_default_response(Gtk.ResponseType.YES)
        # Message
        message = Gtk.Label(label=f'<span bgcolor="#CC0099">Next:</span> {text}', use_markup=True, visible=True)
        self.vbox.pack_start(message, False, False, 30)

こうなった。
YES/NO は最適なものが無いので簡易利用しただけ。
ボタン自体にショートカットが書いてある親切な仕様になってしまった。

んで呼び出し。
一つ前が存在しない時はボタンを無効にする必要があるなと。

dlg = ComipolNextDialog(html.escape(cbzs[next_index]))
dlg.set_transient_for(self)
if next_index < 2:
    dlg.set_response_sensitive(Gtk.ResponseType.NO, False)
res = dlg.run() 
if res == Gtk.ResponseType.YES:
    uri = GLib.filename_to_uri(GLib.build_filenamev([path, cbzs[next_index]]), None)
    self.set_uri(uri)
elif res == Gtk.ResponseType.NO:
    uri = GLib.filename_to_uri(GLib.build_filenamev([path, cbzs[next_index - 2]]), None)
    self.set_uri(uri)
dlg.destroy()

コレでイケた。
どんな感じに表示されるか。

dlg

うーん、GtkMessageDialog よりボタンの大きさが小さいなぁ。
勝手に等間隔にはなるけど長いファイル名だと右に寄ってしまうし。
アクションエリアにアクセスが非推奨ではどうにもできない。
タイトルバーも出るんだね、無しにしたいけど手段が解らない。
iPhone を考えるとあのスタイルが普通になるのよね今後は。

とはいえ動作は問題無しなのでコレでいこう。

bash Color 256

前々回、tree コマンドを Python で自作したんだけど。
「ディレクトリを青色にしたけど tree コマンドとなんか色が違う」
の本家 tree コマンドの色を出力したい。

bash:tip_colors_and_formatting – FLOZz’ MISC

こんなページを発見。
bash ってここまで高機能だったのか、マジで知らなかった!
というか \033 だけじゃなく \e とか \x18 でも良かったのか。
アンダーラインも点滅も反転も、256 色で色指定さえも思いのまま。

しかし文句の付けようがない完璧で解りやすいまとめだなぁ。
こんな有用なページを筆者も作りたい、それは別の話で。

とにかく 256 色に指定するには以下にすればいいのね。

echo -e "\e[38;5;numm***string***\e[0m"

色見本ではドレが tree コマンドの青なのかよくわからない。
自前でソレっぽいのをいくつか選んで出力して確かめてみよう。

#!/bin/bash

for cl in {31..33} {37..39} {73..75} ; do
	echo -e "\e[38;5;${cl}m_texts\e[0m"
done

sh_color

どうやら 33 で正解のようだ。

ところで下方に対応ターミナルの表がありますが。
macOS の Terminal.app でも printf にすればイケます。
おまけに指定は sh でも bash でも zsh でもオケ。

mac_sh

Fedora 32 AltGr

Fedora 32 を新規で入れて数日たった今頃になって気が付いたけど。

gsettings の
org.gnome.desktop.input-sources xkb-options

lv3:ralt_switch
という値が最初から入っていた。

これは非英語圏のヨーロッパで見かける右 Alt キー経由で特殊記号 (AltGr) の設定。
この仕組みが無いとブレースすら打てないから周辺国プログラマーは不便だと思う。
日本語キーボードや US 配列でコレだと右 Alt キーが動作しなくなるだけ。
とっとと消すか CapsLock を無効にする ctrl:nocaps に書き換えよう。

ところで、筆者が US 配列キーボードを使っている理由は。
RealForce を買う時に日本語配列のスペースキーが小さすぎて嫌だったから。

English Keyboard in japan (Fedora 16) | Paepoi Blog

Fedora 16 の時、つまり 8 年前に買ったのか。
一年に 2 回くらい全部バラして重層水で洗っていて新品みたいに使っている。
実はスゲェ安上りなのよね RealForce って。

東プレ R2TLS-USV-IV REALFORCE TKL S R2 英語 テンキーレス(87配列 静音):アイボリー 変荷重

筆者のは古い 86u で変荷重だから後継はコレかな、高くなったなぁ。
メニューキーが無くなって Super と Fn キーが増えた分 Space がちょっと小さく。
あと縦サイズが縮小されている、それより何より CapsLock のインジケーターがあるみたい。
86u の不満点はソレだけなので、壊れる様子は無いので 86u をまだ使うけど。

んで、長年 Fedora で US 配列を愛用していて良かった一番のこと。
US 配列の Mac との違いは Super と Alt の位置が逆なだけであること。
入力メソッド切り替えが Super+Space で全く同じというのがデカい。
おかげで併用していても全然迷うことが無いっていう。

JIS 配列の Mac って何故あんな変態配列なんでしょう?
気に入っている人には悪いけど Linux と併用するなら US 配列一択。

macOS tree command

前回 CommandLineTools 以下に「SDK 丸ごと落とされる」と書いた。
情報として何という名のファイルが「ドコにドンダケ」ってほど入ってしまうのかを公開したい。
tree というまさしくソレ用みたいなコマンドがある。

あぁ、このコマンドって使い道があったんだなぁって思った筆者であった。
けれど macOS には tree コマンドが入っていなかった。

Fedora なら使えるのでリモート接続してリダイレクトしようかなと。
てなわけで、sftp でリモート接続した Fedora から tree コマンドを打ってみた。
けど、何時間たっても処理が戻ってこなくて諦めた。
こんなに遅いはずがない、サンドボックスかな?

普通に「macos tree コマンド」と検索するとションボリ。
何故みんなコンパイラを手に入れたのにインストールしかしないの?
brew 使う人って(以下略
てか Catarina 以降だと Gatekeeper にブロックされると思うんだけーが。

Catalina時代の「GateKeeper」と付き合う方法 – 新・OS X ハッキング!(257) | マイナビニュース

spctl は Windows でいうウイルス対策アプリを無効にする手段。
慎重に活用とかアホかと、その必要があるアプリは淘汰されるべき。

で。

実はそんなことをしなくても検疫機能を回避する方法がある。
自分でビルドすればいい、もしくは自分でスクリプトを書く。

tree コマンドが無い環境で tree コマンドを実現 – Qiita

シェルスクリプトだけでがんばった人がいた。
これでもいいけど、よし筆者は Python でがんばってみよう。
macOS で動かせるように標準モジュールだけを使う。

#!/usr/bin/env python3

'''
    tree command in Python 3.7
'''

import os, sys

all_dir_num = 0
all_file_num = 0

def flist(path):
    '''
        Exclude UNIX hidden files. and sorted.
    '''
    l = os.listdir(path)
    res = []
    for f in l:
        if f.startswith('.'): continue
        if f.endswith('~'): continue
        res.append(f)
    return sorted(res)

def tree(path, tab):
    files = flist(path)
    length = len(files)
    head = '├── '
    num = 1
    for f in files:
        if num == length:
            head = '└── '
        subdir = os.path.join(path, f)
        if os.path.isdir(subdir):
            if sys.stdout.isatty():
                # stdout
                print(f'{tab}{head}\033[34m{f}\033[0m')
            else:
                # Redirect
                print(f'{tab}{head}{f}')
            global all_dir_num
            all_dir_num += 1
            # Recursion
            tree(subdir, f'{tab}│   ')
        else:
            print(f'{tab}{head}{f}')
            global all_file_num
            all_file_num += 1
        num += 1

if __name__=='__main__':
    d = '.'
    if len(sys.argv) > 1:
        d = sys.argv[1]
        if d.startswith('~'):
            d = os.path.expanduser(d)
    print(d)
    tree(d, '')
    # footer
    print(f'\n{all_dir_num} directories, {all_file_num} file')

tree

stdout で色を付けるとリダイレクトでアララとなるから振り分けしてね。
os.listdir はカレントディレクトリならドットでいいのか、へー。

中身が一つだけの時に前の縦線を消すナイスな方法は思いつかなかった。
その中身がディレクトリで更に中身が一つだった場合等でチグハグになる。
それとディレクトリを青色にしたけど tree コマンドとなんか色が違う。
とはいえ完全に同じにする必要は無いんだしコレでいいかなと。

コレを mac で自分がパスを通した場所にコピーして。
tree という拡張子の無い名前を付け +x パーミッションを付けて。

tree /Library/Developer/CommandLineTools > cltool.txt

したものを置いておきます。
十七万五千行、17MB になってしまったので zip 圧縮した。
cltool.zip

python3 は先に自分で入れたものなのかコレに含まれているのかは解らない。
まあ微々たる差だ。
それより macOS だと場所によってはサンドボックスに引っ掛るのが困る。

macOS Command Line Tools

今回は Mac ネタ。
macOS にコンパイラを入れたいけど Catarina の Xcode は 8.1GB もある。
ちょっと C を使うだけにこんな巨大なモンを入れるなんてイヤだ!
と思っていたけどコマンドラインツールというものがあるらしい。

日本語ブログにはロクな情報が無いので下記を見て。
How to Install Command Line Tools in Mac OS X (Without Xcode)

個別には選択できないのね、てかヘッダやライブラリ類の情報が無いけど。
筆者はぶっちゃけ CLang と標準ヘッダと Cocoa SDK だけでいいんだけど。
C 等の標準ヘッダは当然入ると思うけど何故かどこにも情報が無い。

インストールサイズも Xcode からいくつ減ったみたいなのしか出てこない。
よし疑問点は自分で導入して調べてみよう、まず現状 SSD 状況の確認。

i001

異様に少ないかも、ほぼスクリプトというかテキストファイルばかりだもん。
筆者は大量なデジイチ画像や動画は全部 Fedora メインマシンに入れているので。
とっととリンク先コマンドでインストールしたら。

i002

19.22 – 18.28 = 0.94
約 1 GB ってことね、Linux を知っているとコレでもデカい。

open /Library/Developer/CommandLineTools/

とコマンドを打って何がインストールされたか調べる。

i003

Cocoa どころか Metal, WebKit 等のヘッダは上記に普通にあったわ。
てか SDK 丸ごとかよ、そりゃこんなサイズになるってばさ。
標準ヘッダは usr/includes 以下にある、Linux の /usr/includes と同じ。
C/C++ ヘッダは共通位置に、拡張子の無いものが C++ 用なので共存している。

ところで解っていると思うけど、新たにパスを通す必要は無い。
最初から /usr/bin にあるゾンビコマンドが該当コマンドを実行する。
Linux の pkg-config 相当は clang のオプションだけでまかなえる。

#include <stdio.h>

// clang -o c_out test.c

int main(void) {
    // C99 対応チェックをついでに
    for (int i=0; i<3; i++) {
        printf("%d\n", i);
    }
    return 0;
}

#import <Foundation/NSString.h>

// clang -o m_out test.m -framework Foundation

int main(void) {
    const char *cstr = "スズキ";
    NSString *nstr = @(cstr);
    NSLog(@"%@", nstr);
    return 0;
}

をやってみると普通にビルドできた。
clang は gcc と -o オプションが共通なのね。

xcode-select -h で見るとアンインストールオプションが無い。

sudo rm -r /Library/Developer/CommandLineTools

だけでいいと思う、削除しないけど。