ffmpegによる動画の切り出し

ffmpegを使用すれば元々1行で動画を切り出すことができます。しかしオプション名をいちいち覚えておくのも大変なので切り出し用のスクリプトを作成しておきました。第一引数に動画名を指定すると、imageフォルダーの中に sample01.jpg から順に連番で静止画を作成してくれます。 

#!/bin/bash
start=19.5 # 動画の切り出し開始(秒)
end=22.5 # 動画の切り出し終了(秒)
rate=24 # 1秒あたりの静止画の枚数

ffmpeg -i $1 -ss ${start} -t ${end} -r ${rate} image/sample%02d.jpg

f:id:S_E_Hyphen:20210122150622j:plain

f:id:S_E_Hyphen:20210122150635j:plain

f:id:S_E_Hyphen:20210122150648j:plain

 メディアの容量もかつてに比べて大幅に増加しましたし、また静止画も簡単に作れるようになりました。これなら一瞬のシャッターチャンスを狙うよりも、最初から動画撮影して最適な静止画を切り出した方が楽なのかも知れません。

sedで四声付きピンイン入力の支援スクリプト

中国語の発音記号であるピンインを入力するには みなさん 苦労されているようです。クリップボードモリーを利用して入力したり、FEPの辞書登録を利用したりしているようです。sed が使用できる環境であれば、下記のようなスクリプトでも入力ができそうです。

你好世界!の声調記号は Nǐ hǎo shìjiè! と表記されるのですが、これをパソコンに入力する際は便宜的に Ni3 hao3 shi4jie4! と書き下すことが多いようです。この "Ni3 hao3 shi4jie4!" をパイプで下記のスクリプトに通すと、Nǐ hǎo shìjiè! に変換されます。

当初、教科書順に単母音を上の行に書いていたのですが、そうすると先に単母音が変換されてしまい期待したのと違う変換となってしまったため逆順にしました。

全ての母音を変換対象としていますので、少し冗長ではあります。もう少し吟味すれば行数を減らせそうではありますが、現在この状態でのテスト使用を実施中です。

f:id:S_E_Hyphen:20210110160019p:plain

 

sed \
 -e "s/Er4/Èr/g"  -e "s/Er3/Ěr/g"  -e "s/Er2/Ér/g"  -e "s/Er1/Ēr/g" \
 -e "s/er4/èr/g"  -e "s/er3/ěr/g"  -e "s/er2/ér/g"  -e "s/er1/ēr/g" \
 -e "s/iong4/iòng/g"  -e "s/iong3/iǒng/g"  -e "s/iong2/ióng/g"  -e "s/iong1/iōng/g" \
 -e "s/weng4/wèng/g"  -e "s/weng3/wěng/g"  -e "s/weng2/wéng/g"  -e "s/weng1/wēng/g" \
 -e "s/uang4/uàng/g"  -e "s/uang3/uǎng/g"  -e "s/uang2/uáng/g"  -e "s/uang1/uāng/g" \
 -e "s/ing4/ìng/g"  -e "s/ing3/ǐng/g"  -e "s/ing2/íng/g"  -e "s/ing1/īng/g" \
 -e "s/iang4/iàng/g"  -e "s/iang3/iǎng/g"  -e "s/iang2/iáng/g"  -e "s/iang1/iāng/g" \
 -e "s/ong4/òng/g"  -e "s/ong3/ǒng/g"  -e "s/ong2/óng/g"  -e "s/ong1/ōng/g" \
 -e "s/Eng4/Èng/g"  -e "s/Eng3/Ěng/g"  -e "s/Eng2/Éng/g"  -e "s/Eng1/Ēng/g" \
 -e "s/eng4/èng/g"  -e "s/eng3/ěng/g"  -e "s/eng2/éng/g"  -e "s/eng1/ēng/g" \
 -e "s/Ang4/Àng/g"  -e "s/Ang3/Ǎng/g"  -e "s/Ang2/Áng/g"  -e "s/Ang1/Āng/g" \
 -e "s/ang4/àng/g"  -e "s/ang3/ǎng/g"  -e "s/ang2/áng/g"  -e "s/ang1/āng/g" \
 -e "s/un4/ùn/g"  -e "s/un3/ǔn/g"  -e "s/un2/ún/g"  -e "s/un1/ūn/g" \
 -e "s/uan4/uàn/g"  -e "s/uan3/uǎn/g"  -e "s/uan2/uán/g"  -e "s/uan1/uān/g" \
 -e "s/un4/ùn/g"  -e "s/un3/ǔn/g"  -e "s/un2/ún/g"  -e "s/un1/ūn/g" \
 -e "s/uan4/uàn/g"  -e "s/uan3/uǎn/g"  -e "s/uan2/uán/g"  -e "s/uan1/uān/g" \
 -e "s/in4/ìn/g"  -e "s/in3/ǐn/g"  -e "s/in2/ín/g"  -e "s/in1/īn/g" \
 -e "s/ian4/iàn/g"  -e "s/ian3/iǎn/g"  -e "s/ian2/ián/g"  -e "s/ian1/iān/g" \
 -e "s/En4/Èn/g"  -e "s/En3/Ěn/g"  -e "s/En2/Én/g"  -e "s/En1/Ēn/g" \
 -e "s/en4/èn/g"  -e "s/en3/ěn/g"  -e "s/en2/én/g"  -e "s/en1/ēn/g" \
 -e "s/An4/Àn/g"  -e "s/An3/Ǎn/g"  -e "s/An2/Án/g"  -e "s/An1/Ān/g" \
 -e "s/an4/àn/g"  -e "s/an3/ǎn/g"  -e "s/an2/án/g"  -e "s/an1/ān/g" \
 -e "s/iu4/iù/g"  -e "s/iu3/iǔ/g"  -e "s/iu2/iú/g"  -e "s/iu1/iū/g" \
 -e "s/iao4/iào/g"  -e "s/iao3/iǎo/g"  -e "s/iao2/iáo/g"  -e "s/iao1/iāo/g" \
 -e "s/ui4/uì/g"  -e "s/ui3/uǐ/g"  -e "s/ui2/uí/g"  -e "s/ui1/uī/g" \
 -e "s/uai4/uài/g"  -e "s/uai3/uǎi/g"  -e "s/uai2/uái/g"  -e "s/uai1/uāi/g" \
 -e "s/ue4/uè/g"  -e "s/ue3/uě/g"  -e "s/ue2/ué/g"  -e "s/ue1/uē/g" \
 -e "s/uo4/uò/g"  -e "s/uo3/uǒ/g"  -e "s/uo2/uó/g"  -e "s/uo1/uō/g" \
 -e "s/ua4/uà/g"  -e "s/ua3/uǎ/g"  -e "s/ua2/uá/g"  -e "s/ua1/uā/g" \
 -e "s/ie4/iè/g"  -e "s/ie3/iě/g"  -e "s/ie2/ié/g"  -e "s/ie1/iē/g" \
 -e "s/ia4/ià/g"  -e "s/ia3/iǎ/g"  -e "s/ia2/iá/g"  -e "s/ia1/iā/g" \
 -e "s/Ou4/Òu/g"  -e "s/Ou3/Ǒu/g"  -e "s/Ou2/Óu/g"  -e "s/Ou1/Ōu/g" \
 -e "s/ou4/òu/g"  -e "s/ou3/ǒu/g"  -e "s/ou2/óu/g"  -e "s/ou1/ōu/g" \
 -e "s/Ao4/Ào/g"  -e "s/Ao3/Ǎo/g"  -e "s/Ao2/Áo/g"  -e "s/Ao1/Āo/g" \
 -e "s/ao4/ào/g"  -e "s/ao3/ǎo/g"  -e "s/ao2/áo/g"  -e "s/ao1/āo/g" \
 -e "s/Ei4/Èi/g"  -e "s/Ei3/Ěi/g"  -e "s/Ei2/Éi/g"  -e "s/Ei1/Ēi/g" \
 -e "s/ei4/èi/g"  -e "s/ei3/ěi/g"  -e "s/ei2/éi/g"  -e "s/ei1/ēi/g" \
 -e "s/Ai4/Ài/g"  -e "s/Ai3/Ǎi/g"  -e "s/Ai2/Ái/g"  -e "s/Ai1/Āi/g" \
 -e "s/ai4/ài/g"  -e "s/ai3/ǎi/g"  -e "s/ai2/ái/g"  -e "s/ai1/āi/g" \
 -e "s/v4/ǜ/g"  -e "s/v3/ǚ/g"  -e "s/v2/ǘ/g"  -e "s/v1/ǖ/g" \
 -e "s/v0/ü/g" -e "s/v/ü/g" \
 -e "s/U4/Ù/g"  -e "s/U3/Ǔ/g"  -e "s/U2/Ú/g"  -e "s/U1/Ū/g" \
 -e "s/u4/ù/g" -e "s/u3/ǔ/g"  -e "s/u2/ú/g"  -e "s/u1/ū/g" \
 -e "s/I4/Ì/g"  -e "s/I3/Ǐ/g"  -e "s/I2/Í/g"  -e "s/I1/Ī/g" \
 -e "s/i4/ì/g"  -e "s/i3/ǐ/g"  -e "s/i2/í/g"  -e "s/i1/ī/g" \
 -e "s/E4/È/g"  -e "s/E3/Ě/g"  -e "s/E2/É/g"  -e "s/E1/Ē/g" \
 -e "s/e4/è/g"  -e "s/e3/ě/g"  -e "s/e2/é/g"  -e "s/e1/ē/g" \
 -e "s/O4/Ò/g"  -e "s/O3/Ǒ/g"  -e "s/O2/Ó/g"  -e "s/O1/Ō/g" \
 -e "s/o4/ò/g"  -e "s/o3/ǒ/g"  -e "s/o2/ó/g"  -e "s/o1/ō/g" \
 -e "s/A4/À/g"  -e "s/A3/Ǎ/g"  -e "s/A2/Á/g"  -e "s/A1/Ā/g" \
 -e "s/a4/à/g"  -e "s/a3/ǎ/g"  -e "s/a2/á/g"  -e "s/a1/ā/g"

株価の取得

日本経済新聞のホームページに自動的にアクセスし、株価を取得するスクリプトを作ってみました。

 

#!/bin/bash
host="127.0.0.1"
work_dir="."
scode="xxxx" # 所望の銘柄コードです

# まだテーブルが作成されていない場合、
# 以下のようななテーブルを作成します。
mysql -h ${host} life_log << _SQL_
 create table if not exists stock(
  seq int primary key auto_increment,
  kind varchar(50),
  UpdateDate date,
  rate int,
  insertDate datetime,
  comment varchar(20)
 )ENGINE=InnoDB DEFAULT CHARSET=utf8;
_SQL_

# 本当はこの下に年末年始・祝日などを列挙する
# 仕組みもあるのですが、とりあえず土日を休日に
week_day=`date +'%u'`
work="ON"
case ${week_day} in
 [1-5]) work="ON";;
 *) work="OFF";;
esac
if [ $work = "OFF" ]
then
 printf "株価:%s市場は休みでした\n" `date "+%Y年%m月%d日"`
 exit
fi

# 日本経済新聞HPの特定銘柄をダウンロードします
wget -q https://www.nikkei.com/nkd/company/?scode=${scode} -O ${work_dir}/received.html

# m-headlineLarge_textというタグを目当てに銘柄名を取得します
# レコードの区切りがCR+LFなのでCRを除去します 
kind=\
`cat ${work_dir}/received.html |\
 grep m-headlineLarge_text |\
 sed -e 's/<[^>]*>//g' |\
 sed -e "s/ //g" |\
 sed -e "s/\r//g" `
# m-stockPriceElm_value nowというタグを目当てに現在価格を取得します
# 「円」の文字、および桁区切りのカンマを除去します
rate=\
`cat ${work_dir}/received.html |\
 grep m-stockPriceElm_value\ now |\
 sed -e 's/<[^>]*>//g' |\
 sed -e "s/ //g" |\
 sed -e "s/円//g" |\
 sed -e "s/\r//g" |\
 sed -e "s/,//g"`
# m-stockInfo_dateというタグを目当てに日付を取得します
date=\
`cat ${work_dir}/received.html |\
 grep  m-stockInfo_date |\
 sed -e 's/<[^>]*>//g' |\
 sed -e "s/ //g" |\
 sed -e "s/\r//g" `

# それぞれをデータベースに登録します
mysql -h ${host} life_log << _SQL_ #2> /dev/null
 insert into stock(kind,UpdateDate,rate,insertDate)
    value("${kind}","${date}","${rate}",now());
_SQL_


printf "株価:%s%sの株価は%s円でした\n" `date "+%Y年%m月%d日"` "${kind}" "${rate}"
rm ${work_dir}/received.html    

 crontab などに登録して定期的に実行すれば株価のデータベースが作成できます。

年年有鱼(余)

年年有鱼 Nián nián yǒu yú 余裕の「余」と発音が同じであることから、中国では大みそか(大年夜)に魚を食べる習慣があるそうです。きっとアジの干物ではないのでしょうけど…。

日本の風習である年越しそばとともに。

f:id:S_E_Hyphen:20201231182604j:plain

 

来年も良い年でありますように!

 

スマホでQRバーコード作成

二次元バーコードを生成する qrencode はtermuxにもサポートされています。

    apt install libqrencode 

二次元バーコードを日常的に自作することができれば、平文では書きにくい場所への個人情報の記載などの用途に活用できます。さらにスマホで簡単に作成できるとなると、URLやアドレスの伝達にも便利だと思います。

 

#!/bin/bash
# 出力形式をANSIPNGか選択
json_data=\
`termux-dialog  radio -t "出力形式を選択してください" -v "ANSI,PNG"`
code=`echo ${json_data} | jq -r .code`
if [ ${code} -eq -2 ]; then exit; fi
ext=`echo ${json_data} | jq .index`

# 変換する文字列を入力します
json_data=`\
  termux-dialog text -m -t "QRコードに変換したい文字列を入力して下さい" -i "!!! input text !!!"`
code=`echo ${json_data} | jq -r .code`
if [ ${code} -eq -2 ]; then exit; fi
text=`echo ${json_data} | jq -r .text`
temp=`mktemp ./XXXX`
printf "%s\n" ${text} > ${temp}

case ${ext} in
 0) cat ${temp} | qrencode -t ANSI ; read pause;;
 1) cat ${temp} | qrencode -t png -s 5 -o ~/storage/pictures/QRCODE_`date +'%m%d%H%M'`.png;;
 *) termux-notification -t "QRコード作成ツール" --icon error ;;
esac

rm ${temp}

実行すると、テキスト入力を促すインプットボックスがポップアップします。

f:id:S_E_Hyphen:20201230144648j:plain


ここに例えばURLなどを書き込んでやれば、その文字列に対応する二次元バーコードが作成されます。機種依存性がありますが、日本語などの多バイト文字も使用可能です。また複数行にわたる場合も対応しています。

f:id:S_E_Hyphen:20201230144706j:plain



 

焼きおにぎり

長いこと敬遠してきたのですが、意を決して挑戦してみました。

f:id:S_E_Hyphen:20201226100922j:plain

熱いうちにタレを塗ると割れたり崩れたりすると聞いたことが有ったので、表面温度が30度を下回るまで待ちました。刷毛で返し醤油を塗り付けてからグリルします。予熱3分、加熱3分、余熱3分のコースです。見た目も美味しそうな焼きおにぎりが完成しました。少し手間ではありますが、十分お弁当のラインナップの一角を担ってくれる逸材となりました。

但し、使った後の刷毛は部屋干しでは乾燥しないようなので、天日干しすることにしました。

termux-notificationでエラー内容の確認

スマホにインストールした mariaDBhoge というデータベースの fuga というテーブルの idフィールドとitemフィールドに(1,"リンゴ")というレコードを追加しようと思っただけなのですが、上手くゆきません。そこで termux-notification でエラーの内容を確認してみました。termux-notification は Termux:API をインストールすると使用できるようになります。

 

#!/bin/bash
error=~/error.txt

mysql hoge << _SQL_ 2> ${error}
insert into fuga(id,item) value(1,"リンゴ");
_SQL_

if [ -s ${error} ]
then
 cat ${error}  |\
  termux-notification \
   -t "!!! 错误发生了 !!!" --icon error
fi
rm ${error}

if 文の内容は、もし~/error.txt がゼロバイトでなかったら、その内容を cat で termux-notification の標準入力に流し込みます。そして"!!! 错误发生了 !!!"というタイトルのもとステータスバーに表示するというものです。最後にエラー内容確認のために作成した~/error.txt というファイルはきちんと消去して後始末です。

 

f:id:S_E_Hyphen:20201220112551j:plain

なんと、「hoge というデータベースが存在しないよ」というエラーでした。