室温記録の続き。

 

きょうび、何らかのライブラリを使って自力でグラフを描くというのは流行らないのかも知れない。使ったことはないが、gnuplotとかいう有名なツールがあるし、何より表計算ソフトを使えば実に手軽に掛けてしまう。

 

しかしながら、表計算ソフトは起動が遅い、ファイルを開くのがだるい、という問題(?)もある。折れ線グラフくらいなら簡単なので自前で書いてみようと思ってプログラムを書いてみたのだが、案の定、思うようなものは直ぐにはできないのであった。

 

慣れている(といっても纏まったプログラムは数えるほどしか書いていないが)PythonとPyCairoを使っている。Pangoの扱いを失念していて、文字を書いていくと次々に座標がづれていくことの原因になかなか気づかず、思わぬところで手間取ってしまった。(ちなみにCairoのインスタンスを使いまわしていたのが原因)。

 

tailでログファイルを適当に切り出し、所定のファイル名で保存。その後、作ったプログラムでグラフを描かせている。何の汎用性もないが、スケール調整くらいはできるようにしたいなあ。

 

今晩はエアコン無しでも27℃前後で安定している。わずかに下がっている箇所は窓開け換気によるもの。

UIにはGTKを使っているが、png出力なので画像ビューアで見ても良いし、ブラウザでも構わない。便利といえば便利。

 

esp8266(以下子機)のほうがどうにか一段落したので、次はデータ収集の方法について。

 

とりあえず、音出しサーバ(以下親機)から問い合わせすることにし、cronを仕掛ける。

 

Slitazのcronは例によってbusyboxである。毎度機能不足で問題を起こすBusyboxのアプレットだけど今回は大丈夫(多分)。

 

デーモンの起動|停止|再起動
sudo /etc/init.d/crond start|stop|restart

恒常的に動かすには /etc/rcS.conf を編集して、RUN_DAEMONS=にcrondを書き加える。

 

crontabの編集
crontab -e

尚、デフォルトの格納先は /var/spool/cron/crontabsである。

 

crontabの中身
今回のように一定時間おきに何か実行する場合
例)2分おき
*/2 * * * * command

 

時刻と温度(室温)を記録すれば良いので、適当にシェルスクリプトを書く。

#! /bin/sh
wget --directory-prefix=/home/tux/Downloads 192.168.11.10 > /dev/null 2>&1
tempt=`cat /home/tux/Downloads/index.html|cut -d" " -f2`
tm=`date|cut -d" " -f5`
echo $tm" "$tempt >> /home/tux/Downloads/log.txt
rm /home/tux/Downloads/index.html

子機側で真面目にHTTPを返しているのでwgetでファイルに落としている。面倒なのとストレージの無駄なので後日修正予定。

 

 

せっかくなので、測定記録をLibreofficeでグラフにしてみた。

 

21時38分からの室温の記録。得られたデータをそのままグラフにしてみたが、この程度の用途なら精度は0.5℃もあれば充分なので、データは加工すべきだった。

 

 

流石に29度は暑いので23時15分頃、エアコンのスイッチを入れた。設定温度は28℃、風量は微風で固定。一気に26.5℃まで下げた後上昇しているが、それでも28℃は超えていないのが判る。旧式(20年位前)のエアコンだが、それなりに制御されているようだ。

 

自分宛メモ。

 

speedguide.net で現在の値と推奨値を調べる。

/etc/sysctl.conf を編集する。


net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_wmem = 48180 64240 128480
net.ipv4.tcp_rmem = 48180 64240 128480
net.ipv4.tcp_mem = 1024000 1024000 1024000

net.core.rmem_max = 128480
net.core.rmem_default = 64240
net.core.wmem_max = 128480
net.core.wmem_default = 64240


sudo sysctl -p

 

確認は iperf -s

 

LAN上にあるPCを音出し及びファイル置き場として使っています。サーバーですが、常時通電している訳ではなく、必要な時だけ動かして使うスタイルです。

 

起動はLAN経由(Wol)で行うのですが、OSのブートシーケンスが完了し待ち受け状態になるまでクライアントからアクセスできません。

 

今まではPCの筐体についているパイロットランプを見て判断していたのですが、先日配置を直した際、配線の都合で見づらい方向に向けざるを得なくなってしまいました。

 

ここで、サーバーが待ち受け状態になったかどうかをどうやって把握するか、が改めて問題になったという訳です。

 

今回は単純にWebサーバーを利用することにしました。サーバーのOS(Slitaz)は設定ツールのGUIにWebを使うのでデフォルトでhttpd(Busybox, ポートは82)が動いています。また、別途追加でWebサーバー(lighttpd,ポートは80)をインストールすることもできます。

 

手順としては、

wakeonlanでマジックパケットを流してサーバーを起動する。

Webサーバーにリクエストを出す。正常終了であれば、サーバー起動終了と見なしてクライアント側のデスクトップに通知を出して終わる。

 

取り敢えずシェルスクリプトを書いてみました。

 

サーバーから正常終了が返されるまで、(僅かな時間ではありますが)スクリプトが動きっぱなしになるのが難点です。適当なところでタイムアウトすべきでしょうが、それは今後の課題ということで。

 

#! /bin/sh
wakeonlan xx:xx:xx:xx:xx:xx
while true
do
    echo -en "GET / HTTP/1.1¥n¥n"  | nc 192.168.xx.xx 80 > /dev/null
    if [ $? -eq 0 ]; then
        notify-send --urgency=critical -i -a "サーバーチェック" -i dialog-information "Webサーバの起動を確認しました。"
        break
    fi
done

 

自分宛てメモ

 

sudo sh -c "echo 30 > /proc/sys/vm/swappiness"

 

sysctl

 

sync

echo 3 > /proc/sys/vm/drop_caches


sysctl -p 

/etc/sysctl.conf  現在(16.04)でも有効なのか?

 

/etc/sysctl.d/

wikipedia(en)の記事によれば、現行のsshfsはfuseを書いた人が書き直したバージョンらしい。

 

しばらくLAN内で使ってみたが、sshfsそのものに特にこれといった問題は無さそうである。wikipedia(en)にも書かれてるが自分なりに特徴をまとめてみると、

 

良い点

  • sshが通っていれば、別途認証やポートの開閉等の設定が要らない。
  • sftpと違ってファイルシステムなので、アプリケーション側でプロトコルをサポートしなくて済む。
  • ファイルシステムなのでマウントポイントより上位のディレクトリへのアクセスをある程度抑止できる(リンカ張られていれば別)。
  • sshなので安心、一応。
  • そこそこ速い。

 

 

悪い点

  • パーミッションの取り扱いが適当。
  • エラーも適当。
  • 試していないが、おそらく複数ユーザでサーバー上の同一ディレクトリに同時にアクセスすると大変なことになりそう。

 

ということで、個人的な小さいシステムで手っ取り早くサーバー上にファイルシステムを構築したい、という時にはこれで充分と思われる。

 

マウント、アンマウント用にスクリプトを書いた。デスクトップにメッセージを通知するようにしてあるのだが、肝心のメッセージが雑すぎて初心者向きではない。上の図のエラーは、既にマウント済みのものを再度マウントしようとした時のもの。マウントポイントのパーミッションがrootに変更されているので、パーミッションエラーになっている。

 

自分宛メモ

 

Slitazではデフォルトのデスクトップ環境(LXDE)における画面通知(libnotify)の設定変更(テーマ、表示位置)がうまくかからない。

xfce4でも同様。

しかし、MATEをインストールすると可能になる。

 

 

 

自分宛てメモ

 

sshfs を使っていて、ディレクトリに書き込めなかったり、ディレクトリの内容が見えなくなったりする事があった。

 

パーミッションが一貫していない、というエラーメッセージだったので、ひたすら777を設定してみたりしたが変化なし。

 

クライアント側 ユーザー sakai ID:1000 (以下sakai:1000、他同じ)
サーバー側 tux:1000, この他にsakai:1002

 

ここで
sshfs tux@192.168.11.hoge:/home /home/sakai/sshfs -C
とやると、不自由なく書き込める。

ls -l とやると、ユーザー欄には sakai と表示される。 ls -n だと 1000 である。

 

次に、一旦アンマウントし、
sshfs 192.168.11.hoge:/home /home/sakai/sshfs -C
でマウントする。ユーザーを省略しているので、暗黙のうちにクライアントのユーザー(ここではsakai)が使われる(はず)。
ここで、例えばサーバー側の任意のディレクトリにクライアントからファイルをコピーする(以下ファイルB)と、転送先のディレクトリのパーミッションの許す範囲で書き込める。

で、ls -l では、ユーザー欄は sakai で変化なし。 ln -n だと 1002 となっている。名前は同じでも別アカウントという、(おそらくは通常起こりえない)一貫性のない状況が発生する。

 

再度アンマウントし、再び sshfs tux@192.168.11.hoge:/home /home/sakai/sshfs -Cでマウントしてみる。
件のディレクトリは既に得体の知れないものと変わり果てており(ディレクトリのパーミッションではなく、中のファイルがおかしいだけなのだけれど)クライアント側のThunarではアクセスできなくなってしまう。
端末を開き、ls -l を実行すると、ユーザー欄はsakaiに混じってファイルBは1002で表示される。これはクライアント側にID1002で登録されているユーザーがいないからと思われる。

 

sshfs には回避策が用意されている。取り敢えずマウント時に -o idmap=user を指定すると、サーバー側のIDをクライアント側にマプして見せる。 クライアント側のIDをサーバー側にマプして見せる。上記の例だとsakai:1002 -> sakai:1000 に化ける。しかし、化けるのはUIDのみ。グループIDはそのままなので、ls -l を実行すると、未定義のグループに所属しているように見える。

 

GIDまで化けさせるには別のオプションを使う。
-o idmap=file,uidfile=FILE,gidfile=FILE,nomap=ignore
FILEの中身は
username:ID  (あるいはgroupname:ID)

 

ファイルに書かれているusername:ID(あるいはgroup:ID)をサーバー側のディレクトリに見つけたら、クライアント側のユーザーID(あるいはgroup:ID)で置き換える。

例:クライアントユーザー sakai:1000、ファイル内容(uidfile,gidfileとも) sakai:1002、サーバー上のファイル sakai:1002 の場合、ls -n を実行するとユーザーID1000,グループID1000に見える。

 

最期のnomap=ignore はidmapに失敗した時の挙動(エラー終了か無視か)を決める。失敗した時、というのはFILEに記載されていないuserやgroupに遭遇した時、という事らしい。ので、ignoreが正解。

 

上記を踏まえて、前記事で書いたスクリプトを少し修正した。マウント/アンマウントのGUIに汎用性を持たせようとすると結構手間かも知れない。

 

自分宛てメモ

 

Slitazには接続用ツールとしてxsshfsというパッケージがある。

 

 

Mintには無さそう(ろくに調べてもいないが)なので、間に合せのスクリプトを書いた。いずれにせよ、ファイルマネージャから直接操作できないのは不便。こういう時、ROX-Filerのアプリケーションディレクトリは便利かも知れない。(ファイル名の受け渡しで苦労するが)

 

/etc/fstabの書き方次第では起動時にマウントせずに使う時にマウントする、といったことも可能らしいのだけれど、ネット上で見つけた設定をコピペしても手元の環境(LinuxMint17)ではうまく動かない。この他、マウントしたままだとシステム遮断時にフリーズする場合もあるらしいが、今のところ遭遇していない。

 

 

自分宛てメモ

 

Usage:
  notify-send [OPTION...] <SUMMARY> [BODY] - create a notification

Help Options:
  -?, --help                        Show help options

Application Options:
  -u, --urgency=LEVEL               Specifies the urgency level (low, normal, critical).
  -t, --expire-time=TIME            Specifies the timeout in milliseconds at which to expire the notification.
  -a, --app-name=APP_NAME           Specifies the app name for the icon
  -i, --icon=ICON[,ICON...]         Specifies an icon filename or stock icon to display.
  -c, --category=TYPE[,TYPE...]     Specifies the notification category.
  -h, --hint=TYPE:NAME:VALUE        Specifies basic extra data to pass. Valid types are int, double, string and byte.
  -v, --version                     Version of the package.

 

icon の名称はSTOCK_DIALOG_ERROR等ではなく、ランチャー作成時にアイコンを設定する際呼び出される一覧に表示されるもの、らしい。

参考
https://developer.gnome.org/notification-spec/

 

アイコンはこれで調べた。単独で呼び出す方法は知らない。


Search

Calendar

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< August 2017 >>

Archive

Mobile

qrcode

Selected Entry

Link

Profile

Search

Other

Powered

無料ブログ作成サービス JUGEM