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

uname

cat /etc/hostname

は macOS では使えないジャン!

えっと macOS でホスト名を得るには $HOSTNAME が使えるのか。
いや /proc/version とかも Linux だけだ、うーん。。。。。

カーネルのバージョンなどのシステム情報を調べるには

uname があった!
これなら Fedora, macOS のどちらでも同様だ。

シェルスクリプトの覚書色々 – L’Isola di Niente

ということで前回のデフォルト引数等を含めて書き換えました。
えらそうに Tips ページなんか作っていてまだ知らないこと多いな。

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 の宿命。

Fedora 29 OpenJDK

Fedora 29 では OpenJDK が 1.8 から 11 になった。
いきなり凄いバージョンアップだよなぁ、って違う!
IcedTea ベースの今までと違い Oracle のソースになったみたい。

Java 11正式版がリリース、本バージョンからOracle JDKのサポートは有償に。OpenJDKで無償の長期サポート提供は現時点で期待薄 ? Publickey

なんか色々あるようだけど。
RHEL の先行開発版である Fedora には RHEL 用のそのままが使われると思う。
サポート切れや脆弱性については後ろに RedHat がいるので何も問題ない。

それはいいとして。
jjs は 29 でも実行できるけどアップグレードされていないので es6 は使えない。
GraalVM は dnf list でも出てこない、うーん。

とりあえず Java 11 はコンパイルなしで実行できるらしいので試してみよう。

JEP 330: Launch Single-File Source-Code Programs

なんとシバンが使えるようだ。
つまり Java 言語のまま普通のスクリプトとして使える、よし早速。

#!/usr/bin/java --source 11
// -*- Mode: Java -*-

public class Hoge {
    public static void main(String[] args) {
        System.out.printf("%s\n", "ほげ");
    }
}

動いたけど…

結論、インタプリタ実行しているのではない。
メモリ上にコンパイルしてソレを実行しているだけのようだ。
つまり javac が必要、Fedora デフォルトには入っていない。

sudo dnf install java-11-openjdk-devel

それと、シバンを使う時は拡張子を取っ払う必要がある。
Gedit で色分けできないのでモードラインを使いましょう。

*.java 拡張子をつけたまま usr/bin/java に渡すこともできる。
この時はシバンがあるとエラーになる、なんかもどかしい。

ようするに拡張子が無い場合は一行目を無視する、って感じの単純な実装みたい。
macOS ならそれでいいんだけどね。