JavaScript」タグアーカイブ

GNOME 3.38 Gjs

すっかり遅くなってしまったけど、GNOME 3.38 の変更点。
筆者に関係ありそうなのは Gjs だけだな。

開発者、システム管理者向けの新規事項

String.replaceAll() なんかはメソッド名で別るんだけーがさぁ。
?? と ?. オペレーターの追加、とあるけど説明無し、何だよコレ。
「 javascript nullish check 」で検索。

JavaScriptのOptional ChainingとNullish Coalescing Operatorでnullやundefinedと戦う

#!/usr/bin/gjs
 
//const p = console?.log ?? print;  // Error
const p = this.console?.log ?? print;
p("SUZUKIS Motorcycle is Cool!");

Gjs には console オブジェクトが無い、ということで単純にやってみた。
オブジェクトを直接 (undefined|null) かどうかは調べられないのね。
プロパティが (undefined|null) かどうかのチェックということね。
グローバルオブジェクトはルートの this から辿れる、いやこんな使い方普通はしない。

#!/usr/bin/gjs

if (typeof console === 'undefined')
    print('print');
else
    console.log('console');

undefined だけなら昔ながらの方法があるし、筆者も使っていた。
null かどうかも調べたい時に or 演算する手間が省けるようです。
というかコレ ES2020 の新規機能ってことみたい。

JavaScriptの次の仕様ES2020で追加されることが決定した新機能まとめ – ICS MEDIA

これ以外の ES2020 も使えるかテスト。
import 関数は使えない。
Promise はエラー、よくわからない。
matchAll は動く、Gjs では詳細は出力されないけど。
globalThis は Gjs では関係ない、てか this でよくね?
BigInt は GNOME 3.36 で既に対応していた。

ということで、今日の木曽川。

tsugumi

ツグミ、でかいスズメじゃないよ冬しかいないよ。

kogera

コゲラ、この可愛らしさでキツツキってのがまた。

enaga

エナガ、シジュウカラやメジロと混群していた。

今日はカメラを持った人を結構見た、巨大な白レンズも何人か。
けれど皆カモばかり撮っていた、小鳥も沢山いるのにもったいない。
てか爺さんばかり、なんか道の駅のバイク置き場カヨって感じ。
若い人も電車やコスプレばかりじゃなく小鳥も撮ろうよ。

Intl

Intl といえばもちろんスズキのイントルーダークラシックです。
ジャメリカン 400 の中では一番デカくてカッコイイよね。
ネクラはインテルくらいしかボケが思いつかないだろ、スズ菌でよかったぜ。
というボケは置いておいて。

Intl.ListFormat – JavaScript | MDN

listformat

Intl.ListFormat にはコンストラクタがありません、ってなんじゃそりゃ!

firefox

Firefox で F12 からコンソールならやはり普通に使える。
普段はまったく使っていないのが丸分かりなスクショなことは気にしない。
Gjs は同じ SpiderMonkey だけど同じ Intl を使っているんじゃないんだな。

PluralRules は ja-JP を指定すると全部 other になる、Firefox でも同じ。
Collator は日本語では無意味。
MDN では赤文字な RelativeTimeFormat にはバッチリ対応。
そんなこんなでなんとも中途半端なまとめになってしまった。

JavaScript Intl – Paepoi

これしか更新していないのに盆休みが終わってしまった。
まあいいか、この夏はカワセミに出会えたというだけでおいらは満足だ。
前回は直張りするのを忘れたね、同じのじゃツマランから別アングルのを。

Fedora 32 JavaScript

Fedora 32 は Gjs が ES2019 にフル対応した。
いや、フル対応した SpiderMonkey にアップデートというべきか。
JavaScriptの ES2019で追加された新機能まとめ – Qiita

更に BigInt にも対応、素晴らしい。
Python 屋としては Number の拡張はできなかったのかと言いたい所だけど。

bigint

プライベートフィールド等は駄目でした。
そんなことより Gjs の開発者はかなりがんばったようだ。

ClutterImage PyGObject/Gjs | Paepoi Blog

gjs_speedup

まさかの PyGObject より速くなるとは、誤差の範囲とはいえ。
何をやったか解らないけどコレで Gjs を諦める理由が減った。

Gjs: GdkPixbuf Memory leak | Paepoi Blog

この意味不明メモリリークもやっと起こらなくなった。
やはりメンテを続けていると良くなっていくんだよね。
ただこの実験は Python のガベージコレクションの凄さを思い知るだけだが。
メンテを続けた年期の差ってことで。

ところで JavaScript といえば。
/usr/libexec/webkit2gtk-4.0/jsc
が無くなった、Nautilus の検索機能でも見つからない。
けれど gir に JavaScriptCore-4.0.typelib は残っている。

#!/usr/bin/python

import gi
gi.require_version('JavaScriptCore', '4.0')
from gi.repository import JavaScriptCore

context = JavaScriptCore.Context()
out = context.evaluate('3 + "あ" + 4', -1)
print(out.to_string())

//=> '3あ4'

これは動く。

SpyderMonkey, V8 同様に実体が無くライブラリだけになったみたい。
実験にしか使っていなかったし mac も持っているから別にイイか。

CRLF

何を今頃だけど JavaScript の replace について。

String.prototype.replace() – JavaScript | MDN

第一引数を正規表現にすればすべてのマッチした箇所を置換できるのか。
最初に一致した箇所だけだとずっと勘違いしていた筆者であった。

JXA: doShellScript Line feed code | Paepoi Blog

これを試しに書き換えしてみよう。

#!/usr/bin/osascript

let app = Application.currentApplication();
app.includeStandardAdditions = true;

res = app.doShellScript('ls -l');
console.log(res.replace(/\r/g, '\n'));

いけた。

ついでに。
よく考えたらコマンドの中で tr を使って変換すりゃいいじゃん。
と思ってやってみたら上手くいかなかった。

#!/usr/bin/osascript

let app = Application.currentApplication();
app.includeStandardAdditions = true;

// no...
//res = app.doShellScript('ls -l | tr "\r" "\n"');

// test
res = app.doShellScript('ls -l | tr "\n" "|"');
console.log(res);

となる。

つまりコマンド実行の時点では改行コードは LF のまま。
doShellScript が値を戻す時に CR へ変換しているようです。
LF のまま戻すオプションって無いのかな?

lf

#!/usr/bin/osascript

let app = Application.currentApplication();
app.includeStandardAdditions = true;

res = app.doShellScript('ls -l', {alteringLineEndings:false});
console.log(res);

あった、今後はコレで。

ついでに、doShellScript は bash の POSIX 互換モードです。
zsh やフル状態の bash ではないので注意、macOS って本当に色々面倒臭い。
プログラミングするならやっぱり Linux だよ、某サル専用を除く。

関係ないけど Macbook Air 2020 が出たね、かなり良さげ。
でも筆者はこんな使い方ばかりだから 2018 モデルで何の不満も無いのよね。
ペチペチキーボードにもすっかり慣れてしまったし、うるさいけど。
さて 10.15.4 にアップデートするか。

JavaScript: padStart

String.prototype.padStart() – JavaScript | MDN

あれ?いつのまにこんなメソッドが追加されたんだろう。
これを使えば JavaScript でもゼロ詰めするだけの処理が不要になるぞと。

'7'.padStart(4, '0');

Fedora 30 で試して SpiderMonkey, JavascriptCore, V8 全部使えると確認。
V8 は node.js でとも思うんだがコレも IE, Android 同様バージョン関係がややこしい。
Apple の SandBox は「全部同梱を強要」という実は Unux と真逆の存在だったりするけど、なるほどって思う。
エロゲ専用に落ちぶれた OS はどうでもいい。

筆者が Fedora, macOS に絞ったのはこの二つのユーザーは確実に最新版を使うという理由もある。
LTS がある Ubuntu がサーバー用途で人気なのも当然、Desktop 版は今やサル専用、完全に宗教。
GNOME2 時代はコレし無いって感じだったのに道を間違えたよね、それはここでは関係なくて。

formatting – Pad a number with leading zeros in JavaScript – Stack Overflow

全部無駄になっちゃった。
でもこういうのを考えるのも経験値だとも。
とりあえず覚書ページに追記しとこう。