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

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

Fedora 32 JavaScript

Fedora 32 は Gjs が ES2019 にフル対応した。
いや、フル対応した SpiderMonkey にアップデートというべきか。
JavaScriptの ES2019で追加された新機能まとめ – Qiita

更に BigInt にも対応、素晴らしい。
Python 屋としては Number の拡張はできなかったのかと言いたい所だけど。

bigint

プライベートフィールド等は駄目でした。
そんなことより Gjs の開発者はかなりがんばったようだ。

ClutterImage PyGObject/Gjs | Paepoi Blog

gjs_speedup

まさかの PyGObject より速くなるとは、誤差の範囲とはいえ。
何をやったか解らないけどコレで Gjs を諦める理由が減った。

Gjs: GdkPixbuf Memory leak | Paepoi Blog

この意味不明メモリリークもやっと起こらなくなった。
やはりメンテを続けていると良くなっていくんだよね。
ただこの実験は Python のガベージコレクションの凄さを思い知るだけだが。
メンテを続けた年期の差ってことで。

ところで JavaScript といえば。
/usr/libexec/webkit2gtk-4.0/jsc
が無くなった、Nautilus の検索機能でも見つからない。
けれど gir に JavaScriptCore-4.0.typelib は残っている。

#!/usr/bin/python

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

context = JavaScriptCore.Context()
out = context.evaluate('3 + "あ" + 4', -1)
print(out.to_string())

//=> '3あ4'

これは動く。

SpyderMonkey, V8 同様に実体が無くライブラリだけになったみたい。
実験にしか使っていなかったし mac も持っているから別にイイか。

Fedora 32 ssh

Fedora 32 は新規でインストールしました。
Nautilus の Bookmark は Fedora 31 から以下をコピーした。
~/.config/gtk-3.0

ソレを使い sakura への sftp アクセスを ssh アクセス前にしてしまった。
Fedora 31 の時はあらかじめ ssh でアクセスし、すると作成又は追記される
~/.ssh/known_hosts
に暗号が保存されていない場合は弾かれていたはずなんけど。

sftp_first

こんなダイアログが出て「とにかくログインする」ができてしまった。
こんなことまで自動でやってくれるようになったのか、GNOME スゲェ。
ちなみに公開鍵は作っていないけど作ったほうがいいかなと思った。

ところで、話は変わるけど。
ソフトウエアからインストールすると起動できなかったアプリの件。

flatpak

どうやら Flatpak のほうをインストールすると調子悪いみたいね。
dnf コマンドだとウムを言わさず rpm なので普通に起動できたってことみたい。

開発者、システム管理者向けの新規事項

こんなに押しておいてそれはないよ。
アプリを入れる時は rpm になっているかどうかをみたほうがいいよ。

ついでに、Gedit に新機能あった。
タブを中クリック(ホイールクリック)でタブを閉じるように。
Ctrl+W でいいじゃん!
てか Mac を併用していたら自然にそうなったし、Mac は command+W だけど。
知らなかったけど狐やチョロメもできるんだね、一生使わないと思う。

fstab Rewrite in GNOME

fstab を手書き編集して外部 HDD の自動マウント。
それは GNOME ではもう古い。
gnone-disks がほぼ全自動でやってくれる。

「ディスク」アプリを起動。
自動マウントしたい HDD を選択、ボリュームの所にあるキヤアイコンをクリック。
「マウントオプションを編集(M)」メニューを選択するとダイアログが出る。

fstab

一番上のスイッチを off にすると編集できるようになる。

マウントポイント(P) がディレクトリ名になるので hdd1 とかの短い名前に変更。
この時指定するディレクトリはあらかじめ作成しておく必要は無い。
識別名(D) は UUID あたりを選択しておこう。
それ以外はそのままでいい、拘りがある人だけオプション名が何なのか調べてね。
[OK] ボタンでパスワードを促されるので root パスワードを打ち込み。
これだけで /etc/fstab に追記を自動でやってくれるので再起動。

bookmark

起動すると普通にマウントされているけど「他の場所」の所にある。
一度表示したら Ctrl+D を押してブックマークに追加すれば快適アクセス。
ブックマークはドラッグして並べ替えできます。

もしかして自動マウントってディスクアプリでできるんでないの?
と思って起動したら見つけただけなんだけーが。
筆者も昨日までは SD カードのフォーマットくらいしか使ったことなかったよ。

それと、Macbook Air 2011 にも Fedora を再インストールしました。
前回と違っては WiFi ドライバーが最初からあったので超簡単だった。
てかキーボード光らせられるんだ、前からだったのかな?
MacBook Air 2011 に Fedora を入れて DualBoot – Paepoi