2025年3月4日火曜日

何度も編集するファイルをユーザデータに登録

問題意識

僕はhowm形式でメモを取っているが(参考:moe | メモの方法論)、一日に何度も編集したり、閲覧したりするファイルがある。日記や、短期的なtodoだ。こういったファイルを一々フォルダから探し出して開くのは手間なので、簡単に開けるようにしたい。

ユーザデータの利用

ユーザデータを利用する。_User:diaryや_User_todoを用意し、ここにファイルパスを保存する。

以下のファイルをScriptフォルダに保存。

settitle2.js

//!*script
// ES6版settitle.js
// howmファイルを作成する
// 第一引数:作成するフォルダ。省略したらカレントフォルダ
// 第二引数:タイトル。省略可能
// 戻り値:ファイルパス
//
// *script %0Script\settitle2.js,%1,homuhomu
// editor %*script(%0Script\settitle2.js,%1,%*now(date))
const g_args = ((args = PPx.Arguments) => {
const dirname = PPx.Extract("%1");
const title = "";
const arr = [];
for (let i = 0, l = args.length; i < l; i++) {
arr[i] = args.Item(i);
}
return {
dirname: arr[0] || dirname,
title: arr[1] || title
};
})();
const fso = PPx.CreateObject("Scripting.FileSystemObject");
const filename = PPx.Extract("%*nowdatetime(Y-N-D-HMS)")+".howm";
const filepath = fso.BuildPath(g_args.dirname,filename);
const now = PPx.Extract('%*nowdatetime(Y-N-D H:M)');
const str = `= ${g_args.title}\r\n\r\n\r\n[${now}]`;
const f = fso.OpenTextFile(filepath, 2, true);
f.Write(str);
f.Close();
PPx.result = filepath;
view raw settitle2.js hosted with ❤ by GitHub

以下を一行編集の補完候補リスト(参考:コマンドの実行 | PPxMemo)に追記する。

;<diaryを開く>; editor %su"diary"
;<diaryppvで閲覧>; *ppv %su"diary"
;<diaryを新規作成>; *setcust _User:diary=%*script(%0Script\settitle2.js) %: editor %su"diary"
;<カーソル下ファイルをdiaryに登録>; *setcust _User:diary=%FCD
;<todoを開く>; editor %su"todo"
;<todoppvで閲覧>; *ppv %su"todo"
;<todoを新規作成>; *setcust _User:todo=%*script(%0Script\settitle2.js) %: editor %su"todo"
;<カーソル下ファイルをtodoに登録>; *setcust _User:todo=%FCD

2025年2月23日日曜日

Firefox+Sideberyでツリー型タブに

最近のツリー型タブ事情を調べたところ、sideberyが良さげだった。このアドオンを使うため、数年ぶりにFirefox使いに戻る。

ツリー上でマウススクロールでタブ切り替え

ツリー上でのマウススクロールでタブの切り替えができるよう、以下のように設定する。

  • 「設定→マウス→垂直スクロールでタブを切り替える」を「パネル内で」か「グローバルに」にする

タブバーを非表示に

ツリーを使う以上タブは不要なので、非表示にする。 アドレスバーにabout:configと入力。高度な設定が開くので、検索ボックスにtoolkit.legacyUserProfileCustomizations.stylesheetsと入力。値をtrueにする。 次に、プロファイルフォルダ(アドレスバーにabout:supportと入力すると場所がわかる)内にchromeフォルダを作成。そこにuserChrome.cssというファイルを作成し、以下をコピペ。既にこのファイルがある場合は追記すればいい。

#tabbrowser-tabs {    visibility: collapse !important;}

参考

2025年2月15日土曜日

2025年使用ソフト晒し

PVが200000を超えたので、ソフトウェアカスタマイズブログ界隈では定番の使用ソフト晒しをします!yeah!

ファイル関連

  • Paper Plane xUI
  • 7-zip (圧縮・解凍)
  • Everything (ファイル検索)
  • FastCopy (ファイルの移動・コピー)
  • WinMerge (ファイル比較)
  • WindowsTerminal (ターミナル)

エディタ

  • xyzzy

ブラウザ

  • vivaldi (メインブラウザ。縦タブにして使用)
    • Checker Plus For Gmail (メールチェッカー)
    • Format Link (urlコピー)
    • Sakura Check Linker (サクラチェッカー)
    • Calilay (図書館の蔵書検索)
    • Keepa (価格追跡ツール)
    • uBlock Origin (広告ブロッカー)
  • brave (サブブラウザ)

マルチメディア

  • Aimp5 (音楽プレイヤー)
  • MPC-HC (動画プレイヤー)
  • ImageMagick (画像変換)
  • NeeView (漫画ビューア)
  • sigil (電子書籍作成)
  • calibre (電子書籍管理)
  • TsubameViewer (漫画・小説ビューア)
  • Sumatora PDF (PDFビューア)
  • STEP_K (音楽タグ編集)

ユーティリティソフト

  • ScreenToGif (アニメGIF作成)
  • EasyShot (スクリーンショット)
  • FileSum (フォルダ容量表示)
  • Folder Size Portable (フォルダ容量表示)
  • Google日本語入力
  • Raspberry pi Imager (ラズパイのSDカード作成)
  • PowerToys (ツール集)
  • EarTrumpet (音量調節)
  • EBWin4 (EPWINGビューア)
  • pdfcpu (PDF操作)
  • poppler (PDF操作)
  • busybox (UNIXコマンド実行)
  • Chocolatey (パッケージ管理システム)
  • Scoop (パッケージ管理システム)
  • Display Changer 2 (ディスプレイの向きを変更)
  • ExifTool (EXIF情報抽出)
  • yt-dlp (動画ダウンロード)
  • zoxide (cdコマンド改良版)
  • Advanced IP Scanner (LAN内の端末を検出)
  • Git for Windows

andoroidに入れてるアプリ

  • ComittoNxA (漫画ビューア。共有フォルダにもアクセス可能)
  • Perfect Viewer (漫画・小説ビューア。共有フォルダにもアクセス可能)
  • X-plore (ファイラ。共有フォルダにもアクセス可能)
  • Squeezer (Logitech Media Serverの操作)
  • Reasily (小説ビューア。縦書き対応)
  • ReadEra (小説ビューア)
  • WiFiman (Wi-Fi環境チェックツール)
  • Rotation Control (画面の回転制御)
  • foobar2000 (音楽プレイヤー。DLNA再生が可能)
  • Omnia (音楽プレイヤー)

運用について

現在使っている端末は以下。

  • デスクトップPC (Windows10 64bit)
  • t90chi (Windows10 32bit)
  • Fireタブレット
  • Xperia SO-02J
  • Raspberry Pi Zero WH (piCorePlayer)
  • LIVA Z2 (ubuntu sever)

デスクトップPC

よく使用するのは、PPx、xyzzy、vivaldiの三つ。

PPxは独立窓二枚で運用している。現在使っているカスタマイズは「サブ窓を利用したファイル操作」「一行編集でランチャ」「zoxide+一行編集でフォルダジャンプ」「PPv中心の連動ビュー」「moe」。コマンドは補完候補ファイルにまとめ、それを一行編集で呼び出して使っている。

メインブラウザはvivaldi。僕はツリー型タブが好きで、長年ツリー型タブが使えるブラウザを探して彷徨っていたが、数年前にvivaldiの縦タブで妥協し、今に至っている。

ランチャもWinキーから起動できるものしか使っていない。かつてのように色々なソフトを頻繁に起動することがなくなり、ランチャの重要性が薄れたからだ。

LAN内サーバー

以前はデスクトップPC以外はt90chiくらいしか使ってなかったが、今はタブレット、スマホ、ラズパイも使っている。これだけ端末が増えると、LAN内サーバーを構築して、そこからデータを引き出した方が便利だ。 僕はLIVA Z2にUbuntu Serverを入れて運用している。gitでデータの同期をしたり、音楽ファイルを共有したり、nginxで外部に公開するまでもないサイトを表示したりしている。

t90chi

t90chiは2in1のWindowsタブレット。PPxとxyzzyの専用機として使っている。コンパクトで持ち歩くのには最適だが、流石にそろそろ後継機に切り替えたいところ。

バックアップ

容量が増えすぎたせいで、メディアに焼いてのバックアップはほとんど不可能になってしまった。今は、外付けHDDを使ってバックアップをしている。

2025年2月6日木曜日

ファイル振り分けモード

問題意識

未整理のまま放置されている大量のファイルを、別々のフォルダに振り分けたい場合がある。これを通常のファイル操作でやろうとすると、移動元フォルダと移動先フォルダを何度も行き来することになって面倒だ。 移動先フォルダのパスを、一時的にストックする仕組みを作ることで、この問題を解決する。

準備

以下を編集して取込。

-|K_furiwakemode =
-|K_furiwakemode2 =

K_furiwakemode    = {
C    ,*ppcfile copy,%su"mydesto"
M    ,*ppcfile move,%su"mydesto"
O    ,*ppc -r -bootid:x -single -k *mapkey use,K_furiwakemode2 %%: *linemessage Shift+Enterで操作先に指定
R    ,*RotateCustomize _User:mydesto %su"destonames" %: *linemessage 操作先を%su"mydesto"に変更
ESC    , *mapkey delete,K_furiwakemode %: *linemessage 振り分けモード終了
}

K_furiwakemode2    = {
\ENTER    ,*setcust _User:destonames=%su"destonames" , %FCD %: *linemessage %FCを登録しました
}

やり方

以下のコマンドを実行。

*mapkey use,K_furiwakemode %: *setcust _User:mydesto= %: *setcust _User:destonames= %: *linemessage 振り分けモード [O]操作先選択 [R]切り替え [ESC]QUIT

[O]を押すとサブ窓が開く。サブ窓上で[Shift+Enter]を押すと、カーソル下フォルダのパスが、操作先のパスとしてストックされる。必要なパスを登録したら、サブ窓を閉じよう。

メイン窓で[R]を押すと、操作先のパスを切り替えることができる。

[M]あるいは[C]でファイル操作ダイアログを表示すると、操作先パスが切り替わっていることが確認できる。

キーバインド

メイン窓

  • [C] コピー
  • [M] 移動
  • [O] 別窓を開いて操作先選択
  • [R] パスの切り替え
  • [ESC] モード終了

サブ窓

  • [Shift+Enter] 操作先に追加

2024年11月26日火曜日

PPx 2.00

PPxがメジャーバージョンアップをして、2.00になりました。おめでとうございます。1.00は2008年らしいので、私がPPxを使い始める前ですね。素晴らしいソフトとその作者さんに感謝を!

私とPPx

私は、2000年代初頭にPCを入手してすぐ、ソフトウェアカスタマイズに手を出し始めた。PPxの存在を知ったのは、覚えらんない人の「俺がランチャを捨てたわけ」という記事に、名前があがっていたからだと思う。

当時はソフトウェアカスタマイズブログがたくさんあったが、PPxの情報は比較的少なかった。2chでは、PPxは超高性能だがカスタマイズも超難解という評価で、ファイラースレには挫折した報告や、挫折せずに続ける方法を考察したレスなどがあった。専スレは内容が高度すぎて何を言ってるのかほとんどわからなかった。このような状況下で、ソフトウェアカスタマイズ界隈初心者の私は、PPxをただ仰ぎ見るだけだった。

2009年あたりになって、やっとPPxを使い始める。その時には、PPxについて解説したブログがいくつかあり、それを見ながら外部ソフトを起動する方法を調べたり、キーバインドをいじったりしていた。そのうち、自分でも記事を書くようになったみたいです。

2024年10月28日月曜日

書庫ファイル内の画像をサムネイルに

書庫ファイル内の画像ファイルをサムネイルにする。

準備

以下の二つのファイルをScriptフォルダに保存。

//!*script
// 書庫ファイルから画像を抽出する
// 7zipが必要
// 第一引数:書庫ファイルのパス
//
// 例:*setentryimage %*script(%0Script\getarchiveimage.js,%FCD) -save
// 引数がなければ終了
if (PPx.Arguments.Length < 1){
PPx.SetPopLineMessage("引数が正しくありません。");
PPx.Quit();
}
// 7z.exeのパス
//var exec = "C:\\Program Files\\7-Zip\\7z.exe";
const exec = PPx.Extract('%\'7z\'');
const tempdir = PPx.Extract("%*temp(name,d)");
const sorce_file = PPx.Arguments(0);
const fso = PPx.CreateObject("Scripting.FileSystemObject");
const allowExtensions = /\.(jpg|jpeg|png|gif)$/i; // 拡張子の指定
// 7zipで一時フォルダに解凍
const command = '%OBnsq ' + exec + '' + ' e -y ' + ' -o\"' + tempdir + '\" \"' + sorce_file + '\"';
PPx.Execute(command);
// ファイルパスを取得
const objFolder = fso.GetFolder(tempdir);
const enmFile = PPx.Enumerator(objFolder.Files);
for (; !enmFile.atEnd(); enmFile.moveNext()){
f_name = enmFile.item().Name.toUpperCase();
if (f_name.match(allowExtensions)){
const cover_path = PPx.Extract('%*name(BCD,"'+f_name+'","'+tempdir+'")');
PPx.Result = cover_path;
break;
}
}
//!*script
//
// 書庫ファイルの表紙画像をサムネイルにする
// カレントフォルダのマークファイルかつ書庫ファイルに対して実行
// このスクリプトと同じフォルダにgetarchiveimage.jsを置く必要
// e.g. *script %0Script\setarchiveimage_marked.js
const script_dir = PPx.Extract('%*name(KD,"' + PPx.ScriptName + '")');
const allowExtensions = /\.(zip|rar)$/i; // 拡張子の指定
// マークがない場合の処理
if (!PPx.EntryMarkCount) {
const filepath = PPx.Extract('%1') + "\\" + PPx.EntryName;
if (PPx.EntryName.match(allowExtensions)&& !(PPx.EntryAttributes & 16)){
const img = PPx.Extract('%*script('+script_dir+'\\getarchiveimage.js,"'+filepath+'")');
PPx.Execute("*setentryimage "+img+" -save");
}
} else {
// マークがある場合の処理
PPx.EntryFirstMark;
while(true){
const filepath = PPx.Extract('%1') + "\\" + PPx.EntryName;
if (PPx.EntryName.match(allowExtensions)&&!(PPx.EntryAttributes & 16)){
const img = PPx.Extract('%*script('+script_dir+'\\getarchiveimage.js,"'+filepath+'")');
PPx.Execute("*setentryimage "+img+" -save");
}
if(PPx.EntryNextMark != 1) break;
}
}

やり方

エントリ表示形式を、画像が含まれるものに変更する。とりあえずは、[;]で表示されるメニューから「サムネイル1」を選んでおけばいい。こうしないと、以下の過程で「no image mode」と言われてしまう。

カーソル下の書庫ファイルのサムネイルを変更したい場合は、以下のコマンドを実行する。

*setentryimage %*script(%0Script\getarchiveimage.js,%FCD) -save

複数の書庫ファイルのサムネイルを同時に変更したい場合は、ファイルをマークした後、以下のコマンドを実行する。

*script %0Script\setarchiveimage_marked.js

2024年10月26日土曜日

PPvでEPWING形式の辞書を引く(PPvを分割)

PPvを分割して別のPPvを開いたり閉じたりする動作が気に入ったので、PPv+EBWIN4もこの形式にしてみる。

必要なもの

EBWIN4には、EPWING形式の辞書をあらかじめ登録しておこう。

準備

以下の二つのファイルをScriptフォルダに保存する。dic.luaのEBWIN4のパスは環境に応じて読み替えてください。

--EBWIN4で検索した結果をファイルに出力
--第一変数:検索語
--第二変数:出力ファイルパス
ebwin="D:\\bin\\EBWIN4\\ebwinc.exe /C=1 /E=u"
nyagos.exec(ebwin .. " " .. arg[1] .. " > " .. arg[2])
view raw dic.lua hosted with ❤ by GitHub
//!*script
// PPvのカーソル位置にある文字を返す
// 単語が空白区切りであることが前提
// 例: *linemessage %*script(%0\Script\selectword.js)
var linetext = PPx.Extract('%*selecttext');
var lh = PPx.Extract('%lH');
// var blankpos = linetext.indexOf( ' ' );
// 文字列を左右に分割し、空白前/後を削除
var lstr = linetext.substr( 0, lh ).replace(/.*\s(.*?)$/, '$1');
var rstr = linetext.substr( lh ).replace(/^(.*?)\s.*/, '$1');
// 文字列を再結合
var str = lstr+rstr;
// 句読点等を取り除く
var result = str.replace(/(\.|\,|\"|\'|\!|\?|\;|\:)/g, '');
// ’以前を取り除く。フランス語の単語抽出用
var result = result.replace(/.*’(.*)$/, '$1');
// 文字数が45を超えていれば以降のコマンド実行を中止
if (result.length > 45){
PPx.SetPopLineMessage("文字数が多すぎます");
PPx.Quit(-1);
}
PPx.Result = result;
PPx.Quit();
view raw selectword.js hosted with ❤ by GitHub

以下を編集して取込。

_Command    = {    ; ユーザコマンド・関数
splitppv    = *string i,height0=%*windowrect(,h)
    *string i,height1=%*calc("%*arg(2)*%*windowrect(,h)/100")
    *string i,height2=%*calc("%*windowrect(,h)-%si"height1"")
    *windowsize %N,%*windowrect(,w),%si"height1"
    *ppv -bootid:X -k %%J"%*arg(1)" %%: *fitwindow %N,%%N,4 %%: *windowsize %%N,%*windowrect(,w),%si"height2" %%: *selectppx %n
ebwin2ppv = *string i,ratio=%*arg(1)
    *string i,tempfile=%*temp(name,f)
    %Oi nyagos -f %0Script\dic.lua %*script(%0Script\selectword.js) %si"tempfile"
    *ifmatch 0,0%NVX %: *splitppv %si"tempfile",%si"ratio" %: *mapkey use,K_splitppv %: *stop
    *execute VX,%%J%si"tempfile"
}

K_splitppv    = {
Q    ,*ifmatch !0,0%NVX %: %Oi *windowsize %N,%*windowrect(,w),%si"height0"
    *mapkey delete,K_splitppv
    *closeppx "%n,VX"
ENTER    ,*ifmatch !0,0%NVX %: %Oi *windowsize %N,%*windowrect(,w),%si"height0" %: *closeppx VX %: *stop
    *splitppv %si"tempfile",%si"ratio"
}

やり方

[I]でキャレットモードにしてから、辞書を引きたい単語を範囲選択して、以下のコマンドを実行する。

*ebwin2ppv 50

引数で分割の割合を変更できる。単位は百分率。半分にしたかったら50、四分の一なら75、とすればいい。 僕はマウス中クリックでこのコマンドを起動するようにしている。

MV_click    = {    ; PPv メイン窓
M_SPC    ,*ebwin2ppv 50
}

参考

つかさのほえほえ日記: PPvでEPWING形式の辞書を引く