ぴよがち

技術的な話をします。みんなで強くなりましょう。

ポケモンカード

4月ごろに第一子が生まれるので、最近また始めてみようかなという気持ちです。 とりあえずドラパルトとメガスターミーが強そうなので組んでみました。 もうAIが開発は全部やってくれるようになったし、子作りとゴルフとポケモンカードくらいしか人間のやること残ってない説を提唱しています。

ChatGPT や BingAI に手元のコードをぶち込む用のバッチファイル

ChatGPTなどに手元のコード入力する際に、複数ファイルをコピペしてファイル名を書くのは地味に面倒ですよね。(少なくとも私はそう思います。)

この問題に対処するために、ドラッグアンドドロップで複数ファイルのコードブロックを相対パスつきでコピーできるスクリプトを書いたので共有しておきます。

BingAIの文字数制限突破ワザップ1 と組み合わせて使うのがおすすめです。

使い方

  1. 下のスクリプトを、copyCodeblock.bat みたいな名前で適当に保存する。
  2. コードブロックとしてコピーしたいファイルをドラッグアンドドロップする。
  3. markdownのコードブロックがクリップボードにコピーされるので、ChatGPT や Bing AIなどに貼り付けて、好きなように指示を出し修正してもらう。

以上です。

スクリプト

特定のフォルダからの相対パスも出力する版と、ファイル名のみ版の2種類を用意しときました。

特定のフォルダからの相対パスも出力する版

set baseFolder=src の部分を、好きなフォルダ名に書き換えて使ってください。
なお、UTF-8じゃないソースコードを扱う場合は、chcp 65001 の部分を適当に変えてください。

@echo off
setlocal enabledelayedexpansion

:: Set base folder (update this variable to change the base folder)
set baseFolder=src

:: Set code page to UTF-8
chcp 65001 >nul

:: Check if a file was passed
IF "%~1"=="" (
  echo Usage: Drag and drop one or more files onto this script
  pause
  exit /b
)

:: Create temporary file
set tempfile=%temp%\_codeblock.md
>nul copy nul %tempfile%

:: Process each file
for %%G in (%*) do (
  echo Processing %%G...

  :: Set the full path
  set fullpath=%%~fG

  :: Find the path from the base folder onwards
  for /f "delims=" %%H in ("!fullpath!") do (
    set "relpath=!fullpath:*%baseFolder%=%baseFolder%!"
  )

  :: Replace backslashes with slashes
  set "relpath=!relpath:\=/!"

  echo ^```!relpath! >> %tempfile%
  type "%%G" >> %tempfile%
  echo ^``` >> %tempfile%
  echo. >> %tempfile%
)

:: Copy to clipboard
type %tempfile% | clip

echo Markdown code blocks copied to clipboard!
endlocal

ファイル名のみ版

@echo off
setlocal enabledelayedexpansion

:: Set code page to UTF-8
chcp 65001 >nul

:: Check if a file was passed
IF "%~1"=="" (
  echo Usage: Drag and drop one or more files onto this script
  pause
  exit /b
)

:: Create temporary file
set tempfile=%temp%\codeblock.md
>nul copy nul %tempfile%

:: Process each file
for %%G in (%*) do (
  echo Processing %%G...

  echo ^```%%~nxG >> %tempfile%
  type "%%G" >> %tempfile%
  echo ^``` >> %tempfile%
  echo. >> %tempfile%
)

:: Copy to clipboard
type %tempfile% | clip

echo Markdown code blocks copied to clipboard!
endlocal

  1. 入力欄を右クリック→開発者ツールを開き、<textarea>maxlength を増やすと、英文やソースコードなら5万文字くらいまでは入力可能です。

ChatRWKV v2のビルド時の LNK1104: cannot open file 'python311.lib' エラー

ChatRWKV v2をビルドする際に、エラーが出てちょっと面倒だったのでメモ。

エラー内容

こんな感じ

$ python chat.py

...

LINK : fatal error LNK1104: ファイル 'python311.lib' を開くことができません。
ninja: build stopped: subcommand failed.

...

RuntimeError: Error building extension 'wkv_cuda'

対処法

%LocalAppData%\Programs\Python\Python311\libs にあったファイル全て(python311.lib を含む)を、 cudart.libのあるフォルダに放り込んだら通るようになりました。

もっとマシな方法ありそうですが、とりあえず動くのでヨシ!

ChatGPTで画面全体のスクリーンショットを一時的に撮れるようにするブックマークレット

サイドバーと新規投稿欄が消えるので気をつけてください。 リロードしたら戻ります

javascript:window.location.href.includes("://chat.openai.com/chat")&&(document.getElementsByTagName("main")[0].parentNode.parentNode.outerHTML=document.querySelector("main div.flex-col").outerHTML);window.stop()

メルカリShopsで購入者のプロフィールを表示するBookmarklet

最近しょーもないものを作って売るのにはまってます。

お客さんに合わせて色々対応したいときに、プロフィール見れたら便利ですよね。
ってことでブックマークレットです。

プロフィール画像を設定している人のプロフィールを見ることができます。
設定していない人はIDがわからないので見ることはできません。

javascript:userId=[...document.getElementsByTagName("img")].find((imgElement) => imgElement.src?.includes("/members/"))?.src?.match(/\/members\/([^.]+)\./)[1];document.URL.includes("://mercari-shops.com/seller/")&&userId&&void(window.open(`https://jp.mercari.com/user/profile/${userId}`))

NXBTの便利スクリプト

環境設定編はこちら piyo-p.hatenablog.com

使い方

sshでラズパイに入り、適当にテキストファイルにマクロを保存して、systemdでサービス化して実行するのが良いかと思います。
(おま環かもですが、3時間くらいマクロ回したら毎回落ちるため)

この辺を参考に、サービスを作成してみてください。

qiita.com

テキストから読み出してnxbtを実行するコマンド自体はこんな感じです。

sudo /usr/bin/python3 /usr/local/bin/nxbt macro -c /home/ubuntu/sample.txt -r

スクリプト

無限A連打

LOOP 10000000
  A 0.025S
  0.025S

無限野良レイド

野良レイドの途中で起動してください。

LOOP 1000000
  A 0.1S
  0.5S
  X 0.1S
  0.5S

学校最高大会 2匹以上用

Bボタンで入れ替えダイアログを閉じます。
お金効率を犠牲に、レベル上げができます。

LOOP 100000
  LOOP 3
    A 0.1s
    0.6s
  B 0.1s
  0.6s

円を描いて歩く(タマゴ孵化・なつき上げ)

L_STICK@+000+100 R_STICK@-100+000 600s

無限競り

競りが終わるくらいまでAを連打して、
終わったころにレポートを書いてゲームを終了し、
Switchのホームに戻って日付を変えてゲームを再開します。

競りの人の目の前で開始してください。

LOOP 10000
  A 0.1S
  3S
  A 0.1S
  15S
  LOOP 100
    A 0.1S
    1S
  LOOP 8
    b 0.1S
    1S
  X 0.1S
  2S
  R 0.1S
  2S
  A 0.1S
  5S
  HOME 0.1S
  3S
  X 0.1S
  1S
  A 0.1S
  5S
  DPAD_DOWN 0.1s
  0.5s
  LOOP 5
    DPAD_RIGHT 0.1s
    0.5s
  a 0.1s
  2s
  loop 15
    DPAD_DOWN 0.1s
    0.8s
  DPAD_RIGHT 0.1s
  0.8s
  loop 8
    DPAD_DOWN 0.1s
    0.8s
  a 0.1s
  2s
  loop 2
    DPAD_DOWN 0.1s
    0.5s
  a 0.1s
  1s
  LOOP 2
    DPAD_RIGHT 0.1s
    1s
  DPAD_UP 0.1s
  1s
  loop 3
    DPAD_RIGHT 0.1s
    0.5s
  a 0.1s
  0.5s
  HOME 0.1S
  1S

【NXBT】Raspberry Pi で Switchを自動操作する話(後編)【マクロの文法】

設定方法・使い方については、前編 をご覧ください。

piyo-p.hatenablog.com

以下、後編ではマクロの文法をご紹介します。

マクロの文法

マクロでは、1行に1つのコマンドを書きます。

コマンドには、以下の3種類があります。

1. ボタン・スティックのコマンド
書き方
[操作対象] [秒数]S
書き方の例

以下の例では、Aボタンを押し続け、0.5秒後に離します。

A 0.5S
ボタンの種類

ボタンの種類は、以下の通りです。

Macro Value Control Name
A A ボタン
B B ボタン
X X ボタン
Y Y ボタン
L L ボタン
ZL ZL ボタン
R R ボタン
ZR ZR ボタン
MINUS - ボタン
PLUS + ボタン
DPAD_DOWN 十字キー
DPAD_UP 十字キー
DPAD_RIGHT 十字キー
DPAD_LEFT 十字キー
R_STICK_PRESS 右スティック押し込み
L_STICK_PRESS 左スティック押し込み
HOME Home ボタン
CAPTURE キャプチャボタン
JCL_SR Right Joy-Con SR(詳細不明)
JCL_SL Left Joy-Con SL(詳細不明)
JCR_SR Right Joy-Con SR(詳細不明)
JCR_SL Right Joy-Con SL(詳細不明)

これ以外にも、ジョイスティックを倒したりする操作もできるようです。
GitHub の操作方法ページ を参照してください。

2. 待機コマンド
書き方
[秒数]S
書き方の例

以下の例では、3秒待機します。

3S
3. 繰り返しコマンド
書き方

繰り返し処理を始めたい箇所で LOOP と書き、次の行から繰り返したい内容を、[半角スペース4つ, 半角スペース2つ, tab文字] のいずれかでインデント(字下げ)されたブロックに書きます。

LOOP [回数]
    [繰り返したい処理1]
    [繰り返したい処理2]
[繰り返したくない処理]
書き方の例1

以下の例では、「Aボタンを3回1秒ごとに押して、Bボタンを1回押す」処理(4秒1セット)を1時間(900セット)繰り返します。

LOOP 900
    A 0.1S
    0.9S
    A 0.1S
    0.9S
    A 0.1S
    0.9S
    B 0.1S
    0.9S
書き方の例2

LOOP はネストする(入れ子にする)ことができます。
以下の例では、上記と同じ「Aボタンを3回1秒ごとに押して、Bボタンを1回押す」を1時間繰り返すような処理を、2重の LOOP を使って表現しています。*1

LOOP 900
  LOOP 3
    A 0.1S
    0.9S
  B 0.1S
  0.9S

おわりに

誤りなどありましたら、ぜひコメントでご指摘お願いします!

読者の皆様が単純作業から解放され、時間を有効に使う手助けになったなら幸いです。

*1:今回は、「半角スペース2つ」でインデントしてみました。