2021-12-02

すでに起動したプロセスの出力をリダイレクト

起動済みのプロセスの出力のリダイレクトを変更する方法をメモする。 特に、バックグラウンドでプロセスを起動した後、出力を/dev/nullへリダイレクトしたくなることがある。

GDBでプロセスにアタッチする。

gdb -p 874046

以下のようにdup2を使う。
p (int)dup2((int)open("/dev/null", 00000, 0000), 0)
p (int)dup2((int)open("/dev/null", 02101, 0777), 1)
p (int)dup2((int)open("/dev/null", 02101, 0777), 2)
detach
quit

第2引数 (flags) のコードは、主要なものは以下の通り。
O_RDONLY00
O_WRONLY01
O_RDWR02
O_CREAT0100
O_APPEND02000

2021-10-11

OBS Studioの音声モニターをGoogle Meetへ送る方法

NDIからの音声を、Linux上のOBS Studioの音声モニターを経由して、Google Meetへ送る方法を考えている。 まだ音声が聞こえるかどうかまでは試していないが、アイデアを記事に残しておく。

手順

  1. loopbackモジュールをロードする。
    pactl load-module module-loopback sink=Virtual1
  2. OBS StudioとGoogle Meetを起動する。
  3. pavucontrolを起動し、OBS Studioのモニター出力をVirtual1へ切り替え、Google Meetの入力をVritual1.monitorへ切り替える。 (もしかすると、OBS Studioでモニターデバイスを予め設定しておく方が良いかもしれない。)

その他

おそらく、Zoomのように.monitorを除外するようなアプリケーションでは、この方法は使用できない。

2021-10-09

DNFで提供されるフィル一覧を取得する方法

DNFでパッケージが提供するファイル一覧をインストールする前に取得することができる。インストール前にどのようなファイルがダウンロードされるか知ることが出来て便利だ。
dnf repoquery -l package

RPMでは以下のコマンドに相当するが、インストールされているパッケージでないと表示してくれない。

rpm -qf package

また、ダウンロードしたRPMファイルでどのようなファイルがインストールされるかを見る場合、以下のようにRPMコマンドを使用する。

rpm -ql -- file.rpm
しかしながら、lesspipe.shに頼ってlessで開く方が早い。

2021-10-01

git grep で特定のファイルを除外する方法

gitでファイルを検索する際、特定のファイルだけ除外したい場合がある。 たとえば、
  • ソースコード中の文言を探したいが、翻訳ファイルは除外したい
といった用途がある。

このようなとき、以下のように:(exclude)をつけると、exclude_patternに該当するファイルを除外できる。

git grep regex path... ':(exclude)exclude_pattern'

2021-09-24

Redhat Enterprise Linux 9で何が新しくなるのか

Redhat Enterprise Linuxのアルファ版は、今の所Fedora 34がベースとなっているらしい。 Fedora 34を使用していてどんな違いがあるのか、メモを残しておく。

この記事は未完成で、これから加筆してゆく予定。

  • Kernel version: 4.18.0 -> 5.13.16
  • iostatでdiscard数・サイズも表示されるようになる。
  • qt6が加わる。
  • すべてのオーディオがPipewireを通るようになる。 [記事] 使用する上で何が変わるのか良くわからないが、音響を扱うなら知っておいて損はないだろう。
  • 2021-09-09

    Bashにて複数行の貼り付けが1コマンドになる

    Fedora 34のBashを使っていると、中ボタンクリックで改行付のコマンドを貼り付けると、コマンドが実行されなくなった。 例えば、
    pwd
    ls
    
    というテキストを貼り付けると、
    [user@localhost ~]$ pwd
    ls
    
    と表示され、改行を含めて一つのコマンドとしてプロンプトに入ってしまう。このあとEnterキーを押せば各行が実行されるのだが、これまで中ボタンクリックだけでコマンドを実行していたので、不便に感じている。

    解決方法は、~/.inputrcに以下の設定を追記する。

    set enable-bracketed-paste off
    起動済のbashの設定を変えるには、以下のコマンドを実行する。
    bind 'set enable-bracketed-paste off'

    参考記事:

    Rocket Lakeでvaapiを使用する方法

    Fedora 34で、Intel第11世代のCore i7でvaapiを使用する方法の概略をメモしておく。

    セットアップの概略

    1. rpmfusionをセットアップする。
    2. ffmpeg などをDNFでインストールする。
    3. libva libva-intel-driver などをDNFでインストールする。
    4. intel-media-driver をソースからビルドする。21.1.3では動作せず、21.2.3にしたら動作した。
      1. rpmfusionからsrpmをダウンロード
        dnf download --source intel-media-driver
      2. ダウンロードしたsrpmを展開
        rpm -Uvh intel-media-driver-21.1.3-1.fc34.src.rpm
      3. specファイルを編集
        vim rpmbuild/SPECS/intel-media-driver.spec
        Version, Source0, %changelog を編集した。
      4. ビルドしてインストールする
        rpmbuild -ba rpmbuild/SPECS/intel-media-driver-21.2.3.spec
        sudo rpm -Uvh /home/kamae/rpmbuild/RPMS/x86_64/intel-media-driver-21.2.3-1.fc34.x86_64.rpm

      使用

      LIBVA_DRIVERS_PATH=/usr/lib64/dri/ \
      LIBVA_DRIVER_NAME=iHD \
      ffmpeg \
      -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_output_format vaapi \
      -i input.mkv -vf 'format=nv12|vaapi,hwupload,deinterlace_vaapi,scale_vaapi=w=1920:h=1080' -c:v h264_vaapi -c:a copy -y output.mp4
      

      これ以外に、ソースからビルドしたOBS Studioでも動作した。

    2021-08-07

    Logi MX Master 3を使ってみた

    半月ほど前にLogiのマウスMX Master 3を購入した。

    マウス自体の使い心地

    やや重量が重たく、最初はしんどかったが、だんだん慣れてきた。 以前に使っていたものは100gほどだったが、MX Master 3は141gと40%ほど重量が増えた。40%くらいなら大したことないだろうと思っていたが、意外と重たく感じる。

    MagSpeed

    ホイールは電気的にラッチのオン・オフを切り替えられるようになっている。 ボタンを押すと切り替えられる以外に、ホイールを高速に回転させると自動でオフ、回転速度が落ちるとオンにもどるようになっている。 いちど回すと10秒間くらいは回り続け、ほぼ止まりかけるまで回転数が落ちるとカチッと音がして止まる。使っていて面白く、ついホイールを回したくなる。

    Linuxでの設定など

    solaarを引数なしで起動すると、GUIが起動して設定できる。

    solaarは便利なことに引数でCUI操作することもできる。 例えば、ホストを切り替えるには以下のようにコマンドを入れる。最初の2はマウスの番号、最後の1は切り替え先の番号。

    solaar config 2 change-host 1
    

    2021-06-04

    LinuxユーザーがMacOSを使っていて不便に感じたこと

    普段はXFCE4を使用しているが、MacOSを使ってみて不便に感じた所を挙げておく。

    端末

    端末内では選択でセレクションバッファ (のようなもの) へコピー、中ボタンクリックで貼り付けできる。 しかし、他のウインドウとコピー・ペーストを行うには、Super + C / Vを使用する必要がある。 使い分けが慣れない。

    ダブルクリックで、単語単位の選択だが、記号混じりも含めて選択するように設定できない。(設定が見つからなかった。) 例えば、git grepの結果からファイル名部分をダブルクリックした時、コロン (:) で区切られた左側全てを選択してほしいが、ハイフンなどが入っているとそこまでしか選択されない。

    文字が滲んで見える。

    日本語を表示させる方法が分からなかった。等幅フォントで日本語表示できるフォントが無いのだろうか?
    ⇒ LinuxにSSHログインした後、環境変数LC_CTYPEを消してLANG=ja_JP.UTF-8を設定したら、日本語を表示できるようになった。

    普段使っているフォント (VL Gothic) と異なるので、文字に違和感がある。

    ウインドウ操作

    セレクションバッファの機能がない。

    コピー・ペーストだけでなくかなり色々なショートカットが異なる。

    ツール / 機能LinuxWindowsMacOS
    ブラウザ / 新規タブCtrl + TCtrl + TSuper + T
    テキストボックス / 全て選択Ctrl + ACtrl + A???

    マウス

    マウスの加速に慣れない。 マウスを動かす速さに応じてカーソルの移動量が異なる。普段の動き方と異なり、目的の場所にマウスカーソルを動かすのが難しい。
    defaultsコマンドで設定できる。
    defaults write .GlobalPreferences com.apple.mouse.scaling 1.1

    ホイールにも加速がついており、回す速さに応じて、同じ角度だけ回しても移動量が変わる。 例えばブラウザで1ページ分だけスクロールしたい時にすばやく回すと、行き過ぎる。1行毎にゆっくり読みたいときには、移動量が少なすぎるが、少ないと感じて更に回すと行き過ぎる。

    2021-04-26

    自宅でのミーティングで使用する音響機器

    マイク - Shure SM58

    色々と迷った末に決め兼ねたので、定番のSM58を購入した。 購入当時は、X2Uという小形のUSB接続オーディオインターフェイスとセットで売られていたので、このセットを購入した。

    ノイズが十分に小さいことはもちろんだが、指向性が高くあまり周囲の音を拾わないことを期待して購入した。

    マイクから口が離れると音量が小さくなってしまうので、マイクに口を近づけることを常に意識する必要がある。

    オーディオインターフェイス - Shure X2U

    モノラルのXLR入力・ステレオの3.5mmステレオジャック出力 (ヘッドホン用) が着いている。 ミーティングではマイク1本で十分なので、モノラル入力がちょうどよい。

    出力側はあまり気に入っておらず、Volumeつまみを回すと左右の定位がふらつく、PCとマイクのバランスを出力するようになっており、PCからの音量を一定でマイクの音量だけを調整するなどが出来ないなど、問題を感じている。

    スピーカー - オンキョー GX-100HD

    会議ではイヤホンを使うこともあるが、音楽を聴くときなどにも使用している。 ディジタル入力がついている。10年以上前に購入したが、まだ壊れることなく使用できている。

    三脚

    マイクを立てるのに、スマートフォン用の三脚を使用している。 もともとはスマートフォン用に買ったが、ほぼマイクにつかっている。 なお、マイクホールダとカメラ三脚とではネジ径が異なるので、変換アダプターを使っている。

    オーディオインターフェイス - TI PCM2704

    TIのサイトで、サンプルとしてもらったもの。これに74HC04をドライバとしてRCAに出力する。材料費はトータルで500円くらいだろう。既成品よりもかなり安い。

    iPhone

    食事の準備などで動き回りながらミーティングを聴く時には、同時にiPhoneでミーティングに接続して持ち歩くこともある。 ただし、発言するときは、もう一方の端末に自分の声が出てハウリングの原因になるので、片方のスピーカーを切っておくように注意する。

    コロナ禍において買って良かった物・持っていて良かった物

    在宅で仕事 (Work From Home, WFH) をするようになり、1年ほど経った。 買っておいて良かった物、新たに買って良かった物を紹介する。

    食器洗い機

    パナソニック製のNP-TCB1を、コロナ前、就職してから少し経った頃に買った。 大学時代は大学近くに安価な飲食店が多かったため外食がほとんどだったが、就職して外食が割高になって自炊する機会がやや増えた。食器洗いが面倒だったので、購入した。

    コロナ禍で自宅で料理・食事することが増えたので、重宝している。 2-3人用を1人で使用しているが、料理時に具材を入れるのに食器を使ったなど、複数種類の大きめの食器があると一度には入り切らない。大きめの食洗機を買うか、並べて入れられるように形の揃った食器を使うのが良いだろう。

    私が購入したのは乾燥機能なしの最も安価なモデルだ。 食器を洗う際には90度程度の温水を使用するので、食器洗いが完了してすぐに扉を開けておくことで、乾燥機能は必要ない。 外出時に食器洗いを開始するような使い方をする場合には、乾燥機能が着いている方が良いと思う。また、Panasonicの最上位モデル NP-TZ300 には自動で扉を開ける機能がついているらしい。

    ロボット掃除機

    普段いる場所は綺麗な方が気分が良いが、自分で掃除機をかけるのは面倒だ。WFHが始まってしばらく経ってから、部屋を綺麗に保つためにロボット掃除機Eufy L70を購入した。

    L70はLIDARによるSLAM (Simultaneous Localization and Mapping) 技術が使われているロボット掃除機の中では比較的安価だったので、これを購入した。地図を作成・更新しながら動き回る様子を見ていると楽しい。掃除後にvacuum containerを取り出し、どれだけ掃除したのかを確かめながら掃除機でゴミを吸い取るようにしている。

    L70で十分な機能があると思うが、Roomba i7はさらに高機能らしい。 L70は曜日・時刻を指定して掃除する機能 (schedules) や部屋の場所を指定して掃除する機能 (zone clean) がついている。i7はこの組合せで、指定した時刻に特定の場所だけを掃除するなどもできるらしい。

    また、L70を使っていて気になるのは、掃除中に部屋の敷居を何度も踏み越えることだ。敷居に傷がつかないかと心配になる。

    空気清浄機

    昼間は天気・花粉・黄砂情報を確かめて換気するが、部屋の埃や花粉の対策で空気清浄機を使用している。 花粉やカビの胞子、PM2.5を捕捉できるよう、HEPAフィルターがついているものを選んだ。

    アーモンド

    この記事を読んで、アーモンドを間食用に購入するようになった。

    Amamzonギフト券のチャージ

    銀行振込の支払によってまとめてチャージすると、最大で2% (Prime会員で無い場合) のポイントが1ヶ月ほど経ってから付与される。 高額な商品をAmazonで買ったとき (上記の掃除機のこと)、Amazon Primeの無料体験と組合せてこの方法を使った。

    クレジットカード払いとは異なり1-2ヶ月ほど早く支払うことにはなるが、私が使っているクレジットカードでは1%しかポイントがつかないので、1%分多くポイントがつく。2ヶ月で+1%の利率を年に換算すると6%/年になるので、メリットがあると判断した。某証券会社で株式信用取引をすると3%ほどの利率がかかるが、それよりも良い。

    さほど多く使用しないなら、Amazon Mastercardクラッシックで1.5%のポイント取得をねらうのが良いだろう。

    その他

    2021-04-17

    DHCP classless static routesを使用したグローバルIPアドレスによるローカルサーバ接続

    はじめに

    自宅サーバーを運営していて、LANからもサーバーにアクセスしたい場合は、LAN向けにDNSサーバーを立てる方法がよく取られる。 これは、LANの接続点が1個のルーターであり、このルーター上でNATにより自宅サーバーへのアクセスをLANアドレスへ変換するようなネットワーク設定で取られる方法である。 この方法では、DNSサーバーで、自宅サーバーのホスト名を引いた時にLAN内のローカルアドレスを指すように設定しておく。 しかしながら、この方法では、携帯電話などでLANからWANへと移動した際に、古いアドレスがキャッシュに残っていてすぐには名前解決できなくなる。 ルーターによっては、このような設定を行わなくても、WANアドレスでのアクセスもNATでアドレス変換してくれることがあるが、いくつかのルーターではそのようなことができない。

    この記事では、上記の問題を回避する別の方法を紹介する。 LAN上でホストにIPアドレスを割り振る際にDHCPを使用するが、DHCPのオプション121で静的ルーティングテーブルを送ることができる。 サーバーのアドレスが頻繁には変更されない場合、ルーティングテーブルを送りつけることで、自宅サーバーのグローバルIPアドレスをクライアント側で実際のサーバーへルーティングすることができ、グローバルIPアドレスのままで自宅サーバーへ接続できるようになる。

    Dnsmasq

    今回の記事では、DHCPサーバーとしてdnsmasqを使用する。 サーバーのグローバルIPアドレスが203.0.113.40で、LAN上でのサーバーアドレスが192.168.0.2である場合、以下のように/etc/dnsmasq.confに設定する。
    dhcp-option=203.0.113.40/32,192.168.0.2
    

    ネットワークデバイスの設定

    雑な方法だが、NICにグローバルIPアドレスを追加すると、203.0.113.40宛のパケットが自身宛だと思い込み、通信出来るようになる。
    sudo ip addr add 203.0.113.40/32 dev enp11s0
    

    クライアント側での確認

    $ route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.0.1     0.0.0.0         UG    100    0        0 eth1
    203.0.113.40    192.168.0.2     255.255.255.255 UGH   100    0        0 eth1
    192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth1
    

    2021-01-30

    FFplay disappears when loosing focus

    デュアルディスプレイ環境で、片方にffplayで動画を再生しもう一方で作業しようとすると、ffplayがフォーカスを失ったときにウィンドウが消えるという問題に遭遇した。

    この原因は、SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSSというヒントが設定されているためで、これを無効にすればよい。

    以下のようにffplay.cに1行加えることで、問題を解決できた。

    diff --git a/fftools/ffplay.c b/fftools/ffplay.c
    index 9ff0425163..2e3d7a18cc 100644
    --- a/fftools/ffplay.c
    +++ b/fftools/ffplay.c
    @@ -3755,6 +3755,7 @@ int main(int argc, char **argv)
                 flags |= SDL_WINDOW_RESIZABLE;
             window = SDL_CreateWindow(program_name, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, default_width, default_height, flags);
             SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");
    +        SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, "0");
             if (window) {
                 renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
                 if (!renderer) {