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

ClutterActor on the GtkWidget

今頃気が付いた、sushi は cbr/cbz を表示できる!

あ、sushi は nautilus で Space キーにてプレビューする拡張。
macOS のプレビューと同じものね、Fedora には最初から入っている。

でも巨大ファイルだと最初の表示が遅いなぁ。
CPU 全コアを使って展開しているけど全部読み込むまで表示されないっぽい。
マルチスレッドのほうがいいというわけではないのね。
Evince と同じなので多分 gir で Evince を使って…

そうか、gir で Evince を使えばいいのか!
読み込みの工夫で初回表示を早くできれば我がアプリに使えるかも。
sushi は Gjs だ、早速コードを見てみよう。

gedit /usr/share/sushi/js/viewers/evince.js

gtkclutter

うぅ、思ったより解析に時間が掛りそうだ。
いやまてよ、この下のほうのコードはまさか。
おまけで ClutterActor 上に GTK+ 部品を乗せる方法が解ったぞ。

#class ComipoliGoButton(Clutter.Actor):
class ComipoliGoButton(GtkClutter.Actor):
    def __init__(self, right):
        '''Clutter.Actor.__init__(self)
        if right:
            pixbuf = GdkPixbuf.Pixbuf.new_from_xpm_data(ICON_RIGHT)
        else:
            pixbuf = GdkPixbuf.Pixbuf.new_from_xpm_data(ICON_LEFT)
        image = Clutter.Image()
        image.set_data(
            pixbuf.get_pixels(),
            Cogl.PixelFormat.RGBA_8888,
            pixbuf.get_width(),
            pixbuf.get_height(),
            pixbuf.get_rowstride()
        )
        self.set_content(image)'''
        GtkClutter.Actor.__init__(self)
        if right:
            self.icon = Gtk.Button.new_from_icon_name("go-next-symbolic", Gtk.IconSize.MENU)
        else:
            self.icon = Gtk.Button.new_from_icon_name("go-previous-symbolic", Gtk.IconSize.MENU)
        #self.set_content(self.icon)
        self.props.contents = self.icon
        self.icon.show()
        #self.connect("enter-event", self.on_enter_event)
        #self.connect("leave-event", self.on_leave_event)
        #self.props.opacity = 0x00
        self.set_reactive(True)

うんうん。

gtkclutter2

ClutterActor 継承をヤメにして GtkClutterActor にする。
set_content だと例外になるけど property なら何故かセット可能。
上に GtkWidget があるせいで enter-event が動作しないので変える。
コレだけで普通に GtkWidget と相互の上下関係が作れる、やったね。

よし久々に comipoli の更新でもするか。
でも今日は「名駅周辺でポケボール集め」という大切な大切な用事が…
我が町でポケ GO をやっているとすぐ無くなっちゃうのは痛い。

JXA Rename

以前 JXA で Finder から選択項目を得られればどうにでもできる。
なんて書いたけどそのどうにかする方法を書いていない。
ということで選択ファイルを全部小文字にする手段でも。

Macでファイル名を小文字から大文字に一発で変換する ? 静岡県湖西市南台のECサイト制作会社

いや、これじゃカレントディレクトリ全部になっちゃう。
Terminal.app で開き直すのも面倒だし。

【Mac】Automatorを使って画像のファイル名を連番付きに変更する方法 | コトノバ

Automator にはこんなのがあるのか。
指定がごちゃごちゃして余計に面倒臭いと思うんですけど。

JXA で拡張ならこんなに簡単。

#!/usr/bin/osascript

let selections = Application("Finder").selection();
selections.forEach(function(item) {
    // Get Property
    let s = item.name();
    // Set Property
    item.name = s.toLowerCase();
});

後は小文字にしたいファイルを選択して。

lowercase

JXA のプロパティは括弧で getter、括弧無しなら setter になるようだ。
何か変だけどそういうもんだと思うしかない。
それとヘルプで r/o となっているところはリードオンリー。

finder_help

文字列変換は JavaScript そのまんま。
ただし alert, prompt とかは Application から作る。

Batch File Rename Script ? GitHub

cookbook はわざと難解に書いているとしか思えないのは気のせい?

shell

ブックマークの整理をしていて素晴らしいページを発見。
って、つまり一年以上前にブックマークして華麗に忘れていたんだけど。

スマートな紳士のためのシェルスクリプト – @IT

この人は経験値があって話が上手いな、真似したい。
筆者が自分のことを筆者と書いているのはそういう人達の真似だったり…
でも一番素敵と思ったのは (2) で駄目と書かれた

if type logger > /dev/null 2>&1; then
    LOGGER="logger -s -p user.notice -t dhclient"
else
    LOGGER=echo
fi

で。

いや、絶対パスに入っているかどうかはディストリビューション側の仕事で。
サードパーティ側はコマンドが使えるかどうか「だけ」が重要ですんで。

いやまて…
コレってインタラクティブシェルだとどうなる?
面白そうなので早速。

dev_null

インタラクティブシェルでもやはり何も出力されない。
>>> の PS2 変数さえ無視される、打ち込んだキー以外は完全破棄のようだ。
だけど exit() 等の関数は普通に通用されてしまう、面白い。
なので、gedit や gnome-terminal は問題なく起動できてしまう。

でも eog はどうやっても駄目、あぁなるほど。
eog って GNOME Project の中でもかなり特殊と感じていたのはコレか。
もの凄く優秀なアプリなんだけど GNOME の思想と何か違う、みたいな。
それが何かはまだ解らないけど、まあそれは別の話で。

あぁそういう手があったのか、みたいな。
mac でも当然使えるしシェルスクリプト覚書に追記しようかと。

Mac and Linux user-dir

Linux の sh でユーザーディレクトリのパスを得るのは簡単だ。
最近のバージョンであれば XDG 関連が最初から入っている(と思う)
詳しいことは man xdg-user-dir で。
たとえばドキュメントディレクトリなら

echo xdg-user-dir DOCUMENTS

「そんなコマンドネェよ」という人も大丈夫。
xdg-user-dir の中身は単純なシェルスクリプトなので自作も簡単。

#!/bin/sh

test -f ${XDG_CONFIG_HOME:-~/.config}/user-dirs.dirs && . ${XDG_CONFIG_HOME:-~/.config}/user-dirs.dirs
if [ "x$1" = "xDESKTOP" ]; then
  eval echo \${XDG_${1}_DIR:-$HOME/Desktop}
else
  eval echo \${XDG_${1}_DIR:-$HOME}
fi

何をやっているか理解できれば素敵。
デフォルト引数はこんな場合に使うのか、ふむふむ。

Mac では、困った user-dirs.dirs が無いぞ。
xdg-open には open_darwin() という関数があるのにな。

open_darwin

シェルから得る手段を探しているけど見つからない。
Mac って本当に sh ではたいしたことができないなぁ。
AppleScript か JXA を使いなさいということか。

って、だったら AppleScript を sh から使えばいいんでね?

#!/bin/sh

doc=`osascript -e "POSIX path of (path to documents folder)"`
echo Documents Path: $doc

おぉ!

user_dir

Mac や Linux ではやはり US キーボードでないと駄目だね。
バックコーテーションとチルダはシェルでよく使うから。
コレが日本語キーボードだと嫌がらせとしか思えない位置にある。

おまけ、Visual Studio Code で今頃知った。
command+shift+C でソース位置をカレントに terminal.app が開く。
拡張スクリプトを書こうとしたけど必要無かったYO!

JXA: Finder Get Select Item

JXA から Mac の Finder で現在選択しているファイル名を得たい。
そう、筆者が GNOME の Nautilus でやっていることを Mac で再現したい。

Nautilus をスクリプトで拡張 – L’Isola di Niente

環境変数には何も書き込まれないようだ。
sh ではお手上げだな、AppleScript か JXA しか選べない。

JXA で探しても見つからない、意外とみんな活用していないのかな?
まてよ、AppleScript で探せば歴史があるぶん見つかるんでない?

サンプルのページ

なんだ日本語で見つかるじゃん。
筆者は AppleScript の文法なんてド素人だけど雰囲気でなんとか。

tell application "Finder"
	set selectItems to selection
	set everyItems to every item of selectItems
	delete everyItems
end tell

Finder オブジェクトの selection プロパティが選択 Item の配列。
ということで合っているのかな、JXA でやってみる。
ゴミ箱に捨てても意味ないのでダイアログに ls 表示。

ls_dlg.scpt

let selections = Application("Finder").selection();
let ls = selections.length + " item\n";
selections.forEach(function(item) {
    ls += item.name() + "\n";
});

let app = Application.currentApplication();
app.includeStandardAdditions = true;
app.displayDialog(ls);

今回は scpt でやってみた。
コッチならシバン不要、実行パーミッションを後付けする必要は無い。
更にスクリプトメニューで拡張子が表示されない。

でも肝心な Script Editor.app が残念すぎる。
色分けが即時反映でない、shift+tab も option+↑ 等も使えない。
Gedit や Visual Studio Code に慣れているとイライラするだけ。
生 js で実行パーミッション + テキストエディタが楽でいい。

とにかく Finder で何か選択して実行してみる。

finder_selection

うん、selection オブジェクトは単なる Item 配列として扱えるみたい。
それが解れば後はどうにでもできる、やったね。

つか最近 MacBook Air ばかり使っているような。
マジで大型二輪のサブで 125cc スクーターを買ったみたいな。
一年もすりゃ楽なほうに使用程が逆転するもんだ。