錯誤試行

PCや生活の試行錯誤の成果を報告するブログ

Firefox Quantumでカスタマイズできないデフォルトショートカットキーを変更する

(2024/02/23)「omni.jaを編集する(zip使用)」を追記

FirefoxがQuantumになりキーカスタマイズアドオンのVimperatorが使えなくなってから久しい。
Vimperatorが開発終了となった当時、Chromeで同じく愛用していたキーカスタマイズアドオンのVimiumをFirefoxでも使ってQuantumに乗り換えるつもりでいたが、Vimiumでキーのリマップ設定をしてみたところ、Ctrl-Fで「ScrollDown」や、Ctrl-Pで「前のタブへ移動」など概ね問題なく設定できるのだが、「次のタブへの移動」に設定したCtrl-Nを押したところ、何かの呪いのように新しいウィンドウが開いてしまった。

以下に引用したVimiumの公式GitHubページのFAQによると、呪わしいことに、特定の(Ctrl-Nのような)Firefoxデフォルトのキーバインドは、拡張機能から書き換えることができないとのこと(Macだけはバインド可能らしい)*1

Why can't I remap Ctrl-N and similar keys on Linux and Windows?
Chrome won't let extensions like Vimium interfere with certain application-level key bindings.
(翻訳)
なぜLinuxWindowsでCtrl-Nのようなキーをリマップできないのですか?
ChromeはVimiumのような拡張機能を、特定のアプリケーションレベルのキーバインディングに干渉させません。

FAQ · philc/vimium Wiki · GitHub

これは使いものにならない…。

ということで、いたしかたなく今日までFirefox ESRとVimperatorを使い続けてきたが、今回デフォルトのキーバインドであるCtrl-Nを次のタブへの移動に置き換えることができたため、めでたくFirefox Quantumへ乗り換えする目処がついた。と言ってもFirefox本体ファイルの書き換えという姑息な(その場しのぎの)方法になってしまうのだが、大きな進歩ということで以下に残しておく。



目次


omni.jaを編集する

(追記:Firefox123.0でも有効であることを確認済。ただし編集する行が少し動いている。同じ記述の箇所を編集すればよい)

Firefoxのバージョンは76.0.1でUbuntu16.04にて使用している。
編集するのは/usr/lib/firefox/browser/omni.jaだが、このファイルはzipアーカイブになっておりこの中のファイルを編集する。
omni.jaはunzipで展開せずにNautilusなどのファイラーから書庫管理ソフト(「アーカイブマネージャー」)で開く。
→Firefox121.0ぐらいからNautilusomni.jaが書庫扱いされなくなってしまったのでzipで展開・圧縮することとした。omni.jaを編集する(zip使用)を参照。

chrome→browser→content→browserと開いていった下のbrowser.xhtmlが目的のファイルとなる。
今回は、Ctrl-Nで新しいウィンドウが開くのを無効にして、かつアドオンからCtrl-Nの書き換えができるようにしたいので、以下のように編集する(マイナスの行を削除、プラスの行を追加)。後は、VimiumでCtrl-NをnextTabに設定すればよい。

browser.xhtml 276行目~

     <keyset id="mainKeyset">
       <key id="key_newNavigator"
            data-l10n-id="window-new-shortcut"
    -       command="cmd_newNavigator"
    +       command=""
    -       modifiers="accel" reserved="true"/>
    +       modifiers="accel" reserved="false"/>

(GitHub - nilcons/firefox-hacks: How to make Firefox usable を参考に修正箇所を改変)

(OSをEmacsキーバインドにしていない場合は、この項目は読み飛ばしてOK)
「command="cmd_newNavigator"」の変更と、OSやアドオンによるEmacsキーバインド設定の衝突について

(ここをクリック・タップして開く)

command=""ではなく、command="Browser:NextTab"(次のタブへ移動)のようにしてもよいが、その場合「新しいタブ」で開いたページや設定画面でもキーバインドが有効のままになって便利なものの、OSレベルでEmacsキーバインドになっている場合(具体的にはUbuntuのgconf-editorコマンドで/desktop/gnome/interface/gtk_key_themeをEmacsにしている場合。以下同じ)に、複数行フォームでの入力時にカーソルを上から下に移動するつもりでCtrl-Nを押すと次のタブへ移動してしまって意図通りに動作しないため煩わしい。
また、キーカスタマイズアドオンのVimiumを使う際も同様に、「b」や「o」の単押しでVomnibarを開いてブックマークおよび履歴をインクリメンタルサーチの上、表示されたドロップダウンから項目を選択しようとしてCtrl-Nを押すと次のタブへ移動してしまい、これも意図しない動作になって煩わしい。
キーカスタマイズはアドオンだけにして、Firefox本体ファイルには手を加えないことにすると、OSレベルでEmacsキーバインドにしている場合の複数行フォームやVomnibarはCtrl-N・Ctrl-Pで上下移動できるが、新しいタブや設定画面ではキーバインドが無効になり、何よりCtrl-Nで次のタブに移動できなくなる。あちらを立てればこちらが立たずなので、どちらを取るかの選択となる。

(追記)キーカスタマイズアドオンのTridactylでは、OSレベルでEmacsキーバインドにしている場合のCtrl-N・Ctrl-Pによる複数行入力フォームやコマンドモードでの上下移動とタブの前後移動が両立することを確認した。設定方法はこのブログのTridactylのエントリ(Tridactylのキーカスタマイズ(モード別に変更など) - 錯誤試行)を参照。

また、新しいタブや設定タブなどでCtrl-Pを押すと印刷ダイアログが開いてしまうのも封殺しておきたい。
300行目

-    <key id="printKb" data-l10n-id="print-shortcut" command="cmd_print"  modifiers="accel"/>
+    <key id="printKb" data-l10n-id="print-shortcut" command=""  modifiers="accel"/>

最後に、アドレスバーからabout:profilesを開いて「アドオンを無効にして再起動」を選び、開いたセーフモード起動のウィンドウを閉じて起動し直すと設定が反映される。

以上でだいぶFirefox Quantumが快適に使えるようになった。
ただ、ここまでやってきて何なのだが、別にVimiumデフォルトのキーバインドである「J」や「K」でタブ移動してもいいような気がしてきた。Ctrl-N・Ctrl-Pよりさらにホームポジションから指を動かさなくてよいから楽だし(セミコロンをワンショットモディファイヤでShift化していれば右手だけでタブ移動できてしまう)。しかし、やはり手に馴染んでいるのはCtrl-N・Ctrl-Pの方なので設定は必要といえる。

omni.jaについての補足

omni.jaは展開せずに中のファイルを編集すること

(2024/2追記)

Firefox121.0ぐらいからNautilusomni.jaが書庫扱いされなくなってしまったのでzipで展開・圧縮することとした。後述のomni.jaを編集する(zip使用)を参照。

先にomni.jaはunzipで展開せずにNautilusなどのファイラーから書庫管理ソフト(「アーカイブマネージャー」)で開く旨を記載したが、その理由は、omni.jaをunzipで展開して中身を編集した後に、zipコマンドで圧縮して元の位置に戻してもfirefoxが起動しないため。
unzipでの展開後、全くアーカイブの中身を変えずにzipで圧縮の上、元の位置に戻してもfirefoxは起動しないので、おそらく圧縮形式の違いが原因と思われる(zipコマンドで圧縮すると元のファイルサイズより太ってしまう)。このためzipアーカイブのまま編集する必要がある。

omni.jaの編集が反映されるタイミングについて

about:profilesを開いて「アドオンを無効にして再起動」を選び、開いたセーフモード起動のウィンドウを閉じて起動し直すとomni.jaの編集内容が反映された。
または、~/.mozilla/firefox/(プロファイル名) 以下のjsonファイルを全て移動ないし削除してもomni.jaの変更が反映された。
設定で参照したサイトの説明によると、omni.jaの設定を反映させるにはキャッシュフォルダを消せばよいらしい。その方法はリンク先を参照。

キー定義ファイル(browserSets.ftl)について

omni.ja内の「localization/en-US/browser/browserSets.ftl」でキー定義がされている。ここに記述されているキー定義を変えて~/.mozilla/firefox/(プロファイル名) 以下のjsonファイルを全消しして再起動すると変更が反映される。設定すれば、「Ctrl-X」で新しいウィンドウを開くといったことができた。

omni.jaを編集する(zip使用)

Firefox121.0ぐらいから、Nautilusでomni.jaが書庫扱いされなくなってしまったのでその対応について。
omni.jaをomni.ja.zipにリネームしてunzipで展開する。中身のファイルを編集するのは同じ。ファイル編集後、展開したディレクトリをzipで圧縮してomni.jaとして配置してもFirefoxは起動しない。再圧縮したomni.jaを確認するとオリジナルよりもファイルサイズが小さくなってしまっているようなので、圧縮率が悪い動画・音声ファイルなど(今回は30MB程度のmp3を使用)をomni.jaを展開したディレクトリ内に入れた上で作成したzipファイルをomni.jaとして配置してやるとFirefoxが正常に起動した。
おそらく起動時にファイルサイズをチェックしているのではないかと思われる。
(追記:2024/4/1)Firefox124.0.1に更新したところ、この「嵩増し」は不要になっていた。omni.jaを展開してbrowser.xhtmlを編集してzipで圧縮、omni.jaとして配置するだけで起動した。

参照サイト

*1:なお、ChromeのVimiumではCtrl-Nで次のタブがバインドできている

PT3+epgrec UNAでGUIメニューからのサスペンド復帰後に録画失敗するのを防止する

PT3+epgrec UNAを専用の録画サーバではなく普段使いのデスクトップPCで使用しているが、普段使いのデスクトップPCなのでサスペンドをすることがある。PT3をlinuxで使う際、サスペンドからの復帰で番組受信ができなくなる不具合があるが、「DN2800MT + CentOS6.3 + PT3 ACPI サスペンド : 事象の水平線 :」 に掲載されている方法で対応できている。
ただ、pm-suspendを実行してもウンともスンとも言わない場合があり、そのようなときにうっかりGUIメニューからサスペンドを実行してしまうと、サスペンド復帰後に番組受信ができず予約録画に失敗する。これで何度か煮え湯を飲まされたので対応することにした。

ユーザwww-dataでsudoコマンドを実行できるようにする(modprobeコマンド限定)。

sudo visudo
# 以下を追記
www-data ALL=(ALL) NOPASSWD:/sbin/modprobe

reclib.phpの913行目に以下「+」の箇所を追記する。

<?php
if( $st['exitcode'] !== 0 ){
    reclog( 'command error['.$st['exitcode'].'] '.$cmd.$rststk, EPGREC_WARN );
+   // チューンできていないようならドライバをロードする
+ 	 if (strpos($rststk,'Cannot tune to the specified channel') !== false){
+ 	   	exec('sudo /sbin/modprobe -r pt3_drv && sudo /sbin/modprobe pt3_drv');
+ 	    }
    return 2;
}else
    if( $rst_view && $rststk!=='' )
?>

またリアルタイム再生の場合にも同様に、GUIメニューからのサスペンド復帰で再生に失敗した際、コマンドを手打ちしてドライバをアンロード・ロードするのが面倒なので、自動で行なわせるようにする。
sendstream.php 271行目〜に「+」の箇所を追記する。

<?php
// 常駐失敗? PID取得失敗
$errno = posix_get_last_error();
reclog( 'sendstream.php::録画コマンドPID取得失敗('.$errno.')'.posix_strerror($errno ), EPGREC_WARN );
+ // おそらくドライバの問題なのでロード
+ exec('sudo /sbin/modprobe -r pt3_drv && sudo /sbin/modprobe pt3_drv');
?>

参照サイト

epgrec UNAで放送大学が録画・視聴できない(解決)

2020/4に放送大学の番組を録画したところ、ファイルはできているものの再生することができず、トランスコードも終了していない。また番組表から放送大学の視聴リンクをクリックしてのリアルタイム視聴もできない。3月までは問題なく視聴・再生ができていた。
調べてみると、参照サイトに挙げた情報が見付かったので、情報を元にrecpt1.cを修正してコンパイルし、epgrecデータベースの放送大学のチャンネルをBS11_2からBS11_1に修正すると問題なく番組表からのリアルタイム視聴が可能となったが、EPG番組表が更新されると放送大学のチャンネルが元のBS11_2に戻ってしまう。
これはepgrec UNAがEPGデータからチャンネルの更新を行なっているためである。
EPGデータから更新処理を行なうstoreProgram.inc.phpの227行目にある「BS/CSチャンネル番号変更」の箇所をコメントアウトしてチャンネル番号の変更処理が行なわれないようにして、ひとまず対応した。
(storeProgram.inc.php 227行目)

// BS/CSのチャンネル番号変更
 if( $type !== 'GR' ){
  // 放送大学のチャンネル更新不具合のためこの処理をコメントアウト
  /*
 	$tmp_ch = $type==='BS'? 'BS'.$ch['node'].'_'.$ch['slot'] : $type.$ch['node'];

276行目に閉じ括弧があるため、この直前までをコメントアウトする。

 			unset( $rev );
 		}
 	}
*/
}

(2023/8追記)
いつの間にかまた放送大学の視聴ができなくなっていた。番組表は正常に取得されているものの、「視聴」をクリックしてもウンともスンとも言わない。
どうやらまたBSでチャンネル再編があった模様。今回はepgrecUNAデータベースのRecorder_channelTblテーブルで定義されているチャンネル番号を変更するだけで対応できた。

 update Recorder_channelTbl set channel='BS11_0' where sid=231;
 update Recorder_channelTbl set channel='BS11_0' where sid=232;
 update Recorder_channelTbl set channel='BS11_0' where sid=531;

参照サイト

Ubuntu16.04 LTSにAndroid端末をつないでUSBテザリングする

USBテザリングをONにしたAndroid端末を接続しても、ネットワーク接続が自動では有効にならなかったので、接続する手順のメモを残す。

Android端末の接続前と接続後でifconfigを実行し、端末の接続後に増えた接続を確認する。

Super(Windowsキー)を単押ししてDashを起動し「ネットワーク接続」を検索して開く。

「追加」で接続の種類をEthernetとして、Ethernetタブの「デバイス」に先ほどifconfigコマンドで調べた、増えた接続を指定して新たな接続を作成すると接続される。

なお、調べてみるとdhclientコマンドの引数にifconfigで増えた接続を指定して実行すると接続される旨書かれているページがあったが、そのようにするとネットワーク接続に新たな接続は表示されるものの、実際に接続しようとするとエラーが出て接続することができなかった。

epgrec UNAの録画済一覧の動画リンク切れを修正する(解決)

2015年からepgrecを派生バージョンのepgrec UNAに変更して使用している。epgrec UNAは本家epgrecと比較して、リアルタイム視聴に対応するなど機能拡張がされており大変重宝している。
ただ一つ困っているのが、録画番組の変換失敗や録画ファイルの整理でmp4などに変換したファイルが既定の位置に無い状態で録画済一覧の画面を開くと動画へのリンクが切れてしまい、既定の位置に動画ファイルを存在させてもリンクが復活しない点で、ファイラーから開けば動画自体は見られるが、録画済一覧の画面から開けないのも不便なので何とかしたい。
これは、以下のようにしてepgrec UNAデータベースのRecorder_transcodeTblテーブルにレコードを作ると復活する。このテーブルに登録されているレコードは、pathフィールドのファイル名が既定の位置に存在しなくなったりしておかしなデータになると、自動に削除され、録画済一覧画面の動画リンクが切れる模様。

insert into Recorder_transcodeTbl (rec_id,rec_endtime,enc_starttime,enc_endtime,mode,name,status,ts_del,pid,path) values (9999,"2018-05-13 00:00:00","2018-05-13 00:00:05","2018-05-13 00:30:05",4,"録画モード名",2,0,99999,"動画ファイルへの絶対パス");

rec_idは録画済一覧のリンクをポイントしたときに表示されるURLのreserve_id=の後の数値を指定する。mode,nameは録画モードとその名前。rec_endtime,enc_starttime,enc_endtime,status,ts_del,pidは適当な値で良いと思われるので他のレコードを真似る。idlフィールドはオートインクリメントなので指定不要。

Emacs24.4でorg-mode7を使う

Emacs24.4からorg-modeがバージョンが8となっておりエクスポートオプションや書式が変化している。画像のscaleオプションも見当らず、不便なためorg-mode7を使えるようにした。
以下の記事でorg-mode7のソースからのインストール方法が紹介されているので参照してインストールを行なった。

上記リンク先記事中のorg-mode7のファイルリンク(http://orgmode.org/org-7.8.09.tar.gz)はこのエントリを作成した2018/4時点でまだ有効だった(なお、org-mode公式サイト*1には旧バージョンへのリンクは見当らない)。
上記リンク先の記事の設定はMacを前提としている。linuxではMakefileを以下のようにする(各ディレクトリへのパスは自分の環境を確認のこと)。本来は"datadir"も変更が必要かもしれないが今回は変更しなかった。

prefix=/usr
lispdir = $(prefix)/share/emacs24/site-lisp/org-mode
infodir = $(prefix)/share/emacs/24.4/info

上記リンク先の記事の手順3の.emacsの記述については既にorg-modeの設定が済んでいれば特に必要ない。
また、このままだと元々インストールされているorg-mode8が起動してしまうため、org-mode7が優先して起動するように.emacsに以下のような書式で記述して優先度を変更する。

(setq load-path (cons "優先度を上げたいディレクトリ" load-path))

(Emacsテクニックバイブル~作業効率をカイゼンする200の技 - Google ブックス p.36より)
具体的には以下のようにする。

(setq load-path (cons "/usr//share/emacs24/site-lisp/org-mode/" load-path))

以上で晴れてorg-mode7が使えるようになった。