(-> % read write unlearn)

My writings on this area are my own delusion

Netlify CMS のマークダウンエディタの日本語入力がバグってるので雑に対応する

先に結論まとめ

public/admin/index.html

    <script src="https://unpkg.com/netlify-cms@^2.0.0/dist/netlify-cms.js"></script>
    <!-- 以下を追加 -->
    <script>
      const schema = { properties: { sanitize_preview: { type: 'boolean' } } }
      CMS.registerWidget('md', CMS.getWidget("text").control, CMS.getWidget("markdown").preview, schema);
    </script>

Netlify とは

静的サイトホスティングSaaS/PaaS 。サービス名であり会社名。 Vercel や Firebase (Firebase Hosting) などと近い。

Netlify CMSとは

Netlify 社がメインでメンテする OSS の Headless CMS 。 Headless CMS のなかでも Git Based というタイプで、その他の大多数の API Based の Headless CMS と違い Database (RDB) を必要としないのが特徴。だけど、機能は豊富で拡張性も高い。

markdown Widget とは

Netlify CMS の執筆編集画面の各フォームは Widget というコンポーネントになっており、日付入力フォーム、ファイルアップロードフォーム、など多数の Widget がビルトインで存在する。マークダウンの WISWIG やプレビュー機能を持つ Widgetmarkdown Widget

markdown` Widget の日本語入力のバグとは

以下の Issues はたぶん全部同じ事象。各 Issue に動画や Gif が貼られているので見ると挙動はよく分かる。

原因

markdown Widget が内部で使っている Slate Editor の問題、あるいはSlate Editor との連携の問題のよう。

根本解決

使っている Slate Editor を最新に置き換える。そういった議論も存在する。

ただし、Issue 内では次のようにコメントされているので、中の人が積極的に修正に動く気配は今のところなさそう。

Hi @acomagu updating to the latest version of slate is not a simple task. See https://docs.slatejs.org/concepts/xx-migrating. We're open to a contribution for the upgrade if anyone if up to the challenge

妥協

妥協案1

markdown Widget ではなく text Widget を使う。この場合、単なる textarea タグが使われるので、

  1. マークダウンを書くためのサポートや WISWIG 機能がなくなる。
  2. マークダウンをレンダリングしたプレビューがされない。

妥協案2

markdown Widgetプレビュー機能text Widget のインプットフォーム機能を組み合わせた Custom Widget を使う。この場合、妥協案1の1つ目の課題は解決しないが、2つ目の課題は解決する。

  • [ ] マークダウンを書くためのサポートや WISWIG 機能がなくなる。
  • [x] マークダウンをレンダリングしたプレビューがされない。

方法

public/admin/index.html

    <script src="https://unpkg.com/netlify-cms@^2.0.0/dist/netlify-cms.js"></script>
    <!-- この直下に custom widget を登録する処理を3行で追加 -->
    <script>
      CMS.registerWidget('md', CMS.getWidget("text").control, CMS.getWidget("markdown").preview, {});
    </script>

説明

widget をカスタムで自前開発する場合、パーツとしては入力欄機能とプレビュー機能をそれぞれ HTML (というか React Component) として作成する。そのため、入力機能は text widget から、プレビュー機能markdown widget から、それぞれ拝借するということが簡単にできる。できた。上記のコードでは md という名前で Widget を登録しているので config.yaml では以下のように参照し使用する。

    - { label: 本文), name: body, widget: md }

補足

markdown Widgetsanitize_preview オプションを解釈させたいなら次のように。

    <script src="https://unpkg.com/netlify-cms@^2.0.0/dist/netlify-cms.js"></script>
    <script>
      const schema = { properties: { sanitize_preview: { type: 'boolean' } } }
      CMS.registerWidget('md', CMS.getWidget("text").control, CMS.getWidget("markdown").preview, schema);
    </script>

各ビルトイン Widget の実装

ここにある。モノリポ構成。

自前で作るなら上記のコードを参考にしつつドキュメンを参照。

感想

1年前はこんなバグなかった気がする。残念。時間ができたら Slate Editor をキャッチアップしたい。

Could not load content for chrome-extension://cofdbpoegempjloogbagkncekinflcnj/build/content.js.map

まとめ

DeepL 翻訳の Chrome Extension (Google Chrome 拡張機能)の Warning 。 解決できなかったので Extension を適宜 OFF にするようにした。あと、サポートにメールしておいた。

症状

Chrome の Dev Console にいつでも表示される Warning

DevTools failed to load source map: Could not load content for chrome-extension://cofdbpoegempjloogbagkncekinflcnj/build/content.js.map: System error: net::ERR_BLOCKED_BY_CLIENT

Chrome の環境設定が日本語の場合の文言。

DevTools がソースマップの読み込みに失敗しました(chrome-extension://cofdbpoegempjloogbagkncekinflcnj/build/content.js.map のコンテンツを読み込めませんでした(システムエラー: net::ERR_BLOCKED_BY_CLIENT))

自分の場合、ある Chrome プロファイルだと常に表示されるからうっとうしい。

概要

cofdbpoegempjloogbagkncekinflcnj で検索すると DeepL 翻訳の Chrome Extension 関連だと分かる。

Chrome Extension のソースコード内で指定されている ソースマップ のパスに該当ファイルがない?とか

インストールした Chrome Extension のソースコードは端末上のどこにあるのか?

Macの場合インストールした拡張機能のファイルは~/Library/Application\ Support/Google/Chrome/Default/Extensions/に保存されています。

cd ~/Library/Application\ Support/Google/Chrome/Default/Extensions/
ls -l

すると32文字の意味のないアルファベットからなるディレクトリが複数あるはず。この文字列は Extension を識別する ID で、Extension のウェブページの URL にも使用されている。

各 Extension ディレクトリ直下はさらにバージョン番号でディレクトリが切られており、使っているバージョンの下で、 Warning 文言にもある build/content.js.map を探してみる。

cd ~/Library/Application\ Support/Google/Chrome/Default/Extensions/
cd cofdbpoegempjloogbagkncekinflcnj/<バージョン番号>/build/
ls -l

content.js はある。そのなかにソースマップの指定があるが、該当ファイルの content.js.map は存在しない。

$ cat -n content.js | tail -n 1
     2  //# sourceMappingURL=content.js.map

ブラウザから確認してもいい → chrome-extension://cofdbpoegempjloogbagkncekinflcnj/build/content.js

雑に作ってみてもだめだった。

touch content.js.map
chmod 600 content.js.map

sourceMappingURL の行を削除してもだめだった。

その状態で Chrome を再起動してみたり Extension を OFF/ON してみてもだめだった。使用している実体は別のところにキャッシュされているのかな。しょうがないのでサポートにメール問い合わせしておいた。直してって。DeepL Pro に課金し続けているのでバグ Fix をプッシュしても迷惑ではない、はず。

関連

為替介入 - ドル売り円買い

24年ぶりの歴史的な為替介入だそうな。円安が146円に迫るところで政府と日銀による為替介入。ドルを売って円を買った。

一時 146円 → 140円 まで円高に。

為替介入資金19兆円・ブレークスルー賞・「空飛ぶ車」終了: 日本経済新聞

  • すぐに使える外貨預金は 19兆円
  • 保有する外貨の総資産が 180兆円 (1兆2920億ドル)。ただしそのほとんどは米国債

「ポイントは介入にいくら使ったか」円安に歯止め?24年ぶりの為替介入 解説

今の円安が進んでいる背景には、金利差の拡大があるとされています。22日未明、アメリカのFRBは3回連続0.75%の利上げを発表しました。これ自体は予想通りでしたが、年末の金利が4.4%になるとの予測を出してきました。いま、金利が3%くらいですので、1%さらに利上げする可能性があるということで、市場としてはびっくりしたということです。

円安の背景にはあまりか FRB金利引き上げと日本お低金利維持とのギャップの影響がある。根本的な円安解消の大きなレバーはこれ(とよく言われている)。年末にかけてこれがさらにひらくかもと予想されている。為替介入では一時的な効果に留まる。

円安で儲けようとしている人たちがいます。そこに為替介入をやったので、“脅し”にはなっていると思います。

投資目的の人たちへの牽制にはなるんだね。そういう使い方もあるのか、為替介入。

政府・日銀が24年ぶり円買い介入:識者はこうみる | ロイター

この記事には複数の指揮者コメントが載っているが、いずれも大勢を変える力はなく米金利がさらに上振れすれば(日本の低金利が変わらない限り)、長期的な円安トレンドは収まらない、という趣旨が多い。

ただ、介入することに全く意味がないかというと、市場がスピード違反になっている状況で、スムージングオペという意味合いはあるだろう。

スムージングオペ / スムージングオペレーション

スムージングオペレーションとは - コトバンク

中央銀行為替相場の乱高下を防ぐために市場に介入すること。

150円台でドルを買うのが嫌だと思っている国内輸入企業に対し、140円台でドルを買わせるチャンスを一時的に与えたという、激痛緩和措置的な意味もあるのではないか。

激痛緩和措置的。

日本の為替介入、米国債への波及リスク低い-FRBのドル供給策で - Bloomberg

日銀の外貨資産が米国債だから、それを売ると米国債市場に影響があるという懸念もあるという話がよく出てくるが、この記事だと最近の状況だとむしろ影響がないことを言及している。

連邦準備制度が外国の中央銀行が利用可能なリバースレポファシリティー、海外・国際金融当局(FIMA)向けレポファシリティーを創設したことで、日銀のような海外の金融当局はそこに多額の現金を預けることができる。そしてこのドルを利用する必要がある場合、市場を動揺させずに引き出すことが可能だ。