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

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 ならそれでいいんだけどね。

enable_emoji_completion

Fedora 29 の GTK+ は 3.24 のままだ。
開発者、システム管理者向けの新規事項

だけど上記に書いてある(英語)とおりチョッピリ追加機能がある。
GtkEntry に enable-emoji-completion property が追加されたようだ。
早速試してみよう。

#!/usr/bin/gjs

imports.gi.versions.Gtk = "3.0";
const Gtk = imports.gi.Gtk;
Gtk.init(null);

let w = new Gtk.Window();
w.connect("delete-event", ()=>Gtk.main_quit());
let e = new Gtk.Entry();
e.enable_emoji_completion = true;
w.add(e);
w.show_all();
Gtk.main()

たとえば sushi の絵文字が使いたいな、ってなった時。
コロンの後に打ち込んでいくと

と出て来るので上下矢印キーかマウスで選択して流し込む。
最後まで打ち込んでコロンを打つでは無視されてしまうので注意。

ぶっちゃけコレ GtkTextView でもできないと意味がないような。。。。。
Gtk4 ではどうなるのかな。

ところで今回からこの手の投稿は GTK+ 等のライブラリ名タグに変更します。
gir はどんな言語でも同じだものね。
今迄 Python とか言語名で作ったページの変更をするかどうかは未定。

GraalVM Community Edition

JavaでJavaScriptを実行する「Nashorn」が非推奨に、ECMAScriptの速い進化に追いつけないと。代替案はGraalVM ? Publickey

今頃知った、覚書ページはどうしよう?
てか色々検索したけど GraalVM って何なのかよくワカラン。
とりあえず公式サイトのインストールページでも。

Getting started with GraalVM

js や node コマンドが含まれているみたい。
GNOME だと mozjs と被るヤン、モノホン node.js 入れていたら被るヤン!
使う時だけ先にパスが通るようにする必要があるな。

ダウンロードした tar.gz を展開、とりあえずホームに置く。
~/bin に以下を jjjs という仮の名前で置いて +x パーミッション。

#!/bin/sh

export PATH=~/graalvm-ce-1.0.0-rc6/bin:$PATH
[[ $# -eq 0 ]] && js --jvm || js --jvm $1

これで振り分けできる、print, console.log 両方使えてワロタ!
インポートは Nashorn と同じみたい、ES6 はどうなった?

const System  = Java.type("java.lang.System");
 
class GraalvmTest {
    constructor() {
        System.out.println("May I ask your name?");
        let console = System.console();
        let s = console.readLine();
        print(`Hello ${s} !`);
    }
}
new GraalvmTest();

カオス!

ES6 も完全に使えるようです。
Nashorn のもどかしさもないし結構面白いかも。
OpenJDK ベースだし次の Fedora には入っているのかな?