投稿者「sasakima-nao」のアーカイブ

Bash Default Parameter

こんなページを見ていたんですが。
macOSのターミナル(bash)のプロンプトを変えました。 – Qiita

${BASH-no} って所の no はデフォルト引数ってことじゃないの?
シェルスクリプトの覚書色々 – L’Isola di Niente
デフォルト引数ならば ${BASH:-no} と書く、と思っていたんだけど確認。

Parameter Substitution

:-, – のどっちでも良かったのね!
macOS の 3.2.57、Fedora の 4.4.23 にて確認しました。

しかし /etc/profile の中身は Fedora と随分違うな。

Fedora も最後はドットコマンドで /etc/bashrc を取り込んでいる。
こっちは [ -n “${BASH_VERSION-}” ] とやはりデフォルト引数を使っている。

でも宣言されていない変数なら空文字になるのでいらなくない?

[ -n "${BASH_VERSION}" ]

だけでいいような。

/etc/bashrc の存在確認が -r だったり -f だったり。
バージョンが新しい Fedora では && を一切使っていなかったり。
同じ bash でもこういうのはベンダー毎に作っているんだね。

ところで macOS が 10.14.2 にアップデート。
JXA で NSMakeRect は使えないままでした、しょんぼり。

jshell

すまぬ、Mojave には Ruby が入っていたのをさっき気が付いた。
ruby と打っても何も起きなかったんで、インタラクティブシェルは irb だったよ。
Python3, Gjs 共に引数無しでインタラクティブシェルなのでうっかり勘違い。
jxa は -i オプションなんだよね、統一してくれると助かるけど無理だろうな。

インタラクティブシェルといえば Java もできるようになったっけ。
[Java9 新機能] jshell入門 – Qiita
Fedora に入っている OpenJDK 11 でも使えるのかな?

使えるようだ、これも javac は多分必要なんだろうけど。
冗談のつもりで public を付けたら通った、何の公開メソッドだよw
更に static まで付けたら怒られた、当然か。
print も console.log も使えない、println 書くのメンドイぞ。

ところで終了は普通のシェル同様に Ctrl+D でできる。
macOS では control+D は使えないのか?
いや、Qiita の mac 使いは control+C でシェルを終了している輩が多々…
ちなみに Ctrl+C は無視される、Python も同じだけどね。

しかし今の Java で var が使えてスクリプト言語みたく使えてこんなことまで。
GraaLVM って必要性をあまり感じなくもないような。

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