ひじきの煮物

土井善晴先生のテレビ番組を参考にして、ひじきの煮物を作ってみました。

f:id:S_E_Hyphen:20180204105924j:plain

材料は

ひじき 7グラム

ニンジン 1/4本

薄揚げ 半枚

しょうが 20グラム 

です。

ひじきは15分程度水で戻します。薄揚げは油抜きをしておきました。しょうが、ニンジン、薄揚げを千切りし、フライパンに掛けます。ひじきを加えたら約100ccの水で煮込みます。ある程度煮立ってきたら、かえし醤油(20cc)を加えて煮汁が無くなるまで火を入れました。

ブリの照り焼き と同様に、やはり25分程度かかりました。

f:id:S_E_Hyphen:20180204110620j:plain

味は思っていたものよりも、ずいぶんと薄味でしたが、何かアレンジが期待できそうな感じとなっています。

 

MYSQLでのバイナリ取り扱いが難しい

MYSQLを使用した「らじる☆らじる」の録音と再生  で紹介していた録音が先週の早朝(2018年1月24日午前6時過ぎ)に突然動作しなくなりました。

そのような時刻に何か設定変更をしているはずもなく、停電などによるサーバー停止なども確認できませんでした。

色々原因を探っていたところ、どうやらMYSQLのinto dumfile 文とload_file()関数が期待通りの挙動をしなくなっていたことが先日わかりました。

具体的には、

 select sound into dumpfile "$file" from t_sound;

で、secure_file_priv で指定されたディレクトリにファイルを作成すると、所有者が通常とは異なるユーザ(ユーザー名:mysql)となってしまうのです。このため、作成したファイル$fileが消去も含めてアドミニストレータ権限でないとできなくなっていたのです。

同様に、load_file()関数も所有者がmysqlであるファイルでないと、NULL値となってしまっていました。

時間帯を考慮すると、おそらく自動アップデートによりレビジョンアップが行われたのだと推測できます。この動作は「ファイルはすべてのユーザーから読み取り可能」「上記の条件が満たされていないために、ファイルを読み取ることができない場合、この関数は NULL を返します。」というload_file()関数の仕様を満たしています。しかし、私が期待していた「ゆるい」動作ではなくなってしまったということです。

MYSQLでのバイナリデータの取り扱いを更に増やしてゆこうと考えていたところだったので困っています。バイナリを使わない下記のような方法も考えてみましたが、mysqldへの負担が半端ではなかったため、現在停止させています。

 

 


登録側

#!/bin/bash

mysql nhkradio << _SQL_
create table if not exists t_sound(
 seq int,
 estimate datetime,
 sub_seq int,
 sound int,
 INDEX(estimate)
);
create table if not exists t_volume(
 seq int primary key auto_increment,
 DLdate datetime,
 estimate datetime,
 number int,
 fullname varchar(100),
 rms double,
 INDEX(estimate)
);
_SQL_

if [ -z $num ] ; then echo "num が不明";exit;fi
if [ -z "$estimate" ] ; then echo "推定時刻が空白";exit;fi
if [ -z "$fullname" ] ; then echo "URL が不明";exit;fi
if [ -z "$rms" ] ; then echo "音量 が不明";exit;fi
if [ ! -e $num.raw ]; then echo "rawファイルがない";exit;fi

seq=`\
mysql nhkradio -N << _SQL_
  insert into t_volume(DLdate,estimate,number,fullname,rms) 
     value(now(),"$estimate",$num,"$fullname",$rms);
  delete from t_sound where estimate
                    <now() - interval 48 hour;
  delete from t_volume where estimate
                    <now() - interval 48 hour;
  select last_insert_id();
_SQL_`

cat $num.raw |\
  od -w2 -t d2 -v -An |\
  awk -v seq="$seq" -v estimate="$estimate" \
     '{OFS=","}{print seq,estimate,NR,$1}' > loadfile.txt
mysql nhkradio << _SQL_
 load data local infile "loadfile.txt" into table t_sound
 fields terminated by "," (seq,estimate,sub_seq,sound);
_SQL_
rm loadfile.txt

 

再生側

#!/bin/bash
date1=`getparstr $# "$*" "date1"`
date2=`getparstr $# "$*" "date2"`

temp=`mktemp ./XXXX`
mysql nhkradio -N << _SQL_  > $temp
  select sound from t_sound
   where "$date1"<=estimate and estimate<="$date2"
   order by seq,sub_seq;
_SQL_

scilab -nw << _SCILAB_
 fd=mopen('$temp','r');
 a=mfscanf(-1,fd,'%d');
 mclose(fd);
 y=a/(2^15);
 wavwrite(y, 8000, 'playback.wav');
_SCILAB_
#sox -r 8000 -c 1 -b 16 -e signed-integer playback.raw playback.wav
aplay playback.wav
rm $temp playback.wav

SCILABのコンボリューション

scilabでコンボリューションを実施するときは、c=convol(b,a)を使います。

しかし信号処理の場合、周期Tをもって無限に繰り返し循環する「継続時間が無限大」の関数とみなして取り扱いたいことがあります。具体的には波の終端に始点がつながっているとします。

f:id:S_E_Hyphen:20180128122318j:plain

このようなとき、

[c,e]=convol(b,a); [d,e]=convol(b,a,e);

とすると、2回目のconvolの結果は尻尾と頭がつながっているとしてオーバーラップ加算を実施してくれます。

図中の黒線がオリジナルの例題波です。これにconvol を用いて [1/3 1/3 1/3] という3要素分の移動平均を実施した例です。

青線ではオーバーラップ加算を考慮していません。始点の青丸は1と2の平均ですから、ほとんどゼロです。一方赤線はオーバーラップ加算を考慮しているため、1の前に16の要素があります。ですから、その平均値は12.33となっています。

2から15に関しては、前後に最低1個以上要素がありますので、オーバーラップ加算を考慮しても、しなくても同じ値となります。

ハニングやハミングウィンドウによるスペクトルの平滑化を行う場合、このオーバーラップ加算は役に立つものと思います。

#!/bin/bash
gmt gmtset FONT_ANNOT_PRIMARY 8p,GothicBBB-Medium-UniJIS-UTF8-H,black
gmt gmtset FONT_LABEL 10p,GothicBBB-Medium-UniJIS-UTF8-H,black
gmt gmtset FONT_TITLE 10p,GothicBBB-Medium-UniJIS-UTF8-H,black

scilab -nw << _SCILAB_
 a=[38 -33 -19 -10 1 -8 -20 10 -1 4 11 -1 -7 -2 5 32 ];
 b=[1/3 1/3 1/3];
 rot=(size(b,'*')-1)/2;
 [c,e0]=convol(b,a);
 [d,e1]=convol(b,a,e0);
 c=[c(rot+1:16) c(1:rot)];
 d=[d(rot+1:16) d(1:rot)];

 fd=mopen('smoothed.txt','w');
 for i=1:16,
  mfprintf(fd,'%d %f %f %f\n',i,a(i),c(i),d(i));
 end,
 mclose(fd);

_SCILAB_

cat smoothed.txt |\
 awk '{print $1,$2}' |\
 gmt psxy -JX20c/4c -R0/17/-40/40 -BnSeW+t"b=3⊿t" -Bxa1+l'pt' \
 -Bya20g100 -W1p,black -K > convol_test.ps

cat smoothed.txt |\
 awk '{print $1,$3}' |\
 gmt psxy -J -R -B -W1p,blue -O -K >> convol_test.ps

cat smoothed.txt |\
 awk '{print $1,$4}' |\
 gmt psxy -J -R -B -W2p,red -O >> convol_test.ps

 なおコンボリューションの性質上、38*1/3+(-33)*1/3+(-19)*1/3 の結果が第一要素に入ってしまいますが、これを第二要素として取り扱いたいという要求が有ります。このためc=[c(rot+1:16) c(1:rot)];という、やや巧妙な(小狡い?)ことを行っています。変数rotはbの要素数を考慮して1が入るようになっています。

嚥下障害 ~伊予柑~

嚥下障害 ~みかん~ では普通のみかん、いわゆる温州ミカンを使いましたが、今回は大玉の伊予柑を使用してみました。

伊予柑くらいになると、薄皮を剥くのも比較的容易です。

偶々ですが、半個(4房)でちょうど100グラムとなったので、とろみ剤大さじ1杯を加えて、水分調整もせずにそのままミキサーで撹拌しました。

f:id:S_E_Hyphen:20180127094212j:plain

思っていたよりも甘味が強く、また薄皮由来の雑味も有りません。ビタミンCの添加も必要ありませんでした。

自画自賛になりますが、予想外のヒットかも知れません。

図の大きさから-Rオプションを決定する

GMT ver.5で、緯度経度がわかっている複数の点を全て地図中にプロットしようと思います。メルカトル図法を使用するならば、例えば

 gmt psxy -JM20c -Rwest/east/south/north -B

のように地図の幅を20cmとして描画することができます。ただし地図の高さが何センチメートルになるかは指定できません。緯度と経度は縮尺を介して従属関係にあるので当然と言えば当然ですが、この為にしばしば図-1のように思いもよらない縦長の絵になってしまうことがあります。

f:id:S_E_Hyphen:20180122093924j:plain

図-1 横幅を大きく指定しすぎた例

 

 画面では余り気になりませんが、A4ランドスケープで描画した場合は図面の上半が切れてしまいます。そこで、図の幅と高さを指定して緯度経度の範囲を再決定するシェルスクリプトを作成してみました。リスト-1に示します。

指定した緯度経度では、所望のアスペクト比よりも縦長になる場合、東西に範囲を広げて自動的に指定したアスペクト比となるようにします(図-2の例)。逆に横長になってしまった場合は、南北に範囲を拡張します。

 

f:id:S_E_Hyphen:20180122095009j:plain

図-2 gmt_rangesetにより東西を自動的に拡張した例

 

メルカトル図法以外には対応していませんし、 緯度・経度の比を求めるのに球面近似を使用しているなど不十分な点はありますが、とりあえず見れる図面を描くためには便利なツールだと思っています。

 

リスト-1 gmt_rangeset のリスト
#!/bin/bash
sdoc=\
" gmt_rangeset  - 図面の大きさから\n"\
"                  緯度経度の範囲を\n"\
"                  を設定する      \n"\
"   ※メルカトル図法(-JMオプション)\n"\
"     に対応します                 \n"\
"                                  \n"\
" [ require]                       \n"\
"    width  地図の幅(単位:cm)    \n"\
"    height 地図の高さ(単位:cm)  \n"\
"    range  経度・緯度の最大最小値 \n"\
"     -Rwest/east/south/northで指定\n"\
"                                 \n"\
" [ 出力 ]                         \n"\
"    -JM{width}c -Rw/e/s/n         \n"\
"    図の高さがheight(cm)より小さい\n"\
"    ことが予想される場合は        \n"\
"     n=north+α s=south+α して   \n"\
"    図の高さをheight(cm)になるよう\n"\
"    調節する                      \n"\
"    逆に大きくなる場合は          \n"\
"     e=east+α w=west-α とする   \n"\
"                                \n"
export sdoc

width=`getparstr $# "$*" "width"`
height=`getparstr $# "$*" "height"`
range=`getparstr $# "$*" "range"`
if [ -z $width ]; then usage;exit; fi
if [ -z $height ]; then usage;exit; fi
if [ -z $range ]; then usage;exit; fi
if [ `echo $range | cut -c1-2` != "-R" ]; then usage;exit; fi
 
xmin=`echo $range | sed -e "s/-R//g" | awk -F"/" '{print $1}'`
xmax=`echo $range | sed -e "s/-R//g" | awk -F"/" '{print $2}'`
ymin=`echo $range | sed -e "s/-R//g" | awk -F"/" '{print $3}'`
ymax=`echo $range | sed -e "s/-R//g" | awk -F"/" '{print $4}'`
ymean=`echo $range | sed -e "s/-R//g" | awk -F"/" '{print 0.5*($3+$4)}'`
prjx=$width
prjy=$height

temp=temp.txt
scilab -nw << _SCI_
 xmin=${xmin};xmax=${xmax};ymin=${ymin};ymax=${ymax};
 height=1/cos($ymean*%pi/180)*(ymax-ymin)/(xmax-xmin) * $prjx;
 ratio=height/$prjy;
 fd=mopen('$temp','w');
 if ratio<1,
  ymax=$ymean+($ymax-$ymin)/ratio/2;
  ymin=$ymean-($ymax-$ymin)/ratio/2;
  mfprintf(fd,'-JM%sc ',"${prjx}");
  mfprintf(fd,'-R%f/%f/%f/%f\n',xmin,xmax,ymin,ymax);
 else
  xmin=0.5*$xmin*(1+ratio)+0.5*$xmax*(1-ratio);
  xmax=0.5*$xmin*(1-ratio)+0.5*$xmax*(1+ratio);
  mfprintf(fd,'-JM%sc ',"${prjx}");
  mfprintf(fd,'-R%f/%f/%f/%f\n',xmin,xmax,ymin,ymax);
 end
 mclose(fd);
_SCI_
cat $temp; rm $temp

 

 

 

リスト-2 gmt_rangeset の使用例
#!/bin/bash
cat <<+ > GPSsite.txt
利尻 960501 45.1377 141.1671
滝上 960504 44.1919 143.0768
愛別 960506 43.9084 142.5777
旭川 960508 43.7385 142.4096
北竜 960509 43.7408 141.8738
上川 960510 43.7714 142.9030
富良野 960514 43.3363 142.3953
三笠 960516 43.2484 141.8909
小樽2 960517 43.2095 140.8606
新得 960518 43.1655 142.8097
江別 960520 43.0776 141.5401
帯広 960521 42.9389 143.1706
恵庭 960522 42.8844 141.5774
千歳 960523 42.7732 141.4071
虻田 960525 42.5514 140.7676
伊達 960526 42.4739 140.8764
奥尻2 960527 42.0605 139.4462
砂原 960528 42.1231 140.6669
七飯 960529 41.9767 140.7154
上ノ国 960530 41.8030 140.0712
+ proj=-JM10c range=`\ cat GPSsite.txt |\ awk '{print $4,$3}' |\ gmtinfo -I0.5/0.5 ` range=`gmt_rangeset width=20 height=15 range=$range | awk '{print $1,$2}'` proj="" echo $proj $range gmt psbasemap $proj $range -Baf -K > map.ps gmt pscoast -J -R -B -Ggray -Df -O -K >> map.ps cat GPSsite.txt |\ awk '{print $4,$3}' |\ gmt psxy -J -R -B -Ss0.5 -Gred -O -K >> map.ps cat GPSsite.txt |\ awk '{print $4,$3,$1}' |\ gmt pstext -J -R -O -F+jMR+a0.0+f12p,GothicBBB-Medium-UniJIS-UTF8-H,0/0/0 -Dj0.25c >> map.ps

炊き込みご飯

油抜き をしたうすあげ 1枚

ささがきごぼう 約30g

えのきだけ   約30g

米       1合

水       200cc

かえし醤油   25cc(カンロレードル1杯)

 

を圧力鍋で5分間加圧しました。加圧後、十分に蒸らすことが大事です。

ごぼうとえのきは適量で良いと思います。30グラムは目安程度に考えて下さい。

f:id:S_E_Hyphen:20180120093741j:plain

少し写真映えしませんね。ニンジンを加えた方が、より「フォトジェニック」だったかも知れません。

あと炊き込みご飯にゴボウは欠かせません。とてもよい香りがします。