MacBook AIr」カテゴリーアーカイブ

Catalina Scripts

zsh でプロンプトのカスタムは以前書いたのだけど。
zsh | PaePoi

~/.zshenv ではなく ~/.zshrc に書く必要があるみたい。
~/.zshenv では Mojave には無かった /etc/zshrc に上書きされてしまう。

PROMPT でもいいみたいだけど PS1 変数も使えるみたい。
RPROMPT も問題ないけど筆者は Fedora と共通にしたいので以下のようにした。
ブラケットが無いとコマンドの始まりがドコなのかワカンネーもん。

# ~/.zshrc @ User specific environment

PATH="$HOME/.local/bin:$HOME/bin:$PATH"
export PATH

# Fedora like Prompt for bash
#PS1='[\u@\h \W]\$ '
# zsh
PS1="[%n@%m %1~]%# "
#RPROMPT="[%~]"

# alias
alias ll="ls -l"
alias jxa="osascript -i -l JavaScript"
alias jsc=/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc

atom は .zshrc 等を色分けしてくれる、素敵!
スクショ間違っていたので 20 時修正。

それと。
前回クイックアクションで 72dpi 変換ができなかった理由が判明。
iPhone でお馴染み、サンドボックス機能のアクセス許可で弾かれているようだ。

Automator から「指定されたFinder項目を取得」にデスクトップの画像を一旦入れ実行。
アラートが出るので [OK] をクリック、これで Automator からはアクセス可能になる。
しかしそれをやっても「クイックアクション」からはアクセスできない、失敗作だろコレ。

クイックアクションは死にました、チーン♪
いや修正は入る、かな…

これじゃ不便なので拡張のほうに変換スクリプトを作り替え。
macOS アプリを JXA (AppleScript) で拡張

#!/usr/bin/osascript

// change72dpi.js

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

let selections = Application('Finder').selection();
for (let item of selections) {
    if (item.nameExtension() === 'png') {
        let fullPath = decodeURI(item.url()).slice(7);
        let pos = fullPath.lastIndexOf('/');
        let path = fullPath.substr(0, pos);
        let name = item.name();
        app.doShellScript(`cd '${path}'
        src_width=$(sips -g pixelWidth '${name}' | cut -s -d ':' -f 2 | cut -c 2-)
        width=$(($src_width / 2))
        sips -s dpiHeight 72.0 -s dpiWidth 72.0 -Z $width '${name}' --out '72dpi-${name}'`);
	}
};

デスクトップのスクリーンショットを選択し実行。
アクセス許可アラートで [OK] を選択すると下記に表示されるようになる。

許可ばかりでサンドボックスの意味ネェ。
そもそもこんな Mac の使い方をする人は少ないだろうけど。
とりあえず当面はこの方法で 72dpi 変換するとしよう。

zsh も bash と同じく $((formula)) 計算できるのね。
てかバッククォートを JXA で使うのでシェル部分で使えないのは難しかった。
NSRect が使えればもっと簡単な手段があるのになぁ。

ところで Python3 なんだが。

macOS 10.15 Catalina 19A583にはPython 2.7.16、Ruby 2.6.3p62、Perl 5.18.4が同梱されるも、Python 2.7の使用は非推奨で”python3″を推奨。 | AAPL Ch.

元々インストールしていたマシンならそのまま使える、ってことか。
ただ筆者は 3.7.4 に更新していたのに 3.7.3 に巻き戻されてしまった。
多分今後も勝手にそうされるだろうからこのままにするけどさ。

今日はここまで。

macOS 10.15 Catalina

macOS 10.15 Catalina を導入しました。
Macbook Air 2018 の Mojave からのアップグレードです。
さて、一番気になる所をチェック。

デフォルトシェルは初期状態では bash のまま。
ただし [zsh に自分で変更しろ] というメッセージが毎回出る。
.bashrc でカスタムしていた所は .zshenv に変換コピペ等の猶予がある。
一通り調べた後で筆者も zsh に変更します。

Python2 も実は残っている、同様なメッセージが出る。
でも Python3 ってあれ?

筆者は自分で Python3 を入れたけど、それは /usr/local/bin にある。
デフォルトで /usr/bin に入るようになったみたい、情報が無かったけど。
シンボリックリンク先は同じなので残しても問題ないけど local のは消すかな。

PyObjC は pip3 で自分で入れたのだけどコレも最初からあるのかいな?
他人の情報を待とう。

筆者自作の Comipoli はソースもビルド済みも問題なく動いた。
ただソースのまま起動するのが異様に遅くなったような気が。
macOS アプリケーション

何より気になる JXA での NSRect のバグ。

そのまんまヤン!
もう JXA はダメだ、GUI は PyObjC に完全移行しよう。

httpd.conf はやはりリセットされた。
変更点は特に無いようだ、とっとと元に戻す。
macOS httpd.conf | PaePoi
んで

sudo apachectl restart

そんなことより。
sips を使ったスクリーンショットの 72dpi 変換ができない!
macOS をクイックアクションで拡張 – L’Isola di Niente
シェル変更の影響か?

#!/usr/bin/env python3

# change72dpi *.png

import sys, os
from AppKit import *
from Quartz.CoreGraphics import *

args = sys.argv[1:]

for s in args:
    name = os.path.basename(s)
    src_image = NSImage.alloc().initWithContentsOfFile_(name)
    img = NSBitmapImageRep.imageRepWithData_(src_image.TIFFRepresentation()).CGImage()
    h = CGImageGetHeight(img) // 2
    w = CGImageGetWidth(img) // 2
    ctx = CGBitmapContextCreate(None, w, h, 8, 4 * w, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast)
    CGContextDrawImage(ctx, CGRectMake(0, 0, w, h), img)
    imgref = CGBitmapContextCreateImage(ctx)
    out_image = NSImage.alloc().initWithCGImage_size_(imgref, (w, h))
    bmp = NSBitmapImageRep.imageRepWithData_(out_image.TIFFRepresentation())
    data = bmp.representationUsingType_properties_(NSBitmapImageFileTypePNG, {})
    data.writeToFile_atomically_(f'72dpi-{name}', True)

以前書いた使い捨てスクリプトでなんとか 72dpi 変換した。
しかし端末でこんなの出ていたっけ?

とりあえず気がついたのはそんなところ。
相変わらず mac らしい使い方をしていないなぁ。

run shebang @ Visual Studio Code

本サイトのアクセス状況がなんか変。
ログのユーザーエージェントを見ると WWWC が、コイツが原因か。
Windows のネタなんてとうの昔に全削除しているのに意味不明、何故?

よし、今月は macOS のネタしかやらないことにする。
来月は Fedora 30 が出るはずだし、ということで。

とりあえず今朝までに blog でやったクイックアクション等はまとめた。
macOS Tips – L’Isola di Niente

次は VSCode を Gedit 化するページを作っているんだけーが。
実はまだ shebang 実行を実現していなかったりする。
Gedit でスクリプトを debug – L’Isola di Niente

tasks.json は Python3 では “command”: “python3” にしているだけ。
Visual Studio Code 2018 | PaePoi

シバンを見つけて実行する手段が無いのなら自分で作ればいいジャン!
head コマンドからシバン部分を抜き出すスクリプトを書いてしまえ。

#!/bin/sh

line=`head -n 1 $1`
${line#*!} $1

たった 2 行。。。

これに run_shebang と拡張子の無い名前を付けて保存。
実行パーミッションを付けパスの通った所に置く、tasks.json の書き換え。

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "run shebang",
            "type": "shell",
            "command": "run_shebang",
            "args": [
                "${file}"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "reveal": "always",
                "panel": "new"
            }
        }
    ]
}

command に run_shebang を指定。
タスクの実行をやってみる。

よしイケる、もっと早くこの方法に気が付けばよかった。
拡張又はフリーソフトをインストールwwwww
って、たった 2 行のスクリプトすら自分で書けない人のやることだ。

command+D

Mac の Terminal.app で Python3 のインタラクティブシェル等を使う。
終了させようとして、つい command+D を押して画面分割になってしまう。
をやってしまうのは筆者だけなのだろうか?

そのまま control+D を押し直ししてウインドウを閉じていた。
実はどうやって画面分割を元に戻すのか知らない。
よし、たまにはヘルプを見てみよう。

shift+command+D
それだけかよ、もっと早く見ればよかった。。。。。
しかし画面分割なんてどんな時に使うんだろう?

Ctrl+U で行頭まで削除
Ctrl+K で行末まで削除

これ gnome-terminal でも使えるジャン。
bash 自体の機能なのかな、検索してみよう。

bashショートカットキー備忘録 – Qiita

更にいっぱいあるみたい。
けれど行頭移動は Home もしくは option+← で充分みたいな。
筆者的には control+U,K 以外はどうでもいい。
たまにはヘルプを見るといい発見があるものだ。

mojave 10.14.4 の通知が来たので適用。
JXA NSRect のバグは予想通りそのままでした。

clip command (macOS)

前回ので思いついた。
コマンド出力をクリップボードに直接入れるコマンドがあったらいいな。
パイプで渡せば即コピー、変数を引数にするとそれをコピー。
JXA で簡単に作れそう。

#!/usr/bin/osascript -l JavaScript

ObjC.import("Cocoa");
ObjC.import("unistd");

function run(argv) {
    let clipboard = $.NSPasteboard.generalPasteboard;
    clipboard.clearContents;
    if ($.isatty(0)) {
        let s = argv.join('\n');
        clipboard.setStringForType($(s), $.NSPasteboardTypeString);
    } else {
        let fhi = $.NSFileHandle.fileHandleWithStandardInput;
        let data = fhi.availableData;
        let res = $.NSString.alloc.initWithDataEncoding(data, $.NSUTF8StringEncoding).js.trim();
        clipboard.setStringForType(res, $.NSPasteboardTypeString);
    }
}

clip.js

# macOS 使いなら知っているだろうけど一応
cp clip.js clip
chmod +x clip
mv ($PATH の中のどこか)

# 使い方
ls -l | clip
clip $SHELL

こんな感じ。

Terminal.app からコピーする手間が省ける。
需要があるかどうかは微妙。