2024年11月27日水曜日

chrome のブックマークレットでボタンを押したあとにinputに値を入力しイベントを強制発火する方法

chrome のブックマークレットでボタンを押したあとにinputに値を入力しイベントを強制発火する方法

概要

テキスト入力用のフォームなどにイベントが設定されてある場合はブックマークレットでは強制的にイベントを発火させる必要があります

環境

  • macOS 15.1.1
  • Google Chrome 131.0.6778.86

ブックマークレット(js)

javascript:(function(){
    var button = document.querySelector('input.pc-tab__hidden-input[type="checkbox"][name="pnav-group"]');
    if (button) {
        button.click();
    } else {
        alert('ボタンが見つかりません');
        return;
    }
    setTimeout(function() {
        var input = document.getElementById('search-text');
        if (input) {
            input.value = 'スイカゲーム';
            var event = new Event('input', { bubbles: true });
            input.dispatchEvent(event);
        } else {
            alert('入力フィールドが見つかりません');
        }
    }, 500);
})();

chrome への登録

あとは chrome のブックマークへ上記 Javascript を登録すれば OK です

最後に

ブックマークレットは対象のURLを開いてから実行する必要があるので注意してください

ブックマークレットだけで特定の URL を開いた上で JavaScript を実行することは難しいようです

ボタンを押してからテキストフィールドに入力するまでに0.5秒待っていますが画面がうまく動作しない場合は値を調整してください

2024年11月26日火曜日

nvm 自身を更新する方法

nvm 自身を更新する方法

概要

Homebrew の場合は brew update でいいですが curl でインストールスクリプトを使ってインストールした場合は再度 curl を叩く必要があります

環境

  • nvm 0.40.1

コマンド

  • curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash

バージョンの部分はアップデートしたい最新バージョンにしてください

最後に

nvm 自身に update コマンドはないようです
バージョンを調べるのは少し面倒ですがこれが公式のようです

参考サイト

2024年11月25日月曜日

StackEdit でこのアプリはブロックされますが出る場合の対応用法

StackEdit でこのアプリはブロックされますが出る場合の対応用法

概要

一度ワークスペースをクリーンアップします

環境

  • StackEdit (2024/11/25時点

クリーンアップ

右ペインのメニューから「Reset application」を選択します

Restrict Access で Google Drive に再アクセス

Synchronize -> Add Google Drive Account で再度アカウントを接続します

これで「このアプリはブロックされます」の警告が出なくなります

オプション: Blogger アカウントを再接続する

Publish -> Add Blogger account で接続します

最後に

久しぶりに StackEdit を開くと発生したりします
素直にクリーンアップして各種サービスを再接続してあげましょう

2024年11月23日土曜日

ruby で parallel する場合にはデータをスライスしてから実行したほうがいいかもしれない

ruby で parallel する場合にはデータをスライスしてから実行したほうがいいかもしれない

概要

そうしないとプロセスが複数立ち上がっても CPU の使用率が偏る気がします

環境

  • macOS 15.1.1
  • Ruby 3.3.5
  • parallel 1.26.3

サンプルコード

def analyze
  @data.each_slice(batch_size) do |sliced_data|
    tweets = Parallel.map(sliced_data, in_processes: parallel_process_count) do |d|
      parse_and_add_tweet(d['tweet']['full_text'])
    end
    @tweets.append(tweets)
  end
end
  • batch_size は @data / CPU 数
  • parallel_process_count は CPU 数
  • Parallel.map で各コアが処理した結果は @tweets に結合していく
  • こうすることで各コアに均等に処理するデータが渡り処理が効率化される (各コアのCPU使用率がちゃんと均等化される)

2024年11月22日金曜日

Ruby で Thread によるシングルコアとマルチコア化について

Ruby で Thread によるシングルコアとマルチコア化について

概要

Ruby は GVL の関係で基本はスレッド化してもシングルコアでしか動きません
てっとり早くマルチコア化した場合は parallel を使います

環境

  • macOS 15.1.1
  • Ruby 3.3.5
  • parallel 1.26.3

Thread 化する前のコード

配列を単純に順番に処理する関数です

スレッド化することを前提にコードを作成しており add はインスタンス変数の配列にデータを登録するよういになっています
またインスタンス変数は基本的に順番を保証しないことを考慮した作りにしたほうがいいです (Thread でどんどん処理されるので)

def parse_and_add_tweet(full_text)
  tweet = Tweet.new(full_text, @mecab)
  tweet.analyze
  add(tweet)
end

def exec
  @data.each do |d|
    parse_and_add_tweet(d['tweet']['full_text'])
  end
end

通常の Thread

配列のデータをスライスしてスライスしたデータをスレッドに渡して処理させるようなコードに変更します

thread_batch_size は作成するスレッド数ごとにデータが均等に割り当たるようにしています

def thread_batch_size
  (@data.size / thread_count.to_f).ceil
end

def thread_count
  32
end

def parse_and_add_tweet(full_text)
  tweet = Tweet.new(full_text, @mecab)
  tweet.analyze
  add(tweet)
end

def analyze
  threads = []
  @data.each_slice(thread_batch_size) do |sliced_data|
    threads << Thread.new do
      sliced_data.each do |d|
        parse_and_add_tweet(d['tweet']['full_text'])
      end
    end
  end
  threads.each(&:join)
end

これで実行するとわかりますがシングルコアの CPU を100%使用しますが残りのコアは何もしていないことが確認できます

parallel を使う

parallel_process_count は CPU コア数になります
こちらの方が単純に書くことができます
また実行するとすべての CPU が使われ 100% になっていることが確認できると思います

def parallel_process_count
  Parallel.processor_count
end

def parse_and_add_tweet(full_text)
  tweet = Tweet.new(full_text)
  tweet.analyze
  add(tweet)
end

def analyze
  @tweets = Parallel.map(@data, in_processes: parallel_process_count) do |d|
    parse_and_add_tweet(d['tweet']['full_text'])
  end
end

parallel を使う際は少し工夫が必要なのでそれに関しては後述のトラブルシューティングに記載しています

結果比較

通常 の Thread

1775.98s user 2.64s system 99% cpu 29:40.44 total

parallel を使う

3552.51s user 269.73s system 701% cpu 9:04.50 total

3-4倍くらい速くなりました

トラブルシューティング

'dump': no _dump_data is def ined for class FFI::Pointer (TypeError)

parallel にわたすブロックに Marshal.dump できない値は渡せません
今回で言うと mecab オブジェクトが FFI::Pointer をクラスを使っており渡せないので mecab オブジェクトの生成は Tweet クラス側の initialize ではなく各種関数側で行うように修正しました

最後に

  • そんなに処理時間がかからない -> 通常のループ
  • シングルコアは MAX に使いたい -> Thread を使ったループ
  • マルチコアであるだけリソースを使いたい -> parallel を使ったループ

という感じで使い分けるといいかなと思います
parallel の場合ほぼリソースを食い尽くすことができてしまうので他のプロセスの邪魔にならないように注意しましょう

参考サイト

2024年11月21日木曜日

CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from this module in 48.0.0. 対策

CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from this module in 48.0.0. 対策

概要

paramiko を import する際に warning が出るのでてっとり早く対応する方法を紹介します

環境

  • Ubuntu 24.04.1
  • Python 3.10.2
  • paramiko 2.12.0

対応前

python
Python 3.10.2 (main, Feb 16 2024, 16:09:49) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import paramiko
/add_disk1/.local/share/virtualenvs/api-UwQw2i9A/lib/python3.10/site-packages/paramiko/pkey.py:82: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from this module in 48.0.0.
  "cipher": algorithms.TripleDES,
/add_disk1/.local/share/virtualenvs/api-UwQw2i9A/lib/python3.10/site-packages/paramiko/transport.py:253: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from this module in 48.0.0.
  "class": algorithms.TripleDES,

対応後

python
Python 3.10.2 (main, Feb 16 2024, 16:09:49) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import warnings
>>> from cryptography.utils import CryptographyDeprecationWarning
>>> warnings.simplefilter('ignore', CryptographyDeprecationWarning)
>>> import paramiko

最後に

warnings の使い方は 3.10 版になります
3.11 系からは少し違うので注意してください

参考サイト

2024年11月20日水曜日

GCP のインスタンスで swap 領域を作成する方法

GCP のインスタンスで swap 領域を作成する方法

概要

メモ

環境

  • e2-micro

コマンド

sudo dd if=/dev/sda1 of=/swapfile bs=1M count=8192
sudo chmod 600 /swapfile
sudo mkswap -f /swapfile
sudo swapon /swapfile
swapon -s

fstab

  • sudo vim /etc/fstab
/swapfile1  swap   swap    defaults   0 0

最後に

昔の f1 シリーズだとスワップがないと動作しないケースがあったが最近の e2 ではスワップなしでも問題ないケースが多いです

それでもメモリ領域が足りない場合にはスワップを作成して対応してください