メモ:ffmpeg (mp4→mp4)ストリームをそのままコピーするシェルスクリプト

この記事は

ffmpegを使用して、映像/音声/字幕だけをコピーする作業が必要だったので色々勉強しているうちに辿り着いた解答を残すためのものです。
その時々で仕様等が変更されるでしょうから、この記事を確認された時点では少しの改良が必要かも知れません。
MEPG2-TSの場合、ffmpegコマンドでの出力が変わってくるので、cutコマンド・trコマンドをいじる必要があります。
もしかしたら、libassオプションを追加しないと動かないかも知れません・・・

前提条件

・FreeBSD 12.1-RELEASE/amd64
・ffmpeg 4.2.2 (multimedia/ffmpeg)

コードと解説

#!/bin/sh
: 一応使用方法ですが、コマンドに対してmp4ファイルへの引数が必要です。
:
:
: とりあえず、ディレクトリとファイル名(拡張子なし)、拡張子を分離。
: コピー先のファイルパスを生成するため。(ffmpegコマンドでエンコード時に指定する)
FILE_DIR=$( cd `dirname ${1}`; pwd )
FILE_TITLE=$( basename ${1%.*} )
FILE_EXT="${1##*.}"
:
:
: 映像のマッピング。
ENCODE_OPTION_VIDEO=""
for map in $( ffmpeg -i ${FILE_DIR}/${FILE_TITLE}.${FILE_EXT} 2>&1 | grep "Stream" | grep "Video" | cut -f1 -d '(' | cut -f2 -d "#" )
do
    ENCODE_OPTION_VIDEO="${ENCODE_OPTION_VIDEO} -map ${map} -c:v copy"
done
:
:
:
: 音声のマッピング。
ENCODE_OPTION_AUDIO=""
for map in $( ffmpeg -i ${FILE_DIR}/${FILE_TITLE}.${FILE_EXT} 2>&1 | grep "Stream" | grep "Audio" | cut -f1 -d '(' | cut -f2 -d "#" )
do
    ENCODE_OPTION_AUDIO="${ENCODE_OPTION_AUDIO} -map ${map} -c:a copy"
done
:
:
:
: 字幕のマッピング
:  字幕だけはcopyとはいかない謎。
ENCODE_OPTION_SUBTITLE=""
for map in $( ffmpeg -i ${FILE_DIR}/${FILE_TITLE}.${FILE_EXT} 2>&1 | grep "Stream" | grep "Subtitle" | cut -f1 -d '(' | cut -f2 -d "#" )
do
    ENCODE_OPTION_SUBTITLE="${ENCODE_OPTION_SUBTITLE} -map ${map} -c:s mov_text"
done
:
:
:
: 実際にエンコードする。
ffmpeg -y -i ${FILE_DIR}/${FILE_TITLE}.${FILE_EXT} ${ENCODE_OPTION_VIDEO} ${ENCODE_OPTION_AUDIO} ${ENCODE_OPTION_SUBTITLE} -f mp4 ${FILE_DIR}/${FILE_TITLE}.${FILE_EXT}
: コピペするのはここまで。

あとがき

何もないところからこれを完成させるだけに1年と2ヶ月はかかった。
解説の文は :コマンドにより、何もしないため特にshコマンドにおけるxオプションを使用しなければ実行時にも表示されない。

更新

2023/01/09 全体的な校正
2020/05/11 作成

メモ:pidによる簡易的なシェルスクリプト実行制御

#!/bin/sh
:
: このスクリプトのpidファイルの場所を定義する。
:  basenameコマンドにより絶対パス記述時ディレクトリ部分を除去。相対パス記述時は影響なし。
:  同様のことは${0##*/}でも可能
pidfile="/var/run/`basename${0%.*}`.pid"
:
: pidファイルは下記のようなプロセスIDの文字列長最大5文字の改行コードを含まないテキストファイルとする。
: # cat ${pidfile}
:   process-id[EOF]
:
: process-idは1-65535までのプロセスIDを示す。
:

: pidファイルがあるかないかで制御を分ける。
:  pidファイルがあれば、記述中のプロセスIDについて、${0}と同一コマンドのプロセスか確認する。
if [ -e ${pidfile} ]
then
        :
        : ${pidfile}がある場合、${pidfile}からプロセスIDの情報を抽出する。
        run_pid=`cat ${pidfile}`
        :
        : すでに走っていると思われるこのスクリプトのPID : ${run_pid}

        :
        : psコマンドを使用して、このスクリプトの名前:${0}を含むプロセスをすべて抽出し、${run_pid}と比較する。
        for chk_pid in `ps axww | grep ${0##*/} | awk '{print $1,$5}' | grep -v grep | cut -f1
-d' '`
        do
                if [ "o${chk_pid}" = "o${run_pid}" ]
                then
                        :
                        : ${run_pid}と${chk_pid}が一致する場合は、このスクリプトの実行を停止する
                        echo "stopped."
                        :
                        : スクリプトを終了する
                        exit
                fi
        done
        :
        : 上記のループで${run_pid}と${chk_pid}がすべて一致しなかった場合、pidファイルの削除漏れが考えられるので、${pidfile}を削除する。
        rm ${pidfile}
else
        :
        : pidファイルがそもそも存在しない場合は、特に何もしない。
fi

:
: このスクリプトのpid:${$}を${pidfile}に格納する。 ※改行コードは含まないようにする。
echo -n ${$} > ${pidfile}

: この後に実行するスクリプトを書いていく・・・
:
:
:
:
:実行終了したら、pidファイルは削除する。
rm ${pidfile}
: この記事はここで終わり。

メモ:FreeBSDにてNFSやFTP、外部ディスクに退避できない環境下における、緊急で空き容量を確保したい場合

FreeBSDにてファイルシステムいっぱいにデータを詰め込むと、外部ディスクのマウントやネットワーク接続ができなくなるときがあるが、削除できるデータがない、ということが極稀にあるので、削除できそうなファイルについてまとめたもの。

※実行の結果、不利益が生じてもすべて自己責任ということでよしなに。


〜割とカジュアルにできるもの〜
Ports Collectionを利用したインストールを常用している場合、workディレクトリ残置で容量を食っていることがある。これを削除する。
コマンド: make -j`sysctl -n hw.ncpu` -C /usr/ports clean

カスタムカーネルや環境変更を行っていた場合は、そのワークデータを削除する。具体的にはmake buildkernel、make buildworldの作業データ。特に重要なものではない限り削除対象。

コマンド:  rm -dR /usr/obj



〜ここからはちょっと危ないので、具体的な削除コマンドの記述は控える〜
メッセージログ。gzファイルは消しても良いかもしれない。
場所: /var/log

Ports Collectionのカタログ。容量が十分に確保されたらportsnap fetch extractで再展開する。ただし/usr/ports/distfilesに必要なソースコードが保存されている場合は再フェッチとなるため、必要に応じて削除から除外したほうが良い。

場所: /usr/ports


現システムで実行中のFreeBSDバージョンのソースコード一式。fetch ftp://ftp.freebsd.org//pub/FreeBSD/releases/`sysctl -n hw.machine`/`sysctl -n hw.machine`/`sysctl -n kern.osrelease | cut -f1,2 -d '-'`/src.txz 後、tar xvzf src.txzで復元することができるので割とカジュアルに削除できるかも・・・

場所: /usr/src


Ports Collectionのカタログファイル類。gzファイルを削除することができる。
必要な場合は、portsnapコマンドではなくsvn経由でリビジョン指定checkoutなどで復元は可能。
場所: /var/db/portsnap/files


9.1-RELEASEで登場したバイナリパッケージインストールコマンド pkgのキャッシュを削除する。txzを削除することができる。
場所: /var/cache/pkg


freebsd-update rollback用txzファイル。freebsd-updateは6.2-RELEASEから搭載されたが、バージョンアップグレードやセキュリティフィックスを繰り返してきた場合は相当溜め込んでいるはず。現システムが安定して動作しているのであれば、削除すると相当容量に余裕が持てる。
デメリットとしては、freebsd-update rollbackができなくなるので、システムアップデートした直後など安定していると判断しづらいときにはできない。
場所: /var/db/freebsd-update/files


〜蛇足〜
rmコマンドやlsコマンドを使用して削除することができない場合、下記のコマンドで一括削除することができる。
# echo * | tr ' ' '\n' | grep -E 'txz|gz'$ | xargs -I% rm -v %

FreeBSD 11.3R/i386 でxrdp 0.9.13を動かす

とりあえず走り書き程度に。

FreeBSD xrdpサーバ、何年か前にOSCでセミナーがあった時に家でもやってみようかなと思っていたのだが、その当時は接続まで至らなかったので諦めていた。今年に限っては外出しにくい大型連休ということで、とりあえずチャレンジしてみたらあっさり接続できました的ななにか。


・注意
xrdp 0.9系以前を使用しているシステムで0.9系を適用する場合、startwm.sh/sesman.ini/xrdp.iniの記法が大きく変わっているため、先んじてxrdpの削除とともに、/usr/local/etc/xrdp の設定ファイルはすべて削除したほうが身のためです。



・サーバ側OSバージョン等の情報
# freebsd-version -k
11.3-RELEASE-p7
# freebsd-version -u
11.3-RELEASE-p8
# sysctl -n hw.machine_arch
i386
11.3R/12.1R以降であれば、amd64でも問題ないと思います。

・xrdpサーバの動作に必要なソフトウェアのインストール等
# pkg info -a | cut -f1 -d' ' | grep xrdp
pulseaudio-module-xrdp-0.4_1
xorgxrdp-0.2.13_2
xrdp-0.9.13,1
基本的に、pkg install xrdpで上記がインストールできます。

・xrdpサーバで動作させるデスクトップ環境のインストール等
# pkg info -a | cut -f1 -d' ' | grep -e openbox -e xterm -e setxkbmap
openbox-3.6_6
openbox-arc-theme-20170104
setxkbmap-1.3.2
xterm-353_1

・サーバ側の/etc/rc.confの設定
# cat /etc/rc.conf | grep xrdp_
xrdp_enable="YES"
xrdp_sesman_enable="YES"

・ログイン後の設定(特に行ごとの解説はしないが、日本語ロケールで日本語キーボードで、openboxがあればopenboxを起動し、なければxtermの起動をチャレンジする)
# cat ~/startwm.sh
#!/bin/sh

export LANG=ja_JP.UTF-8

( sleep 3; setxkbmap jp; xterm & )
exec openbox || xterm
[EOF]


・Xの設定ファイル各種をstartwm.shのシンボリックリンクに設定し、実行可能にする。
# ln -s startwm.sh .xinitrc
# ln -s startwm.sh .xprofile
# ln -s startwm.sh .xsession
# chmod 744 startwm.sh .xinitrc .xprofile .xsession
残念ながら、現時点では上記4ファイルについて下記の流れ(これも推定・・・)のどこで実行されるかは不明。
  1. xrdpのログイン
  2. ログインユーザによるXセッションの立ち上げ(もしくは再接続)
  3. Display Manager(SLiM、lightdm、Xdmなど)による
  4. デスクトップ立ち上げ
  5. デスクトップ起動完了

・.Xauthorityの存在が必要らしいので、touchで作っておく。
# touch .Xauthority
上記のファイルがある場合は放置。特に追記する必要もなかった。


・とりあえずxrdp、xrdp-sesmanデーモンの起動
# service xrdp restart
# service xrdp-sesman restart
xrdp-sesmanについては、実行コマンドがxrdp_sesmanだったりするのでちょっとややこしい。


・ポイント1:service xrdp restartだけではxrdp-sesmanデーモンをフックしない。
xrdp-sesmanをちゃんと立ち上げておかないと、xrdpのログインまではたどり着けても、Window Managerの実行画面までたどり着けない。下記のようなメッセージはそうした場合に確認できる。
  xrdp_wm_log_msg: connection problem, giving up
  Closed socket 17 (AF_UNIX)
参考: http://junf.hatenablog.com/entry/2018/04/25/232923


★サーバ側は以上、次はクライアント側環境。

・OSのバージョン等(特にこだわる必要もないでしょう)
% freebsd-version -k
12.1-RELEASE-p3
% freebsd-version -u
12.1-RELEASE-p4
% sysctl -n hw.machine_arch
amd64

・RDPクライアントソフト(コマンドベース。おそらく何でも良いと思う)
# pkg info  -a | cut -f1 -d' ' | grep freerdp
freerdp-2.0.0.r4_7
他、Xの環境が整っていることが必須条件。


・RDPサーバに接続する
# xfreerdp /v:SERVER-IP-ADDR +glyph-cache /bpp:16
freerdpコマンドではなく、xfreerdpコマンド。
最小限度、/vオプションと+glyph-cacheオプションが必要。
色は16bitのほうが具合が良いらしい。(前回セッションが生きていれば指定不要かもしれないが)

・ポイント2:下記のエラーに対応するには +glyph-cache が必要。
[17:25:41:498] [75726:0265b500] [ERROR][com.freerdp.core.update] - [0x03] Cache Glyph - SERVER BUG: The support for this feature was not announced! Use /relax-order-checks to ignore
参考: https://bgstack15.wordpress.com/2019/09/21/xfreerdp-client-cannot-connect-to-xrdp-session/


・ここまでを行って、''サーバ側を再起動''してxrdp/xrdp_sesmanが起動するか確認する。
# reboot



★追加:rdpサーバ側のデスクトップ環境で出力されている音をクライアントへ転送する
・xrdpでは物理的なサウンドデバイスがないことも想定されることからpulseaudioで音声出力を受け付けて、それをrdpで中継し、クライアントで音声を出力する仕組みを持っている。そこでチャレンジしてみる。ここではpulseaudioに関する設定は特にないし、クライアント側はpulseaudioのインストールは不要で、/soundオプションの追加だけで良い。

・クライアント側から下記コマンドにて接続する。
% xfreerdp /v:SERVER-IP-ADDR +glyph-cache /bpp:16 /sound

・サーバ側でpavucontrolを使用して出力装置を確認する。
# pavucontrol
※pavucontrolコマンドがない場合は下記コマンドでインストールする。
# pkg install pavucontrol

・mpg123コマンドを使用してmp3ファイルを再生してみる。
# padsp mpg123 /path/to/sound.mp3

・もし再生されないようだったら、pulseaudioとxrdpのrestartを行い、クライアントから再接続する。
# pulseaudio -k && sleep 1 && pulseaudio -D
# service xrdp restart
% xfreerdp /v:SERVER-IP-ADDR +glyph-cache /bpp:16 /sound

参考: http://w.vmeta.jp/tdiary/20161019.html


追記
 ・2020/05/20時点でpkgコマンドからインストールできるmultimedia/vlcはpulseaudioオプションが有効ではないので、Ports Collectionからビルドするか、padspでwrapする必要がある。



一応所感など。
・UbuntuやCentOSなどで同様の問題が発生する場合、gnome-sessionを入れるとうまく動くとかmate-sessionを使うと動く場合があるそう。おそらくDesktop Environmentの方で調整してるんだろうと考えた。残念ながら今回のrdpサーバはメインメモリ512Mのi386環境なので、リッチなDesktop Environmentに頼らないよう、頑張りました。




おまけ1:xfreerdpでデバッグレベルのログを出す、ビットカラーを16bitで使用する、など。
# env WLOG_LEVEL=DEBUG xfreerdp /u:USERNAME /v:SERVER-IP-ADDR /relax-order-checks +glyph-cache /bpp:16

おまけ2:メインメモリ512Mしかなく、XenServer上のマシンであっても、導入できればxrdpは軽快です。もしかしたらX描画負荷が別マシンになるので、ある程度の性能なら物理マシンより描画が速いかも・・・
# cat /var/run/dmesg.boot
Copyright (c) 1992-2019 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
    The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 11.3-RELEASE-p7 #0: Tue Mar 17 08:12:57 UTC 2020
    root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC i386
FreeBSD clang version 8.0.0 (tags/RELEASE_800/final 356365) (based on LLVM 8.0.0)
VT(vga): text 80x25
XEN: Hypervisor version 4.6 detected.
CPU: Intel(R) Core(TM) i7-4770T CPU @ 2.50GHz (2499.32-MHz 686-class CPU)
  Origin="GenuineIntel"  Id=0x306c3  Family=0x6  Model=0x3c  Stepping=3
  Features=0x7c3fbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,ACPI,MMX,FXSR,SSE,SSE2>
  Features2=0xfffa3203<SSE3,PCLMULQDQ,SSSE3,FMA,CX16,PCID,SSE4.1,SSE4.2,x2APIC,MOVBE,POPCNT,TSCDLT,AESNI,XSAVE,OSXSAVE,AVX,F16C,RDRAND,HV>
  AMD Features=0x2c100000<NX,Page1GB,RDTSCP,LM>
  AMD Features2=0x21<LAHF,ABM>
  Structured Extended Features=0x27ab<FSGSBASE,TSCADJ,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,NFPUSG>
  XSAVE Features=0x1<XSAVEOPT>
Hypervisor: Origin = "Microsoft Hv"
real memory  = 532676608 (508 MB)
avail memory = 490160128 (467 MB)
Event timer "LAPIC" quality 100
ACPI APIC Table: <Xen HVM>
ioapic0: Changing APIC ID to 1
MADT: Forcing active-low polarity and level trigger for SCI
ioapic0 <Version 1.1> irqs 0-47 on motherboard
Timecounter "TSC-low" frequency 1249660129 Hz quality 800
random: entropy device external interface
kbd1 at kbdmux0
module_register_init: MOD_LOAD (vesa, 0xc1022fd0, 0) error 19
random: registering fast source Intel Secure Key RNG
random: fast provider: "Intel Secure Key RNG"
nexus0
vtvga0: <VT VGA driver> on motherboard
cryptosoft0: <software crypto> on motherboard
acpi0: <Xen> on motherboard
acpi0: Power Button (fixed)
acpi0: Sleep Button (fixed)
cpu0: <ACPI CPU> on acpi0
hpet0: <High Precision Event Timer> iomem 0xfed00000-0xfed003ff on acpi0
Timecounter "HPET" frequency 62500000 Hz quality 950
attimer0: <AT timer> port 0x40-0x43 irq 0 on acpi0
Timecounter "i8254" frequency 1193182 Hz quality 0
Event timer "i8254" frequency 1193182 Hz quality 100
atrtc0: <AT realtime clock> port 0x70-0x71 irq 8 on acpi0
atrtc0: registered as a time-of-day clock, resolution 1.000000s
Event timer "RTC" frequency 32768 Hz quality 0
Timecounter "ACPI-fast" frequency 3579545 Hz quality 900
acpi_timer0: <32-bit timer at 3.579545MHz> port 0xb008-0xb00b on acpi0
pcib0: <ACPI Host-PCI bridge> port 0xcf8-0xcff on acpi0
pci0: <ACPI PCI bus> on pcib0
isab0: <PCI-ISA bridge> at device 1.0 on pci0
isa0: <ISA bus> on isab0
atapci0: <Intel PIIX3 WDMA2 controller> port 0x1f0-0x1f7,0x3f6,0x170-0x177,0x376,0xc220-0xc22f at device 1.1 on pci0
ata0: <ATA channel> at channel 0 on atapci0
ata1: <ATA channel> at channel 1 on atapci0
uhci0: <Intel 82371SB (PIIX3) USB controller> port 0xc200-0xc21f irq 23 at device 1.2 on pci0
usbus0: controller did not stop
usbus0 on uhci0
pci0: <bridge> at device 1.3 (no driver attached)
vgapci0: <VGA-compatible display> mem 0xf0000000-0xf1ffffff,0xf3000000-0xf3000fff irq 24 at device 2.0 on pci0
vgapci0: Boot video device
xenpci0: <Xen Platform Device> port 0xc000-0xc0ff mem 0xf2000000-0xf2ffffff irq 30 at device 3.0 on pci0
atkbdc0: <Keyboard controller (i8042)> port 0x60,0x64 irq 1 on acpi0
atkbd0: <AT Keyboard> irq 1 on atkbdc0
kbd0 at atkbd0
atkbd0: [GIANT-LOCKED]
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: [GIANT-LOCKED]
psm0: model IntelliMouse Explorer, device ID 4
fdc0: <floppy drive controller> port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on acpi0
fdc0: does not respond
device_attach: fdc0 attach returned 6
uart0: <16550 or compatible> port 0x3f8-0x3ff irq 4 flags 0x10 on acpi0
ppc0: <Parallel port> port 0x378-0x37f irq 7 on acpi0
ppc0: Generic chipset (NIBBLE-only) in COMPATIBLE mode
ppbus0: <Parallel port bus> on ppc0
lpt0: <Printer> on ppbus0
lpt0: Interrupt-driven port
ppi0: <Parallel I/O> on ppbus0
xenpv0: <Xen PV bus> on motherboard
granttable0: <Xen Grant-table Device> on xenpv0
xen_et0: <Xen PV Clock> on xenpv0
Event timer "XENTIMER" frequency 1000000000 Hz quality 950
Timecounter "XENTIMER" frequency 1000000000 Hz quality 950
xen_et0: registered as a time-of-day clock, resolution 0.000001s
xenstore0: <XenStore> on xenpv0
evtchn0: <Xen event channel user-space device> on xenpv0
privcmd0: <Xen privileged interface user-space device> on xenpv0
debug0: <Xen debug handler> on xenpv0
pmtimer0 on isa0
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
fdc0: No FDOUT register!
Timecounters tick every 10.000 msec
xenballoon0: <Xen Balloon Device> on xenstore0
usbus0: 12Mbps Full Speed USB v1.0
ugen0.1: <Intel UHCI root HUB> at usbus0
uhub0: <Intel UHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus0
xctrl0: <Xen Control Device> on xenstore0
xs_dev0: <Xenstore user-space device> on xenstore0
xenbusb_front0: <Xen Frontend Devices> on xenstore0
xn0: <Virtual Network Interface> at device/vif/0 on xenbusb_front0
xn0: Ethernet address: XX:XX:XX:12:34:56
xenbusb_back0: <Xen Backend Devices> on xenstore0
xn0: backend features: feature-sg feature-gso-tcp4
xbd0: 204800MB <Virtual Block Device> at device/vbd/832 on xenbusb_front0
xbd0: attaching as ada1
xbd0: features: write_barrier
xbd0: synchronize cache commands enabled.
xbd1: 10240MB <Virtual Block Device> at device/vbd/768 on xenbusb_front0
xbd1: attaching as ada0
xbd1: features: write_barrier
xbd1: synchronize cache commands enabled.
Trying to mount root from ufs:/dev/ada0s1a [rw]...
uhub0: 2 ports with 2 removable, self powered
ugen0.2: <QEMU 0.10.2 QEMU USB Tablet> at usbus0
random: unblocking device.
lo0: link state changed to UP
xn0: link state changed to DOWN
xn0: link state changed to UP
ums0 on uhub0
ums0: <Endpoint1 Interrupt Pipe> on usbus0
ums0: 3 buttons and [Z] coordinates ID=0

使い方メモ:Captain Stag UF-16 スライドミニトーチ

最近、近所のホームセンターの閉店セールがあったのでちょっと覗いてみたらスライドミニトーチが700円ぐらいで売っていたので衝動買いした。

Captain Stag UF-16 スライドミニトーチ
https://www.captainstag.net/products/UF-16.html

元々そのホームセンターで買ったミニトーチを使っていたのだが、常用するには着火率が悪いことと、頻繁に使うことからガスがすぐ枯渇するため、他に安く済ませられるものがないか探していたのである。
http://www.shinfuji.co.jp/sfb/products/pt-14ffskcr/
1年ぐらい使っていたが、火力も十分で使いやすい。プラを曲げたりスプレー用の細いプラパイプを曲げたりするために重宝した。


ここからは使い方のメモである。

着火方法>着火スイッチを押し込むだけである。一般的なライターを使ったことがあればわかると思うので書かないが、強いて言えばLOCK機構があるのでそれが解除されているかどうかを確認することぐらいである。あせって着火する事態はおそらくそうないと思われるが、押してもスイッチが重ければ一度確認してみる。

火口スライド>着火前も着火後も伸ばしたり戻したりできる。安全上着火前に行ったほうが良い。

火口>使用前も使用後も触らないほうがやけどすることはないでしょう。

火力調整>着火前にマイナスドライバーなどで底面にそれっぽいつまみを調整する。着火性も含めて最大火力にした。開梱時の火力は1cm程度、最大火力では3cm程度出る。

補充するガス>とりあえずまずは100均のガスボンベ(ライター用、レジ横においてあることが多い)を一つ買っておくと良い。重要なのはプラ冶具のほう。それがあればカセットボンベからの補充もできるようになる。カセットボンベの口のまま補充しようとすると正しい方法でも霧散するので意味がない。

補充方法>下記の通り。
1. 周囲に火気がないことを確認する。特に口に加えているものは注意。
2. 着火スイッチをロックする。
3. 火口を下に向けて補充口を上に向ける。(燃料のガスは空気より重いので上下逆では補充できない)
4. ガスボンベの口が合うか確かめる。合わなければプラ冶具を使う。
5. シュッと音がするまで押す。音がしたら戻す。これを3回繰り返す。
6. ガスボンベに安全措置(通常、蓋を閉める)を行い、着火試験する。
7. 火力が足りなければ再度補充するか火力を強めてみる。

使用後>すぐにLOCKする癖をつけたほうが良い。100均のライターほど着火スイッチは重くない。ポケットの中で着火したら目も当てられないことになる。


今は焼き梅干しを作るためだけに使っている。特に後悔はしていない。

なにか終わったらRingRingしたい話

FreeBSD 12.1-R4/amd64で、ある程度時間がかかるスクリプトを実行している中で、終わったら適当な音を出して知らせてくれる機能をお遊び半分で調べて書いたもの。
条件は、追加Portsは一切なし。FreeBSD 12.1-R4/amd64インストール直後でも実行可能であること。サウンドカードの設定はここでは書かないが、デバイスを認識し音声出力ができること。

通常であれば、mpg123で適当な音声を流してみたり、soxコマンドを使って音を生成しつつそれをスピーカに出力する方式を取ると思うが、今回はそれができない。Linux ALSAのようなaplayコマンドの搭載もないので、FreeBSD標準の状態では音声を出力するコマンドはないことになる。しかしFreeBSDハンドブックを読んだことがあれば、 音声出力のテストコマンドとして、 # cat /dev/random > /dev/dsp を投入することで雑音が流れることはご存知だと思われる。またスピーカーから音を出すことにこだわらなければ、beep音としてspeaker.koを使える。これは音程をつけてメロディを流すこともできる。


まずは、手っ取り早く実現できそうなspeaker機能を試す。標準ではカーネルモジュールをロードしておかないと/devディレクトリには見えない。なので、下記のコマンドをrootユーザで実行する。
# kldload speaker

すると、/dev/speakerというデバイスが現れる。このデバイスに向かって音階の記号を流す。
# echo "CDEFGAB" > /dev/speaker
CDE・・・は馴染みづらいが、昔は音階がラ:Aから始まり、シ:B、ド:Cとなっているという話で、記法が分かればそれほど理解に苦労しない。
参考: https://duckduckgo.com/?q=%E3%83%89%E3%83%AC%E3%83%9F+CDE

# echo "CDECDEGEDCDED" > /dev/speaker
上記のコマンドを実行すると、小学校で習う簡単なメロディが流れるはずだ、ったのだがspeakerはパソコンによっては聴こえないことがあるらしい。beep音が流れるようにBIOS/UEFIで調整するなり、マザーボードのspeakerのピンに適切なパーツを挿せばおそらくは鳴る。(ノートパソコンなどでは代替で音声スピーカから音が出力されることもある)

マニュアルを読んでみるとspkrtestコマンドというものがあるらしいので、先程のコマンドよりは凝った音楽が流れると思われる。
参考: http://www.koganemaru.co.jp/cgi-bin/mroff.cgi?subdir=man&lc=1&cmd=&man=spkrtest&dir=jpman-12.1.2%2Fman&sect=0

ところが、私の環境では/dev/speakerで音を出力する手段が頓挫してしまった。上記コマンドを実行しても実行はしているみたいだが音がでない。マザーボードのspeakerピンに挿すべきパーツも持っていなければ、/etc/rc.confなどでbeep音を抑制しているわけでもないが、理由がわからないのでここで諦める他ない。(# printf "\a" でも音が鳴らない。)

仕方がないので、FreeBSDハンドブックにあるような # cat /dev/random > /dev/dsp でそれっぽいものができないか試してみることにする。/dev/randomを使う場合、音量は特に注意が必要で、特にヘッドホンを使っている場合は一回外しておいたほうが良いかもしれない。FreeBSDにもmixerというコマンドはあるので、下記のコマンドで音量を下げておく。
# mixer vol 50

/dev/randomを出力した場合、常にランダムな値を出力し続ける→これを/dev/dspに解釈させて音声出力とするという形なので、catプロセスが破壊されるか/dev/randomからEOFが来なければずっと雑音を流し続けることになる。
雑音を作業終了の合図として使うのもどうかと思うので、適当な値を突っ込んでみて良さげな音がないか探してみる。下記はコマンド例。
# yes 1 > /dev/dsp

yesコマンドは引数に指定された文字列を改行区切りで出力するコマンド。なので、特にパイプなり逆くちばしに渡さなければ、下記のような出力が行われる。
root@freebsd[/root] # yes 1
1
1
1
1
1
1
〜プロセスが中断されるまで上記出力が継続〜

なので、# yes 1 > /dev/dsp を実行すると、1[改行]をひたすら/dev/dspに出力し続けることになる。
これで音を探っていくと、どうやら16の階乗で音が変わることがわかったので、下記のようなコマンドで終了を知らせることができる。(おそらくこの理解は誤りである)
# yes 8192 > /dev/dsp

yesコマンドは特にケアしなければずっと出力を続けるため、止めなければずっと音を流し続ける。これではやかましいだけなので、ちょっとスクリプトを書いて5秒ぐらいで止めてみることにする。
# less ringring.sh
#!/bin/sh
alarm=8192
yes ${alarm} | /dev/dsp &
pid=${!}
sleep 5
kill ${pid}

特にコマンドについては解説しないが、これで5秒ぐらいで音が停止するはず。
これで音を鳴らして合図するようなものができた。



〜〜蛇足〜〜

FreeBSDではいつからか不明だが、sleepコマンドに対して、10ミリ秒単位での指定が可能になったらしい。実際 先程のスクリプトをtimeコマンドを噛ましてみると0.50でコマンドが終了していることが確認できる。
ということは、先程のスクリプトももう少し手を加えたら、変わった音が出せそうだ。ということで書いてみたのが下記のスクリプトである。(sleepコマンドに指定すべき数値が誤っていたので修正(2020/05/20)
#!/bin/sh
alarm_a=8192
alarm_b=16384

cnt=5

while [ ! 1 -eq ${cnt} ]
do

yes ${alarm_a} | /dev/dsp &
pid=${!}
sleep 0.5
kill ${pid}

yes ${alarm_b} | /dev/dsp &
pid=${!}
sleep 0.5
kill ${pid}

cnt=`expr ${cnt} - 1`
done


気になった記事のブックマークなど(2025/11)

  過去ログ   走り書き 2025/11/03 おいしい焼肉♪あおぞら沼田店           確約された大勝利の味。 ...