月別アーカイブ: 2018年11月

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 を使えばイケそうだ、やってみよう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/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 を使わないなら問題なく動くようだ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/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 を関数で得た場合でもエラーというオマケ付きかよ。
こりゃどうにもならん、修正を待つしかない。

Old mac to New mac

さて、新 Macbook Air を使えるようにしなければ。
とりあえずデフォルト以外で必要なアプリをば。

Visual Studio Code (以下 vscode)
Google Chrome (以下 chrome)
KeepassXC

が最小限だな、Gedit さえ使えれば Fedora とまったく同じなのに。
ちなみに mac で動画は Youtube くらいしか見ない、音楽は聴かない。
ただ App Store にはドレも無いんですけど。
しかたがないので一つづつ公式サイトから落としていく。

vscode って今は app のまま配布しているのね。
しかしこのマシンはドラッグアンドドロップが凄くやり辛いぞ!
3D Touch のせいだけどドラッグする時は軽めにタッチ。

後は以下を旧マシンからコピーして設定は元通り。
~/Library/Application Support/Code/User
このマシンだと起動が超速いな、テキスト編集はもうこれ一つでいいや。

chrome は書くまでもなくログインで元通り。
今頃知ったけど macOS 版も F12 でデベロッパーツールなんだね。
safari の開発ツールはタッチのエミュができないのが痛い。

KeepassXC は Fedora から kdbx をコピーして元通り。
command+V を試しに押下してみると警告ダイアログが出たので

とやると、おぉ command+V が使えるじゃん!
これでパスワード管理も Fedora と同様に使えるようになった。

後は普通にカスタムだ。
US 配列キーボードなのにバックスラッシュが円記号になるのはなんか笑える。
これはキーボードの設定で変更できる、それ以外は好みだよね。
拡張もコピペしなければ。

macOS アプリを JXA (AppleScript) で拡張 – L’Isola di Niente
を使おうと又しても警告が。

なんかダイアログ出過ぎ、今までこんなにウザかったか?
Fedora 等と違って初心者も使うからなんだろうけどさ。
拡張スクリプトなんて初心者は手を出さないだろ。

ところで、macOS 新規には .bash_profile, .bashrc が無いんだね。
Mac(OSX)で.bashrcを編集する ? GitHub
前のマシンはあったような気がするけど、とにかく新規作成。
.bashrc には

# User specific environment
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
export PATH

# Fedora like Prompt
PS1='[\u@\h \W]\$ '

# alias
alias ll="ls -l"
alias jxa="osascript -i -l JavaScript"
alias jsc=/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc

こんな感じで落ち着いた。
osascript はファイルを渡すと js の拡張子で振り分けするので jxa コマンドはインタラクティブで使う時用のみ設定すれば良かった。

後は Apache の設定か。
アップデートでリセットされちゃうのをなんとかしなければ、後日。