GraalVM macOS awt

GraalVM の macOS 版って全然ダメだ。

awt を使おうとしたら、ビルドはできるけど JVM で弾かれる。
/opt/X11/lib/libfreetype.6.dylib
が無いって言われましても。。。。。

/opt すら無いよ、筆者の 2018 Air には。
てゆーか X11 だったのカヨ!

Java Client Roadmap Updateによせて (前編) – AOEの日記

JavaFX 以外は使うなになったのかな?と思ったけど違うんだな。
Java8 とはいえ、いつの mac で JVM を開発しているんだろう?
Java11 なら問題ないかどうかは知らない。

それと js で TimerTask を使おうと思ったけど。
継承が使えるとは思っていなかったけど、Nashorn と同じ表記もできない。
いくら探しても手段が見つからない、何を試しても動かない。
そういう使い方をするためのものではない、って感じ。
そういう使い方をするために入れたのに。。。。。

もう GraalVM はヤメ!
同梱の Node.js はありがたく使わせてもらいます。

Shell: Get Distribution Name

Linuxのバージョンの確認方法 – Qiita
Linux OSの種類とバージョンの調べ方 – Qiita

あれ? /etc/os-release ならばどのディストリビューションにもあるのか。
ということはドットコマンドで取り込んで。

#!/bin/sh

# ディストリビューション名
. /etc/os-release; echo $PRETTY_NAME
#cat /etc/system-release では Fedora 等一部

$NAME なら簡易。

これでどのディストリビューションでもイケるはず。
でもドットコマンドってどのシェルでも使えるかどうかは知らない。
ダメだったら source に書き換えしてちょ。
ちなみに macOS には /etc/os-release は無いです。

覚書ページの作り替え作業が終わらないので小ネタでした。

Fedora 29 java and GraalVM java

Fedora 29 OpenJDK の java が 1.8 に差し変わっていた。

javac でコンパイルした class を java で実行できないっていう。
/usr/lib/jvm/java-11/bin/java
で実行すれば動きます。
何かのアプリの影響なのか仲の人のうっかりなのか?

実は mac に GraalVM rc14 を入れてみたのだけど。

1.8 なのね、shebang 実行できないジャン。
おまけに。

//#!/usr/bin/env js --jvm
// シバンがあると error (rc14)

const System  = Java.type('java.lang.System');
const BufferedReader = Java.type('java.io.BufferedReader');
const InputStreamReader = Java.type('java.io.InputStreamReader');
 
var console = System.console();
if (console == null) {
    let r = new BufferedReader(new InputStreamReader(System.in));
    let line = r.readLine();
    System.out.println(`${line} がパイプから渡されました`);
} else {
    let line = console.readLine('何か入力して Enter : ');
    System.out.println(`${line} が入力されました`);
}

js コマンドも shebang があるとエラーになる。
–no-shebang オプションがあるのにどういうことだってばよ。
なんか Java 関連がボロボロだな。

JavaScript 覚書ページの内容が古くなってきたので書き換え予定でありまして。
jjs を GraalVM js に書き換えするつもりだったけど、ヤル気なくした。

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 からコピーする手間が省ける。
需要があるかどうかは微妙。

Automator Clipboard

クイックアクションのネタもう一つ。
やってみたら上手くいったので。

macOS でフルパスが必要な時、Terminal.app にドロップしてからコピー。
が有名な方法だけど正直面倒臭い、クリップボードに一発でコピーしたい。
minipoli を作った作者だもん、もう誰も覚えていないだろうけど。

クリップボードを使ってみる ? Swiftをはじめよう!

macOS では NSPasteboard を使うようだ。
クイックアクションで簡単に作れそう。
NSRect を使わないなら JXA でイケるな、よし。

Automator 起動、クイックアクションを新規作成。
[指定された Finder 項目を取得] を配置
[JavaScript を実行] を配置

ObjC.import("Cocoa");
function run(argv) {
    let s = argv.join('\n');
    let clipboard = $.NSPasteboard.generalPasteboard;
    clipboard.clearContents;
    clipboard.setStringForType($(s), $.NSPasteboardTypeString);
}

ファイル名コピー.workflow

NSPasteboardItem は必要なかった。
後はフルパスを得たいファイルを選択してコンテキストメニューから

後はそのままテキストエディタ等に貼り付けできます。
join(‘ ‘) にすれば端末用の空白区切り、等に応用できます。

ちなみに GNOME(GTK+) 環境では同様な処理は不可能。
クリップボードは特殊なバッファではなく単なるポインタだから。
コピー元アプリを終了させるとバッファを保持できなくてペースト不可になる。
Gedit と gnome-terminal で試してみるとすぐ解ると思う。
Linux ではフルパスを使うことは皆無に近いから別にいいんだけど。