トップ 追記

Masa's blog

検索キーワード:

2025年06月22日 Slackware64-currentでsendmail-8.18.1のビルド失敗 [長年日記]

_ Slackware64-currentで

slackpkg -batch=on -default_answer=y upgrade-all

したところ、icu4c-76からicu4c-77にバージョンアップしたためsendmailが一部のライブラリを動的リンク出来なくなり起動しなくなった。

sendmailはextraパッケージから自分でビルドする必要があるので、いつも通りに行ってみると以下のエラーが出た。

vfscanf.c:249:30: error: assignment to ‘ULONGLONG_T (*)(const char *, char **, int)’ {aka ‘long long unsigned int (*)(const char *, char **, int)’} from incompatible pointer type ‘ULONGLONG_T (*)(void)’ {aka ‘long long unsigned int (*)(void)’} [-Wincompatible-pointer-types]
  249 |                         ccfn = (ULONGLONG_T (*)())sm_strtoll;
      |                              ^
vfscanf.c:327:30: error: assignment to ‘ULONGLONG_T (*)(const char *, char **, int)’ {aka ‘long long unsigned int (*)(const char *, char **, int)’} from incompatible pointer type ‘ULONGLONG_T (*)(void)’ {aka ‘long long unsigned int (*)(void)’} [-Wincompatible-pointer-types]
  327 |                         ccfn = (ULONGLONG_T (*)()) sm_strtoll;
      |                              ^

この手のエラーはコンパイラのバージョンが新しすぎてエラーチェックが厳しくなっているため、古めのソースだとよく出るやつ...

こんな時はLinuxQuestions.orgで尋ねるに限る。

あっという間(4時間程度)でレスが付き、パッチを3種類提供していただけました。

もちろんパチッを適用後はビルドがサックリ完了。ありがたや :)


2025年04月14日 Windows 11 Insider Preview 10.0.26120.3863 (ge_release_upr) インストールエラー 0xc1900209 [長年日記]

_ エラーコード 0xc1900209 は、Windows 11 Insider Preview のインストール中に互換性の問題が検出されたことを示しているらしい。これは通常、インストールを妨げているアプリケーションやドライバが原因とのこと。

インストールログを調べるには、以下のパスにあるログファイルを確認。

C:\$WINDOWS.~BT\Sources\Panther\CompatDataXXXX.xml

ログの抜粋。

<CompatibilityInfo BlockingType="Hard" Message="お使いの PC は、このバージョンの Windows ではまだサポートされていません。
Windows Updateは、問題が解決されると、このバージョンの Windows を自動的に提供します。
" Title="この PC をこのバージョンの Windows にアップグレードすることはできません。"/>
<DriverPackage Inf="oem58.inf" BlockMigration="True" HasSignedBinaries="False"/>
<DriverPackage Inf="oem57.inf" BlockMigration="True" HasSignedBinaries="False"/>

BlockMigration="True" かつ HasSignedBinaries="False" となっており、署名されていない or 不適切なドライバが移行をブロックしているもよう。

ドライバの情報を検索してみる。

pnputil /enum-drivers

一部を抜粋。

公開名:     oem57.inf
元の名前:      prnms009.inf
プロバイダー名:      Microsoft
クラス名:         Printer
クラス GUID:         {4d36e979-e325-11ce-bfc1-08002be10318}
クラス バージョン:      4.0
ドライバー バージョン:     06/21/2006 10.0.22621.1
署名者名:        Microsoft Windows

古いプリンタドライバ(?)らしい...

とりあえず削除してみる。

pnputil /delete-driver oem57.inf /uninstall /force
pnputil /delete-driver oem58.inf /uninstall /force

下記のエラーメッセージが出て削除できず。

ドライバー パッケージがアンインストールされました。
ドライバー パッケージを削除できませんでした: ひとつ以上のデバイスが現在、指定された INF を使用してインストールされています。

regeditで「oem57.inf」「oem58.inf」を検索し、全て削除。

以上の対応で、Windows 11 Insider Previewのインストールエラーが解消 d(^^)。


2025年04月13日 vmware上の仮想Windows11ProでMACアドレスの取得が不正になる場合の対応 [長年日記]

_ ホストOSがLinuxで、仮想OSがWindows11 Pro(192.168.0.10)で運用しているが、何故かWindows11 Proがゲートウェイ(192.168.0.100)のMACを動的に誤った値で取得してしまう。以下のコマンドで静的に登録することで対応。

PS C:\Windows\System32> arp -d 192.168.0.100; netsh interface ipv4 delete neighbors "Ethernet0" 192.168.0.100; netsh -c "interface ipv4" add neighbors "Ethernet0" 192.168.0.100 xx-yy-zz-47-e3-ec
OK

google検索だけでは埒があかなかったが、ChatGPTと会話を重ねることで解決!


2025年03月22日 xfce4-terminal内のメールアドレス文字列をCTLR+左クリックした時に起動するメーラの設定 [長年日記]

_ xfce4-terminal内のメールアドレスっぽい文字列をCTRL+左クリックするとemacsのデフォルトメーラが起動する。これをmewに変更したい。

_ メーラとして設定するスクリプト

$ cat ~/etc/mailer.sh
#! /bin/sh
#
# (mew-user-agent-compose "address1,address2," "subject")
#
xfce4-terminal -e "emacs -nw --eval \"(mew-user-agent-compose \\\"$1\\\" nil)\""

_ 設定コマンド

$ xfce4-mime-settings

上記のコマンドでGUIの設定ツールが起動する。

_ 設定ファイル

設定内容は以下のファイルに記録される。

$ cat ~/.local/share/xfce4/helpers/custom-MailReader.desktop
[Desktop Entry]
NoDisplay=true
Version=1.0
Encoding=UTF-8
Type=X-XFCE-Helper
X-XFCE-Category=MailReader
X-XFCE-CommandsWithParameter=mailer.sh "%s"
Icon=mailer.sh
Name=mailer.sh
X-XFCE-Commands=mailer.sh

以上


2025年02月24日 USB Sound Blaster Digital Music SX with Slackware [長年日記]

_ USB Sound Blaster Digital Music SX

USB Sound Blaster Digital Music SXという古いオーディオインターフェースを入手したのだが、ヘッドフォンから再生される音も、マイク端子からの音もバリバリとノイズまじりになる。pulseaudioのデフォルトサンプリングレートが44100Hzに対し、SXの方は48000Hzしか対応していないらしい。

そこで~/.config/pulse/daemon.confに以下を記述し、

default-sample-rate = 48000

pulseaudioを再起動すると改善される。

$ pulseaudio -k
$ pulseaudio --start --log-target=syslog

2025年02月20日 spf record for no-ip [長年日記]

_ spf record for no-ip

v=spf1 a:myh.no-ip.org include:hcn.zaq.ne.jp ~all

2025年02月11日 pulseaudioによる合成マイク作成 [長年日記]

_ pulseaudio環境でヘッドフォンから再生されている音声とマイク入力を合成して録音するために、仮想の合成マイクを作ってみた。

_ 仮想の出力デバイス(VOUT)を作成し、そこへの出力を取り込むためのデバイス(VOUT.monitor)に名称(MONITOR.VOUT)を設定する

$ pacmd load-module module-null-sink sink_name=VOUT
$ pacmd update-sink-proplist VOUT device.description=VOUT
$ pacmd update-source-proplist VOUT.monitor device.description=MONITOR.VOUT

_ VOUTに出力するためのソースを確認する

$ pacmd list-sources|egrep name:
name: <alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__HDMI3__sink.monitor>
name: <alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__HDMI2__sink.monitor>
name: <alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__HDMI1__sink.monitor>
name: <alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__Headphones__sink.monitor>
name: <alsa_input.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__Mic2__source>
name: <alsa_input.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__Mic1__source>

_ VOUTにマイクの入力を接続する

$ pacmd load-module module-loopback source=alsa_input.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__Mic1__source sink=VOUT

_ VOUTにヘッドフォンの再生音声を接続する

$ pacmd load-module module-loopback source=alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__Headphones__sink.monitor sink=VOUT

_ 仮想のソース(VOUT.monitor)を確認する

$ pacmd list-sources|egrep name:
name: <alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__HDMI3__sink.monitor>
name: <alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__HDMI2__sink.monitor>
name: <alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__HDMI1__sink.monitor>
name: <alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__Headphones__sink.monitor>
name: <alsa_input.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__Mic2__source>
name: <alsa_input.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__Mic1__source>
name: <VOUT.monitor>

_ ffmpegを使って録音してみる

$ ffmpeg -f pulse -i VOUT.monitor output.mp3

_ 仮想合成マイクを削除する

$ pacmd unload-module module-loopback
$ pacmd unload-module module-null-sink

2025年01月19日 Audacityの自分用メモ... [長年日記]

_ ホワイトノイズ除去

  • 無音部分を選択
  • エフェクト->ノイズ除去と修復->ノイズを低減->ノイズプロファイルを取得
  • 全選択
  • エフェクト->ノイズ除去と修復->ノイズを低減->[OK]
  • ファイル->オーディオをエクスポート

_ 音量のノーマライズ

  • 全選択
  • エフェクト->音量と音圧->ノーマライズ->適用

_ 表示拡大縮小

  • Ctrl-1 表示拡大
  • Ctrl-2 表示リセット
  • Ctrl-3 表示縮小

_ カーソル移動

  • 位置付:左右カーソルキーまたはクリック
  • トラックの先頭:J
  • トラックの末尾:K

_ 選択

  • 選択:Shift+左右カーソルキー
  • 全選択:Ctrl+A 又は 波形上をダブルクリック
  • 解除:Alt+S N

_ 選択範囲を再生範囲に設定&解除

  • 設定:Shift+L
  • 解除:Shift+Alt+L

_ ループ再生設定&解除

  • 設定&解除(トグル):L

_ 再生&停止

  • スペース(トグル)

_ 録音&停止

  • 選択トラックに追加:R
  • 新規トラック:Shift+R
  • 停止:スペース

_ 再生録音一時停止

  • P

_ 新規トラック追加

  • ステレオ:Alt+T N S
  • モノラル:Alt+T N M

_ 繰り返し

  • 選択
  • エフェクト->特殊->繰り返し->繰り返し回数の追加->適用

2024年12月27日 python 仮想環境 [長年日記]

_ python 仮想環境

仮想環境作成

mkdir _AppName_
cd _AppName_
python -m venv --upgrade-deps .venv
  • .venv は推奨のディレクトリ名

仮想環境の活性化

source .venv/bin/activate

パッケージのインストール

最新版

pip install _PackageName_

指定バージョン

pip install _PackageName_==_Version_

パッケージの更新

pip install -U _PackageName_

インストール可能バージョンの確認

pip index versions _PackageName_

インストールしたパッケージの一覧

pip freeze
pip freeze >requirements.txt

パッケージの削除

pip uninstall _PackageName_
pip uninstall -r requirement.txt -y

インストールしたパッケージの一括再インストール

pip install -r requirements.txt
  • 同じ仮想環境を複製したい場合に行う。

全パッケージの一覧

pip list
pip list --format=freeze

最新でないパッケージの一覧

pip list -o

最新状態のパッケージの一覧

pip list -u

仮想環境の非活性化

deactivate

仮想環境のpythonバージョンをローカルのバージョンに合わせる

python -m venv .venv --clear
  • 実行後は自分でインストールしたパッケージが削除されているので、再インストールが必要。
pip install -r requirements.txt

2024年12月07日 Docker on Slackware64-current [長年日記]

_ Docker on Slackware64-current

DockerをSlackware64-currentに導入してみた。基本的にはPonceさんのGithubからSlackbuildスクリプトをダウンロードしてきて諸々をビルドしていく。 ソースはSlackbuild内の*.infoに記述されているので、そこからダウンロードする。 ビルドする際にはsuではなくsu -でrootになって行う。

ビルド後source /etc/profile.d/go.shを実行し、gcc-goではなくgoogle-go-langが優先して実行されるように設定し、以降のビルドを行う。 go.shはビルド時のみ必要で、Docker実行時には必要ない。

chmod +x /etc/rc.d/rc.libvirt

/etc/rc.d/rc.local

if [ -x /etc/rc.d/rc.libvirt ]; then
	/etc/rc.d/rc.libvirt start
fi
chmod +x /etc/rc.d/rc.docker

/etc/rc.d/rc.local

if [ -x /etc/rc.d/rc.docker ]; then
	/etc/rc.d/rc.docker start
fi

_ 動作確認

以下のコマンドを実行し

$ docker run hello-world

以下のような表示がされればOK

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:305243c734571da2d100c8c8b3c3167a098cab6049c9a5b066b6021a60fcb966
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

$

_ docker(基本)

実体

/var/lib/docker/

docker hub(https://hub.docker.com/)からコンテナイメージを取得

docker pull _ContainerImage_:_Tag_
  • :_Tag_ 未指定時は :latest を指定したとみなす。

コンテナイメージからコンテナを生成し実行する

docker run --name _ContainerName_ \
           -it \
           -e _EnvName_=_Value_ [-e ...] \
           -p _LocalPort_:_ContainerPort_ [-p ...] \
           -v _LocalDir_:_ContainerDir_ [-v _VolumeName_:_ContainerDir_] \
           --net _NetworkName_ --expose _OpenPort_ \
           -d \
           _ContainerImage_:_Tag_
-it
ローカルとコンテナの標準入出力を紐づける
-p
外部からのアクセス用ポート指定
-v _VolumeName_
_VolumeName_docker volume create で作成しておく
--net _NetworkName_
_NetworkName_docker network create で作成しておく
--expose _OpenPort_
コンテナ間通信用に公開するポート
-d
バックグラウンドで起動する
  • ローカルにコンテナイメージが存在しない場合は、自動的にdocker hubからpullしてくる。

生成済のコンテナを実行する

docker start _ContainerName_

コンテナを停止する

docker stop _ContainerName_

コンテナの削除

docker rm _ContainerName_

コンテナイメージの削除

docker rmi _ContainerImage_

コンテナの一覧

docker container ls -a

コンテナイメージの一覧

docker image ls -a

コンテナプロセスの一覧

docker ps -a

コンテナ内でコマンド実行

docker exec -u _UserName_ \
            -w _WorkingDir_ \
            -e _EnvName_=_Value_ [-e ...]\
            -it \
            _ContainerName_ \
            /bin/_AnyCommand_ arg1 arg2 ...

ボリュームの生成

docker volume create _VolumeName_

ボリュームの確認

docker volume inspect _VolumeName_

ボリュームの一覧

docker volume ls

ボリュームの削除

docker volume rm _VolumeName_

Bridgeネットワークの作成

docker network create _NetworkName_

ネットワークの削除

docker network rm _NetworkName_

_ コンテナイメージの作成

コンテナイメージの定義(Dockerfile)

# ベースイメージ
FROM ubuntu:latest

# コンテナ起動時のカレントディレクトリ
WORKDIR /var/www/htdocs

# コンテナ生成時にローカルからコンテナにファイルをコピーする
COPY index.html ./
COPY .htaccess ./

# コンテナ生成時にコンテナ内でコマンドを実行する
RUN apt update && \
    apt install -y -q apache && \
    apt install ..snip..

# コンテナ起動時に実行するコマンド
ENTRYPOINT["/etc/rc.d/rc.httpd"]
CMD ["start"]

CMDdocker run の引数で置き換えることが可能。

docker run ...snip... _ContainerImage_:_Tag_

/etc/rc.d/rc.httpd start を実行する。一方、

docker run ...snip... _ContainerImage_:_Tag_ stop

/etc/rc.d/rc.httpd stop を実行する。

コンテナイメージ生成

docker build -t _ContainerImage_:_Tag_ .

_ composeによる複数コンテナの管理

YAML(compose.yaml)による定義

version: '1'
services:
  app1:
    build: .
    container_name: _ContainerName_
    working_dir: _WorkingDir_
    volumes:
      - _LocalDir_:_ContainerDir_
      - _VolumeName_:_ContainerDir_
    ports:
      - "_LocalPort_:_ContainerPort_"
    depends_on:
      - app2

  app2:
    image: _ContainerImage_:_Tag_
    container_name: _ContainerName_
    environment:
      _Environ_: _Value_
    volumes:
      - _LocalDir_:_ContainerDir_
      - _VolumeName_:_ContainerDir_

volumes:
  _VolumeName_:

composeでコンテナ群を生成&開始

docker compose up -d --build
  • --build コンテナが存在してもイメージから再作成する
  • すべてのサービスが自動的に生成された単一のネットワークに接続されている
  • サービス名(例 app1,app2)がホスト名になる

composeでコンテナ群を停止&削除

docker compose down

composeでコンテナ群を開始

docker compose start -d

composeでコンテナ群を停止

docker compose stop

composeでコンテナプロセス一覧

docker compose ps -a

composeでコマンド実行

docker compose exec -u _UserName_ \
                    -w _WorkingDir_ \
                    -e _EnvName_=_Value_ \
                    app1 \
                    /bin/_AnyCommand_ arg1 arg2 ...