JXA」タグアーカイブ

Automator JXA and shell

サービスがいいMacBookにしておく – ザリガニが見ていた…。

Automator ってコンテキストメニューが作れるんだ!
この方法なら筆者が書いた Finder Script より簡単にシェルが使える。
macOS アプリを JXA (AppleScript) で拡張 – L’Isola di Niente
いや Nautilus スクリプトと同じように使えるというべきか。

では早速。
Mojave ではサービスではなく「クイックアクション」になっています。

リンク先ではテキストの選択だけど Finder での選択もイケそう。
「Finder 項目を表示」を挟む必要があるみたい。
早速同じ AppleScript を試すと、、、、、

あぁ、やはりパス名は古い mac 形式、いつものことだ。
しかしこの input は CR 改行区切りの文字列なのか配列なのか?
JXA でないと筆者は解らないので「JavaScript を実行」に置き換えて。

function run(input, parameters) {
	
	// Your script goes here
	let app = Application.currentApplication();
	app.includeStandardAdditions = true;
	//let s = input.toString().split('\r').join('\n');
	let s = input.join('\n');
	app.displayAlert(s);

	//return input;
}

うん、JXA だと input は JavaScript の配列になるようだ。
こっちだと UNIX パスになるな、何故かはワカンネ。
最後の return は次に続くチェーンが無いなら不要みたい。

んで、名前を付けて保存すると。

~/Library/Services/

以下に保存される、*.workfrow はディレクトリのようだ。
中にある info.plist の NSMenuItem キーからメニューを変名できる。

まて、よく見ると「シェルスクリプトを実行」のアクションがある。
AppleScript, JXA だけでなく直接 bash も使えるようで。
入力を「引数として」の選択肢もある、これならどうなる?

ところでカレントディレクトリは又してもルートなんだろうか。
と思って調べたら $HOME だった、どっちにしろ移動しなきゃ。
ファイル実行ではないので $0 では調べられない、と最初思ったけど。
ファイルを選択してコンテキストメニューなんだから $1 でいいヤン。

cd `dirname $1`
echo "$@" > out.txt

で保存して Finder で何か選択して実行。
選択したファイルがある位置に UNIX 形式パスが IFS 区切りでリダイレクトされるのが確認できるはず。
これでシェルを簡単に使えるようになるのでお好きなコマンドを。
JXA とチェーンを繋げればかなり高度な自動化ができそう。

JXA: File trash

現行の Fedora では

gio trash ファイル名

コマンドでゴミ箱にファイルを捨てることができる。
macOS でも jxa で同じことがしたい。

javascript – Send to Trash with JXA on Mac OS – Stack Overflow

あっさり見つかったけどこれ Finder.Item である必要があるヤン。
そうじゃなくて普通のコマンドとして使いたいんだよ。

[macOS] コマンドラインからゴミ箱へ削除するスクリプトを書きました – Qiita

同じことをやりたい人って結構いるみたい。
これを JXA に変換しようと思ったけどよく解らない。
Objective-c からの変換のほうが簡単って変な感じだお。

(旧) Cocoaの日々: NSWorkspace – recycleURLs:completionHandler:(ゴミ箱に捨てる/復活させる)

うん、こっちなら結構簡単に JXA 変換できそう。
と思って書いてみたけど完走しても動かなかった。

コマンドラインアプリケーションでのNSWorkspaceの利用 – XCode(4.6)でコ… – Yahoo!知恵袋

NSWorkspace は GUI でないといけないのかな。
多分ハンドラがあるので mainloop が必要なだけだと思うけど。
ならば NSApplication を使えばイケそうだ、やってみよう。

#!/usr/bin/osascript -l JavaScript

ObjC.import("Cocoa");

function run(argv) {
    let urls = [];
    for (path of argv) {
        urls.push($.NSURL.alloc.initFileURLWithPath($(path)));
    }
    $.NSWorkspace.sharedWorkspace.recycleURLsCompletionHandler($(urls), (newURLs, error)=> {
            console.log("done");
            $.NSApp.terminate(0);
        }
    );
    $.NSApplication.sharedApplication;
    $.NSApp.run;
}

trash

これを trash という拡張子の無いファイル名でパスの通った所に置いて。
拡張子を外すので -l オプションを忘れずに。

trash filename ...

ワイルドカードも使えるし日本語ファイル名もバッチリ(死語)だぜ!
こんな短いコードでできたお、変換だらけなのは JXA の宿命。

macOS httpd.conf

macOS Mojave で httpd.conf の設定。
現行は $HOME 以下にサイトを置いて PHP を使うだけなら三個所設定すればいいようだ。
PHP7 は最初から入っている。

ただ macOS は OS アップグレードで httpd.conf がリセットされてしまう。
Fedora はアップグレードしても内容を保持してくれるのに面倒臭い。
違いは PHP をデフォルトで有効にしているかだけみたい、PHP にもバージョンがあるし。

変更する箇所は決まっているので難しいことはないけど何度もやるのは面倒。
だったら書き換えスクリプトを JXA で作っておけば楽でね?
JavaScript なら replace でアッサリ書き換えできるのがいいよね。
前回のことがあるけど GUI を使わないなら問題なく動くようだ。

#!/usr/bin/osascript

// sudo osascript apache_setup.js

ObjC.import("Cocoa");

let nil = $();
let conf = $("/etc/apache2/httpd.conf");
let root = "/Users/sasakima-nao/www";
 
// Read
let s = $.NSString.alloc.initWithContentsOfFileEncodingError(conf, $.NSUTF8StringEncoding, nil).js;
s = s.replace(
    '#LoadModule php7_module libexec/apache2/libphp7.so',
    'LoadModule php7_module libexec/apache2/libphp7.so'
);
s = s.replace(
    'DocumentRoot "/Library/WebServer/Documents"',
    `DocumentRoot "${root}"`
);
s = s.replace(
    '<Directory "/Library/WebServer/Documents">',
    `<Directory "${root}">`
);
// Write
let res = $(s).writeToFileAtomicallyEncodingError(conf, true, $.NSUTF8StringEncoding, nil);
if (res) {
    console.log("Write Success!");
}

apache_setup.js

を実行して。

sudo apachectl restart
open http://localhost/

で動作確認できるのは知っているよね。
実は同じ LAN に繋がっているスマホやパソコンがあるなら更に。

http://コンピューター名.local

でアクセスできるよ。
もちろん ifconfig からローカル IP を得てアクセスでも同じ。
これでスマホでのサイト作り時の見栄え確認が簡単に。

ちなみに NetworkManager を使っている Linux でも同じだったりする。
Fedora の場合は firewall-config で http のポートを空けてね。

ところで NetworkManager のメンテをしているのは Redhat です。
例の買収時にネットの反応に驚いたよ、皆 GUI しか見ていないのかと。

JXA error: NSMakeRect in Mojave

我が comipoli.js が Mojave で起動できない理由が判明。

NSMakeRect よ、お前が原因か。
NSMakeSize は問題ないので書き方が変わったという訳では無いようだ。
検索するとあったわ。

Problems with Mojave? ? Issue #44 ? JXA-Cookbook/JXA-Cookbook ? GitHub

NSRect を関数で得た場合でもエラーというオマケ付きかよ。
こりゃどうにもならん、修正を待つしかない。

JXA: doShellScript Line feed code

macOS の JXA で
doShellScript(“ls -l”);
とやっても最終行しか得られない、と思っていました。

#!/usr/bin/osascript
 
let app = Application.currentApplication();
app.includeStandardAdditions = true;
let res = app.doShellScript("pwd");
console.log(res);

res = app.doShellScript("ls -l");
//console.log(res);
let output = res.split("\r").join("\n");
console.log(output);

これなら全部表示できる。
doShellScript が戻す文字列の改行コードは CR だったようだ。
古い mac のままな部分が色々あって面倒臭いや。
とにかくコレさえ解れば色々応用できそう。

追記
続き CRLF | Paepoi Blog

ところで iPhone XS 買いました、iPhone 7 からの機種変更。
13インチの廉価版MacBookが9月にやってくる!?
これを期待していたのに出ないんでヤケクソで。

au shop から家に帰って初期化して iCloud から復元を選択。
「他の iCloud デバイスに確認コードを送信しました」
と出たので慌てて Macbook Air を引っ張り出す。
コレって Mac や iPad を持っていない人だとどうなるんだろう?