動かざることバグの如し

近づきたいよ 君の理想に

Chrome拡張機能 Manifest V3でContentScriptを実行する

マジでダルい

Manifest v3とは

現行ではManifest v2が主だが、現時点で2023年6月に動かなくなると言われている。(絶対ムリだろ

softantenna.com

つまりこれから作るChrome拡張機能はV3対応で書かなければいけないってわけ。

やりたいこと

SPA対応ContentScriptを実装する。

通常のContentScriptではmanifest.jsonを以下のようにして

{
  "name": "My extension",
  ...
  "content_scripts": [
    {
      "matches": ["https://*.nytimes.com/*"],
      "run_at": "document_idle",
      "js": ["contentScript.js"]
    }
  ],
  ...
}

でcontentScript.jsを用意すれば実行できるが、これはbodyがロードされたタイミンのみ実行される。

昨今ではSPAで実装されているサイトが多く、その場合だと初回は実行されるが遷移先やブラウザバックしたあとは実行されなくなってしまう。

そこでbackgrorund.jsを駆使したやり方が裏技として一般的だったりする。

mem-archive.com

これのV3対応が面倒だった。

manifest.json

重要な箇所だけ抜き出している

{
  "manifest_version": 3,
  "background": {
    "service_worker": "background.bundle.js"
  },
  "host_permissions": ["https://example.com/"],
  "permissions": ["tabs", "scripting"]
}
  • manifest_version: 当然3を指定する
  • background.service_worker: ファイル名は任意だが書き方がV2と異なるので注意。background.htmlはもう使えない
  • host_permissions: ここではContentScriptを実行したいサイトを列挙する必要がある
  • permissions:「tabs」は今までも必要だったが、それに加えて「scripting」も追加する必要がある

background.js

ここはV2とやっている内容は変わらないが、コードは大きく変わっている。

chrome.tabs.onUpdated.addListener(function (tabId, info, tab) {
  if (
    info.status === 'complete' &&
    tab.url.indexOf('https://example.com') !== -1
  ) {
    chrome.scripting.executeScript({
      target: { tabId: tab.id, allFrames: true },
      files: ['./contentScript.bundle.js'],
    });
  }
});

V2では「chrome.tabs.executeScript」だったが廃止された。V3では「chrome.scripting.executeScript()」を使う。

chrome.tabs.onUpdated.addListener()は仕様はあまり変わってない模様

サンプルコード

以下にアップした。

thr3a/mercari-chrome-extension

まとめ

V3まじで百害あって一利無し 滅びろ

ウォークマンのAシリーズにカスタムファームウェアを導入する

やりたいこと

Androidではない方のウォークマン A50にカスタムファームウェアをインストールして楽しみたい

探してみたら有志の方が公開してたので試してみた

文鎮化しても自己責任なので注意

メリット

追加される機能は以下。(公式サイトから引用

- 4 sound signatures in 1 package: "Neutral", "Warm", "Bright", and the "WM1Z" stock sound;
- an additional settings system, which can be found in the Internal Storage (in the "CFW" folder), allowing you to set various settings (open the settings file, [settings.txt], for more info);
- a boot log file for the settings system, to check if the settings file is read correctly and all the values are valid (can be found in the same "CFW" folder);
- 10-band equalizer/Tone Control (switch between these two from the EQ screen, by tapping on the bottom-right menu button);
- DC Phase Linearizer with 6 selectable modes;
- Vinyl Processor with 4 selectable modes;
- Direct Source replacing ClearAudio+ (while Direct Source is enabled, DSD and MQA playback will not work);
- visualizers: Spectrum Analyzer/Analog VU Meter/Digital Peak Meter (while in the playback screen, tap the bottom right button, and then tap "Change playback screen")
- info about the file being played showing up at the top of the playback screen;
- a bar indicating the audio volume is showing up at the top of the screen;
- the CEW2 region doesn't apply a volume limit with this firmware;
- three boot modes: "Normal", "Plus v1", and "Plus v2" (find settings for these in the settings file);
- DSEE AI (present on DMP-Z1);
- visualizations more in sync with the music;
- progressive JPEG and interlaced PNG album covers are supported.

逆に失われる機能もある。FMラジオとかリスニング機能が消されるのは人によってはかなりのディスアドかも

  • FM Radio
  • VPT Surround
  • Language Study
  • ClearAudio+
  • Noise cancelling
  • Line-out functionality

ダウンロード

海外の「MrWalkman」って人が作っている。

www.nwmods.ml

当然同じAシリーズでも機種によってインストールするファイルは変わるので注意。

現時点では

  • A30
  • A40
  • A50

に対応している。今回は普段使っているA50にインストールした。

あとはダウンロードしてカスタムファームウェアを入れたいウォークマンをPCに接続してexeファイルであるインストーラーを実行するだけ

公式のアップデート同様にexe形式しかないのでWindows経由でないといけない。

感想

レスポンス

他のサイトだとよく「レスポンスがよくなった」とあるが、正直違いがわからない。というのもA30、A40は本当にソニー製か?と疑うレベルでレスポンスがやばかったが、A50で公式が修正してくれたので変わらないんじゃないかなと思っている。

音質

これも変わらない、と思ったら結構違った。

というのもカスタムファームウェアには2つのモードが有り、

  • ホールドボタンをOFF(下)にした状態で電源を入れるとノーマルモード、純正FWと同じ
  • ホールドボタンをON(上)にした状態で電源を入れるとplusモード

になる。で、このplusモードってなんだよって言うとカスタムFWのベースにしているNW-WM1Zの音響チューニングにしてくれる。

NW-WM1Zは30万近くする超高級ウォークマンであり、じゃあそれと同じチューニングってことはさぞかし高音質になるだろうと思ったらそんなことなかった。

というのも音が尖りすぎてキンキンなって気になる。A50のアンプでカバーできていない感じがあり、やはりそれぞれのアンプに適したチューニングがあるんだなと改めて実感した。

機能

再生中にスペクトラム出たりとかイコライザが細かく調整できるようになったとかは嬉しい。。がBluetooth接続するといずれの機能も使えなくなるので個人的には正直恩恵があんまりない。

まとめ

A30とかA40とか古いウォークマンを持ってる人はレスポンスが神がかるのでインストールおすすめ

A50は恩恵が微妙かも

繰り返すが自己責任でお願いします。

参考リンク

遊戯王ラッシュデュエルにも偽物が蔓延し始めてる件

結論

ラッシュデュエルにも偽物があるから高額カードを購入する際は気をつけろ

ラッシュデュエルの偽物とは

遊戯王コンマイの有名なTCGだが、コレクター要素もあり近年珍しいカードが高騰している背景がある。

gendai.ismedia.jp

そしてラッシュデュエルは2020年に出たばかりの新しい遊戯王シリーズ。投資家、転売ヤーたちの注目が集まらないはずもなく…

ということはなく「ラッシュに手を出す転売ヤーは向いてない」と言われるほど、OCGほど転売商材にされていない。

強いて言えば777枚しかないレアカードとか環境で流行ってるくせに希少なかーどくらいで1枚で資産!になるようなカードはない。

とはいえ中華では新しい遊戯王であるラッシュデュエルに目をつけたのかみんな大好きAliexpressでは偽物が買える

f:id:thr3a:20211231222650p:plain

例えばこのブラック・マジシャンだが

[偽物] f:id:thr3a:20211231222735j:plain

[本物] f:id:thr3a:20211231222812j:plain

本物と比較すると加工の仕方がおかしかったり左下の文字のフォントが違ったりと変な箇所がある。

Twitterでの声

ツイッターでも過去に話題になった。この場合は偽物特有の送り仮名がおかしくて確定したようだが、画像だけだとパット見判別つかない。。実際に触ったら紙の質感とか加工具合とかぜんぜん違うんだろうけど

ラッシュデュエル偽物出品例

ヤフオクにあったので紹介。

page.auctions.yahoo.co.jp

画像が残っていてさっき同様に左下のロゴフォントがおかしい。

f:id:thr3a:20211231223334j:plain

ちなみに偽物を出品していたgyao38315という奴は案の定評価が悪かった。

f:id:thr3a:20211231223410p:plain f:id:thr3a:20211231223639p:plain

まとめ

偽物が蔓延しないためには偽物を買わないのが第一。安心できるショップ経由で購入するか、反射買いせずに画像をちゃんと確認すること。確信犯の言い逃れとして「オリカ」「海外産」と小さく書いてたりする。そういうのは一切反応したり、購入しないこと。

Sequel Aceでソケット接続するとエラーになる

環境

  • Mac OS Monterey
  • Sequel Ace 3.4.4

症状

Sequel Proの後継アプリのSequel Ace。バグが治ってたり、機能が増えていたりと使わない理由がまったくないのだが、1つだけ問題がある。

ソケット接続ができないのである。

例えば以下のように接続しようとすると

f:id:thr3a:20211229190201p:plain

f:id:thr3a:20211229190304p:plain

ソケット接続に失敗しました!


Unable to connect via the socket, or the request timed out.

Double-check that the socket path is correct and that you have the necessary privileges, and that the server is running.

MySQL said: Can't connect to local MySQL server through socket '/Users/thr3a/hoge.sock' (1)

と言われてエラーで接続できない。

ちなみに

mysql -S /Users/thr3a/hoge.sock -uthr3a -p

での接続はできるので、MySQL側は悪くなさそう

原因

MacOSのせい。というかセキュリティの問題。

ここ最近のMacOSでは野良アプリが自由にソケット通信できなくなってしまっている。ユーザーのホームディレクトリでも許可がないらしくエラーになる。

一昔は /tmp に作れば接続できたのだがMontereyではそれもで着なくなってしまった。

じゃあどうすればいいのかというとSequel Ace内のディレクトリを指定する。

~/Library/Containers/com.sequel-ace.sequel-ace/Data

の中は許可された場所なのでSequel Aceがソケット通信できる。

つまり ~/Library/Containers/com.sequel-ace.sequel-ace/Data/mysql.sock にソケットを設置すれば良い

参考リンク

RubyのMechanizeでフォーム送信する

環境

  • Mechanize 2.7

やりたいこと

Mechanizeでスクレイピングするときに、フォーム送信したい

ログイン処理とかもこれに含まれる

agent = MyMechanize.new
agent.get "https://example.com/login"
form = agent.page.form(id: "login")
form.field_with(name: "email").value = "hoge@example.com"
form.field_with(name: "password").value = "hogehoge"
form.submit

もし存在しないフィールドを追加したい場合は

form.add_field!("hogehoge", value = "1234")

とすることで、あたかも

<input type="text" name="name" value="1234">

があるかのように実行してくれる。