mawk を gawk へ取り換える

なぜだかgawkが初期設定ではインストールされていないことが多い。そして、いつもうっかり忘れてawkコマンドが通らずびっくりします。備忘録として今の環境のawkが何であるのか調べるコマンドです。

f:id:S_E_Hyphen:20191116153657p:plain

sudo dpkg  -l でインストール済みの全てのパッケージが表示されます。余りに長いのでgrep で検索しています。

 

f:id:S_E_Hyphen:20191116153808p:plain

そして sudo apt install gawkgawk をインストールしました。実際には、この状態で mawk も使えるのですが、シンボリックリンクの繋ぎ変えが行われているようです。

 

メールで要求して処理を実行するスクリプト

地域図書館の貸出記録を取得  で 作成したデータベースをメールで操作できるようにしました。

まず、スクリプト専用に gmail捨てアドレスを取得しました。 gmail の受信にあたっては

Linux bashでGmailの受信メールを見る - min117の日記 を参考にさせてもらいました。なお、今はアカウント設定で「安全性の低いアプリのアクセス」を有効にしておかないと、 curl を使用した場合 gmail は「401エラー」を返してきます。

f:id:S_E_Hyphen:20191104135815p:plain



gmail の feed はXML形式なのでxpathコマンドでentry ごとに送信者アドレスや表題(subject)、本文を取得してゆきます。取得した値は別途データベースに登録しておき、既に処理済みのメールなのか、初見のメールなのかを判断します。

当初はsubjectに特定の文字が入っていることをトリガーとして処理を実行させようとしていたのですが、subjectが一緒だと同一スレッドとして取り扱われてしまい、変数bodyに期待していたのとは違う値が入ってしまうことがわかりました。そこで仕方なしに発信者アドレスをトリガーとして、ジョブは本文ではなく表題で実行することにより問題を回避しました。

最後に検索結果は mail コマンドにより普段使いのアドレスから発信することにしています。本当は gmail捨てアドレスから送信できるようにしたかったのですが、 .mailrc でSMTP認証の設定が良く判らなかったため、このようになりました。 

#! /bin/bash
mysql -h 192.168.0.16 life_log << _SQL_
 create table if not exists gmail (
  id varchar(100),
  address varchar(30),
  sub tinytext,
  body tinytext
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
_SQL_

username="XXXXXXXX"
password="YYYYYYYY"
myaddress="mmm@ooo.zzz.ne.jp"

# GMAIL の受信
temp=`mktemp ./XXXX`
curl -u $username:$password --silent "https://mail.google.com/mail/feed/atom" > $temp
num_entry=`\
cat $temp |\
 xpath -q -e "//fullcount/text()" 2>/dev/null  `
for (( entry=1; entry<=${num_entry}; entry++ ))
do

# ID
 id=`\
 cat $temp |\
  xpath -q -e "//entry[${entry}]" 2>/dev/null |\
  xpath -q -e "//id/text()" 2>/dev/null `
# 発信者
 address=`\
 cat $temp |\
  xpath -q -e "//entry[${entry}]"  2>/dev/null |\
  xpath -q -e "//author/email/text()" 2>/dev/null `
# 表題
 sub=`\
 cat $temp |\
  xpath -q -e "//entry[${entry}]" 2>/dev/null |\
  xpath -q -e "//title/text()" 2>/dev/null`
# 本文
 body=`\
 cat $temp |\
  xpath -q -e "//entry[${entry}]" 2>/dev/null |\
  xpath -q -e "//summary/text()" 2>/dev/null |\
  awk '{print $1}'`

# もしIDが一致するレコードが存在すればループへ戻る
num_line=`\
mysql -h 192.168.0.16 life_log -N << _SQL_
 select count(*) from gmail where id="${id}";
_SQL_`
if [ $num_line -ne 0 ]
then
 continue
fi
# 初見ならばデータベース登録しlibrary検索を実施
mysql -h 192.168.0.16 life_log << _SQL_
 insert into gmail(id,address,sub,body)
  value("${id}","${address}","${sub}","${body}");
_SQL_
if [ ${address} = ${myaddress} ]
then
 cat << + > to_mail.txt
図書館借用記録の検索結果【${sub}】
+
 mysql -h 192.168.0.16 -N life_log << _SQL_ >> to_mail.txt
  select title,出版社,発行年月 from library where auther like "%${sub}%";
_SQL_
fi

address="${address}"
title="検索結果【${sub}】"
cat to_mail.txt |\
  tee -a /dev/stderr |\
  mail -v -s "$title" ${address}

done
rm $temp to_mail.txt

 あちこち工事中のような印象のスクリプトではありますが、これを crontab に登録するなどして定期的に実行させることにより、図書館に居ながら著者名をメール送信するだけで「この本は既に借りたことがあったか」確認できるようになりました。

 

飾り棚

今年はやや質素。

f:id:S_E_Hyphen:20191029082738j:plain

壺の中身はおかず豆。

大豆100グラム
ニンジン50グラム
シイタケ15グラム(2枚)
コンニャク50グラム(4分の1)
塩昆布10グラム

を材料としました。少し辛めだったかな?塩昆布の割合を少し減らしても良さそうです。

高杯の中身は今年漬けた梅干しです。

平腕の切干大根の煮物は、お弁当のおにぎりの具になりました。

 

コールスロー

キャベツの芯付近が残ったので酢漬けをつくってみました。

まずみじん切りにします。約90グラムでした。

これに酢を適当量加えます。結果的に70グラムでした。重しをして冷蔵庫で半日程度寝かせます。

f:id:S_E_Hyphen:20191025114449j:plain

おいしいのでアッという間に食べきってしまいました。よく漬かっていたので、酢の量はもう少し減らせるような気がします。キャベツ:酢=2:1くらいで良いような気がしています。それよりも漬け汁が大量に余ってしまう事がもったいないですね。有効利用の方法を模索中です。

 

大豆の水煮

近所の食料品店で大豆を買ってきました。200グラムで約300円でした。

1)うち100グラムをよく洗って、一晩水に漬けます(写真-1)。

f:id:S_E_Hyphen:20191025103947j:plain

写真-1 一晩水に浸した大豆

2)豆100グラムに対して水300CCを加え一煮立ちさせます。結構あくが出るので、おたまなどで掬い取ります。

3)スチームスタンドなどを中蓋として6分間加圧します。

4)煮汁ごと冷まして出来上がりです(写真-2)。

f:id:S_E_Hyphen:20191025104838j:plain

写真-2 煮あがった大豆

 

煮汁を捨てた後の個体部分だけの重量を測定してみたら240グラムになっていました。ということは480グラム/300円ということになります。100グラム約100円の市販の水煮よりは少しだけお得です。あとは手間をどう考えるかですね。

やっぱり赤外線が好き

赤外線コードレススピーカーシステム AT-SP350TVaudio-technica製)を購入しました。単三型乾電池4本を電源とし、赤外線通信する仕組みのものです。

f:id:S_E_Hyphen:20191020095454j:plain

これまでは手元用スピーカーとして、専用の充電台でニッケル水素電池に充電するタイプの、2.4GHz帯無線による他社製スピーカーを使用していました。通信方式と電源の2つの観点から比較してみます。

 

① 通信方式

赤外線通信は遮蔽物が有ると通信が確立できません。一方2.4GHz帯は浴室の壁程度は平気で通過しますので集合住宅なら部屋の隅々まで受信可能でした。しかし、もし隣家が全く同じ製品を所有していた場合、混線の危険性は無いのでしょうか?周囲に聞こえないように手元スピーカーで音量を絞って聞いているのに、実は隣人に丸聞こえだったなんて少し嫌ですね。

また2.4GHz帯も音跳びはします。もちろん赤外線通信も途絶えることは有ります。しかし、障害物が間に入ったとか、受信機に直射日光が当たるようになったとか、原因が明瞭です(実際、スピーカーから音が突然聞こえなくなったと思ったら、太陽の位置が変化していて受信部に強い日光が当たるようになっていたという事例は多かったです)。

一方で2.4GHz帯の音跳びは原因が不明です。電池の残量が減少して電圧が変化したのかも知れません。あるいはWi-Fiの通信量が急増して干渉しているのかも知れません。とにかく理由が目に見えないのです。音跳びまでのことはないにしても、音量が突然変化したりして結構ストレスフルでした。

精神的なものでしょうが、重要な情報に限って、

「明日の天気は・・・(ビビッ)・・・のち(バビッ)。最高気温は(ブブブブブブ)。以上天気予報でした。」

なんてことになっていたような気がします。

② 電源

専用の充電台で充電できることは確かに大変便利です。しかし、ニッケル水素電池はユーザーが自分で交換することができないため、結局電池の寿命が製品の寿命となってしまいました。単三電池の入れ替えの手間は必要となりますが、広く流通しているものを使うタイプの方がライフタイムは長くなる気がしています。

 

今のところ唯一残念なのはステレオにならない点ですね。どうしてもステレオとして聞かなくてはならない場合は、 AT-SP350TV では対応できなさそうです。

あと、Bluetoothスピーカーというのは試したことが無いので興味を持っているところです。

 

 

スマホをLINUXサーバーにする

スマホtermux をインストールした上で、 sshd を起動してみました。実際にはCPUやネットワークの問題で、スマホをいわゆるサーバーとして使用するのは重過ぎます。しかし、一方でシェルスクリプトスマホの小さなキーボードで書いたりテストしたりするのも非現実的ですので、外部から潜り込める環境は必須だと思います。

作業にあたっては、

AndroidでLinuxターミナル!termuxの初期設定 - lisz-works

TermuxでSSH Serverを起動する - Qiita

sshで公開鍵認証を使ってアクセスする - Qiita

などを参考にさせてもらいました。

 

まずスマホに termux をインストールし、ターミナルを起動します。

apt update
apt upgrade
termux-setup-storage
apt install openssh

を、それぞれ実行します。この状態で sshd は起動可能ですが、安全を期すため

ssh-keygen
cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
cp ~/.ssh/id_rsa ~/storage/downloads

をしておきます。ここまでの作業はスマホの小さな画面上で行わなくてはならないので大変です。なお、ssh-keygen では passphrase を入力する必要が有りますので、紙などに記録しておきます。さて、~/storage/download/id_rsaubuntu PC の ~/.ssh へ持ってきます。 ~/storage 以下はスマホのファイルマネージャーなどで操作することが可能ですから、メールや転送ソフトなどを利用することができます。そして、再度スマホのtermuxターミナルで

sshd

を実行しておきます。以下はクライアントである ubuntu PC で実行します。

ssh -i ~/.ssh/id_rsa -p 8022 -l ユーザー名  IPアドレス 

 

f:id:S_E_Hyphen:20191006164246p:plain

スマホが省電力モードになっていると、アクセスできない場合があります。画面ロックを解除した状態で ssh を実行しましょう。このときtermuxは必ずしも起動させておく必要はありません。また、passphrase を聞かれたらssh-keygen で設定したものを入力します。

ここまでが成功すれば、

sftp -P 8022  IPアドレス 

でファイルの転送も可能になります。