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

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 も持っているから別にイイか。

mp4 mov rotate

スマホ動画の回転情報を得て我が Y901x にて正しい回転表示をさせる。
と随分前に書いてずっとサボッていたけどいいかげんに本気出そうと思う。
検索ワードを mov バイナリ 回転 とか mov に決め打ちして探したら。

バイナリエディタで .mov を回転 ? マキシマ文庫

おぉ多分コレだ!
回転情報書き換えなら Mac の QuickTime だけで簡単にできるのは置いておいて。
そこのバイナリを取得すれば回転情報は得られるってことね。

バイナリ取得や書き換えなら C や Python 等で簡単にできるのに。
てか既に沢山ありそう、参考用に探してみよう。

GitHub – danielgtaylor/qtrotate: Tools for handling rotated Quicktime/MP4 files

ズバリをあっさり見つけた。
mdat や trac アトムも取得しているし他にもやることあるみたい。
mov の構造は下記に、ソースコメントのリンク先はもう古いので。

Movie Atoms

試すならサポート終了の Python2 コードなので Python3 に書き換えてね。
print に括弧を付加と割り算を二重スラッシュにするのは毎度のこととして。
atom 比較の所の文字列には全部 b を付けてバイナリ比較に変更するのを忘れずに。
よく解らない人用に筆者が書き換えしたものを一応置いておきます。

qtrotate_py3.zip

どうやら mov と mp4 は同じ回転情報を使うようで mp4 にも適用できる。
とりあえず筆者が iPhone で撮影したり編集した動画は回転情報が得られた。

qtrotate

書き換えも問題無く可能だった。
Nautilus のサムネイルには即時繁栄されないので一旦コピペ。
ただ手持ち mp4 の中には正しくない情報が出るものもあった。
ここらをもう少し調べて Y901x に適用し。。。。。

しまった、Y901x は Gjs で作っていたんだった!
JavaScript はバイナリ編集なんてできないぞ。
GLib を使っても多分 Uint8Array に変換されて劇遅になるだけだ。

ClutterImage PyGObject/Gjs | Paepoi Blog

本気で困った。
Comipoli 同様コイツも PyGObject に書き換えることになりそう。

Python3 socket

Python からの socket アクセス。
http だけなら urllib.request で充分なんですけど。
ssh 等の通信にも使えるようなので使い方は勉強しておこう。

#!/usr/bin/env python3

'''
    http:// version
'''

import socket

HOST = 'palepoli.skr.jp'
FILE = '/suzuki/katana.html'
PORT = 80 # http

output = []

#with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
with socket.socket() as sock:
    sock.connect((HOST, PORT))
    msg = f'GET {FILE} HTTP/1.1\r\nHost: {HOST}\r\nConnection: close\r\n\r\n'
    s.sendall(msg.encode('utf-8'))
    while True:
        res = ssock.recv(4096)
        if not res: break
        output.append(res.decode())

print(''.join(output))

よく見かけるコードを fstring で今っぽく。
AF_INET 等は python3.7 ではデフォルト引数で指定されているので不要。
コピペだけで動くようにファイルは筆者のこのサーバーに置いています。

でもコレでは https でアクセスできないことに気が付いた。
https のポートを調べると 443 番だ、そりゃ 80 番では弾かれる。
でもポートを変更しただけでは駄目、ssl モジュールを使う必要あり。

#!/usr/bin/env python3

'''
    https:// version
'''

import socket, ssl

HOST = 'palepoli.skr.jp'
FILE = '/suzuki/v-strom.html'
PORT = 443 # https

output = []

with socket.socket() as sock:
    context = ssl.SSLContext(ssl.PROTOCOL_TLS)
    with context.wrap_socket(sock, server_hostname=HOST) as ssock:
        ssock.connect((HOST, PORT))
        msg = f'GET {FILE} HTTP/1.1\r\nHost: {HOST}\r\nConnection: close\r\n\r\n'
        ssock.send(msg.encode('utf-8'))
        while True:
            res = ssock.recv(4096)
            if not res: break
            output.append(res.decode())

print(''.join(output))

できた。

ところで実は GNOME ならこんなことができる。

#!/usr/bin/env python3

'''
    GNOME only
'''
 
from gi.repository import Gio
 
f = Gio.file_new_for_uri("https://palepoli.skr.jp/suzuki/burgman.html")
ok, contents, etag_out = f.load_contents()
if ok:
    print(contents.decode());
else:
    print('File not Found')

Gio は Gvfs という仮想ファイルでアクセス可能な URI なら全部扱える。
GNOME 標準アプリは全部 Gio アクセスなので以下みたいなことも。

sasikae

sftp でアクセスしてリモート編集が可能だったりする。
解りやすいようにコマンドで書いたけど Nautilus から sftp でアクセスして W クリックすればコレと同じことになる。
自分でアプリを作る時も Gio を使うだけ、これが GNOME の魅力。
SNS くらいしか使っていないショボイ人だとこの魅力は解らないだろうな。

追記
2020.04.22 添付画像の差し替え。

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 にアップデートするか。

echo hyphen

ポータブルな echo 代替、reverb コマンド – 拡張 POSIX シェルスクリプト Advent Calendar 2013 – ダメ出し Blog

そうか、echo はオプションとまったく同じ文字列を出力できなかったのか。
でもそんなの — を使えばいいんでね?

先頭にハイフンが付くファイルを削除できない – ITmedia エンタープライズ

echo

だめジャン、これ echo には通用しないのか。
先頭にハイフンがあるだけなら普通に表示できるし関係なかったか。
でも何か手段が他にあるはず、と思って探してみた。

Bashで文字列をエスケープをする – Qiita

printf %q “$value”
こんな手段があるとは。

printf

イケた、オプションと同じ文字列は case 文で振り分けすれば使えそう。
って zsh だと \n を入れなくても強制改行してしまうんだね。
そんなことより gnome-terminal で zsh を使うと Home/End キーでカーソル移動ができないことのほうが気になるぞ!
こんな所でも bash と zsh の違いがあるのがなんとも。