ブルームバーグ記事の URL に付くトラッキングタグを除去する Tampermonkey Script

2025/06/04 現在、日本語版ブルームバーグ のニュース記事へのリンク開くと、URL の末尾にトラッキング用 GET パラメーターが付くことがあります。

実際のトラッキングパラメーターの例:

トップページから記事リンクを開いた場合:
?srnd=cojp-v2

公式Xアカウントから記事リンクを開いた場合:
?taid=68564362821738000132125b&utm_campaign=trueanthem&utm_content=japan&utm_medium=social&utm_source=twitter

記事をブックマークやシェアする際に気になるので、これを自動的に取り除く Tampermonkey 用の User Script を作りました。

このスクリプトを有効にすると、記事にアクセスした際 URL にトラッキング用パラメーターが付いている場合にそれが取り除かれます。その際にページリロードは発生せず、シームレスに URL のみが置き換わるため記事閲覧の邪魔になることはありません。

Tampermonkey User Script

// ==UserScript==
// @name         Tracking param remover for Bloomberg
// @version      1.1
// @description  Remove tracking params from article URL without reloading
// @author       @ymm1x
// @match        https://www.bloomberg.co.jp/*
// @run-at       document-start
// @grant        none
// ==/UserScript==
(function () {
    'use strict';

    const TRACKING_PARAMS = [
        "srnd",
        "taid",
        "utm_campaign",
        "trueanthem",
        "utm_content",
        "utm_medium",
        "utm_source",
    ];

    const currentUrl = new URL(window.location.href);
    let modified = false;

    TRACKING_PARAMS.forEach(param => {
        if (currentUrl.searchParams.has(param)) {
            currentUrl.searchParams.delete(param);
            modified = true;
        }
    });

    if (modified) {
        // URL を置き換え(リロードなし)
        history.replaceState(null, "", currentUrl.toString());
    }
})();

利用 API

[Bash] 並列数を制限しつつコマンドを並列実行するパターン

次のスクリプトは1回1秒かかるコマンド(関数)を単純に直列実行する例です。ループで10回実行するため、全て終わるまでに10秒かかります。

sleep_then_echo() {
  sleep 1
  echo $1
}

for i in $(seq 1 10); do
  sleep_then_echo $i
done

これを並列実行して速くする方法を考えてみます。

並列数を無制限にバックグラウンドジョブとして並列実行する場合

これを &wait を使って並列実行すれば、10並列で実行されるため約1秒で終わります。

sleep_then_echo() {
  sleep 1
  echo $1
}

for i in $(seq 1 10); do
  sleep_then_echo $i &
done

wait

時間のかかるコマンドの末尾に & を付けることでバックグラウンドジョブとして非同期に実行し、wait コマンドで実行中の全てのジョブが終了するまで待機しています。

並列数を制限しつつバックグラウンドジョブとして並列実行するパターン

&wait だけで手軽に並列実行の恩恵を受けられますが、もし並列実行する処理が重たいものだった場合、並列数を多くしすぎると実行負荷が上がり、逆に遅くなったり不安定になる場合があります。

こういった場合は次のようにして並列数を制限することで、安定して実行できるようになります。10回のループを5並列に実行するため、約2秒で終わります。

# 同時実行するジョブの最大数
MAX_CONCURRENT_JOBS=5

sleep_then_echo() {
  sleep 1
  echo $1
}

# 実行しているジョブ数を出力する
running_jobs_count() {
  # -r は running のジョブだけを出力するオプション
  jobs -r | wc -l
}

for i in $(seq 1 10); do
  # 実行しているジョブが最大数に達している場合は終了を待機する
  while (( $(running_jobs_count) >= MAX_CONCURRENT_JOBS )); do
    sleep 1
  done

  sleep_then_echo $i &
done

wait

ちなみに各ジョブの成功可否 (exit code) を判定したい場合は、もう少し書き方を工夫する必要があります。

xargs で並列数を制限しつつ並列実行するパターン

for を使わないパターンとして、xargs -P number でも手軽に並列実行ができます。-P オプションで並列実行するプロセス数を指定できます。次のスクリプトは10回のループを5並列に実行するため、約2秒で終わります。

sleep_then_echo() {
  sleep 1
  echo $1
}

# xargs で起動した子プロセスからも関数を使用出来るようにする
# export -f は Bash 固有の機能である点に注意
export -f sleep_then_echo

# sh -c ではなく bash -c としないと環境によって期待通りに動作しない点に注意
seq 1 10 | xargs -I@ -P5 -n1 bash -c "sleep_then_echo @"

また、こちらの方法は並列実行した各コマンドのいずれかが失敗した場合、xargs の exit code も1以上(失敗)になります。

そのため set -eo pipefail しておくだけでお手軽にエラーハンドリングができる点もメリットです。(参考: シェルスクリプトを高級言語のような書き味に近づける Tips 集

並列数に関しての注意

並列数を増やしすぎると CPU やメモリなどのリソースを過剰に消費し、処理速度の低下やシステム不安定化を招くおそれがあります。実際の負荷を見つつ適切な並列数を探りましょう。

並列化の方法まとめ

&wait を組み合わせて並列実行するパターンは説明的なスクリプトを書きやすい点がメリットでしょう。

xargs を使うパターンはオプションで並列数を指定するだけなので簡潔かつエラー検知も容易ですが、xargs の挙動やオプションを理解して使う必要があります。

また、この記事で紹介しなかった方法として GNU parallel を使う方法もあります。GNU parallel は xargs よりも柔軟で強力な並列制御やエラーハンドリング機能を備え、複雑な処理を簡潔かつ安全に並列実行できるツールです。

別途インストールが必要なため今回は割愛しますが、興味があればこちらも調べてみてください。

GitHub が公開した Rails の DB アダプタ「trilogy」の特徴を調べた

Ruby on Rails の MySQL アダプタは現状 mysql2 gem が最もメジャーだと思いますが、社内チャットで以下の記事を見かけて GitHub が Ruby on Rails 向けの MySQL アダプタを公開していたことを知ったので、その特徴を軽く調べました。

trilogy の特徴

  • libmariadb / libmysqlclient への依存の回避
    • mysql2 gem と比較してインストールが容易
  • ActiveRecord アダプタもリリースされている (github/activerecord-trilogy-adapter)
    • Requirements Ruby 2.7 or higher
  • ネットワークパケット構築・解析のメモリ効率の向上
  • 動的メモリ割り当てによるメモリ効率の向上
  • 独自の低レベルネットワークプロトコル実装
  • implemented in C
  • MIT license

所感

2015年から GitHub 社内で使用されていたものがオープンソースとして公開されたもので、まだ GitHub 社外での利用実績は少なく、ライブラリが枯れるまでしばらくは待ちが懸命と思われます。

開発の経緯としては外部ライブラリへの依存を減らし、mysql2 gem よりも移植性と効率性を高めたい狙いがあったようです。個人的には注目。

関連