2016年4月21日木曜日

Raspberry PiのLinux、Raspbian atコマンドで学んだshとbashの問題

Raspberry Pi Zeroが日本国内販売はおろか、本家イギリスでも相変わらず入手困難な状況が続いているようです。
そんな中、突如発表発売されたRaspberry Pi 3
ARM Coretex-A53を採用したSoC Broadcom BCM2837を搭載し、Raspberry Pi初となる64ビット機となります。また、無線LANBluetoothも搭載されコレも初。

今後も目が離せませんね♪
Linux三昧
Raspberry Pi 2を購入して以来その魅力に取り憑かれてしまい、オフィシャルOS Raspbianを通じてLinuxが楽しくて仕方ない今日このごろ。
こんな事したら楽しいかな?あんな事したら便利かな?を形にすべく、時間を見てはチョコチョコいじっています。

そんなLinuxには色々便利機能があるのですが、その中の1つにatコマンドというのがあります。

Raspbian標準では入ってなくて、Debian向けに開発されたパッケージ管理システム APTを通じてインストールする事が可能です。

$ sudo apt-get install at

こんな感じでコマンドラインから打ってやるとインストールできます。
atコマンドで出来る事
そもそも、このコマンドで何が出来るか?というと

指定した日時に1度だけ実行できる

Raspbian標準でcrontabという似たコマンドがあり、やろうと思えばこちらでも同様の事が可能です。
しかし、crontabでatと同じ事をしようとした場合、

実行し終わったらスケジュールリストから自力で削除しなければならない

crontabはシステムが稼働中にスケジュール条件のジョブがあった場合に実行するコマンドです。
定期的に動かさなければならない場合に使う事が多いので、1回コッキリの作業にはあまり向かないコマンドです。
うまく動いてくれないジョブ
便利なatコマンドは何度も使っていて、勝手知ったるツモリでこの日もパチパチ作っていました。
登録するジョブのシェルスクリプトを手動でテスト実行したら想定通りの動作。
いざ、本番を想定したatコマンド登録して1分後に実行するようセット。


・・・
・・・
・・・

ただのシカバネのようだ。


ウンともスンとも言いません。
何か間違ってるのかと思い、手動実行するもちゃんと動きます。
実行ユーザーの差も疑ってsudo付けて実行しましたがやっぱりちゃんと動きます。
難航するデバッグ作業
atコマンドは通常は標準出力に文字を表示してくれません。
何かあればメールでメッセージが入ってくる事があるのですが、今回はそれもありません。
今回実行しようとしたシェルスクリプトは、sourceコマンドで別の関数をライブラリ化したシェルスクリプトを読み込んで使うモノでした。
それが上手く動作していないのかと思ったのですが見当ハズレ。
単独で動いた簡単なコード

echo "test" > out.log

これ1行のみのコードの関数を作り、それをsourceコマンドで読み込んでメインスクリプトで実行すると上手くいきます。

もう何が悪いのかわからないヽ(`Д´#)ノ

問題箇所を洗い出すべく、ヤケッパチの作戦に出ました。
すべての行間に

echo "test(任意の数字)" > out.log

これを入れ込んでって、out.logの出力がどこまで動いてるかを見て、停止原因となる箇所特定をしました。
まさかの配列変数初期化で停止
問題箇所はなんてこと無い1行でした。

array=()

シェルスクリプトではなんてことの無い、単に配列を初期化するだけの1行で停止していました。
もちろん、手動で実行すると動いていますから問題がある書き方ではありません。
declare -aという変数宣言コマンドも使ってみましたが動きません。
atコマンドが発するwarningの意味
atコマンドを実行すると良く見かけるのがコレ

warning: commands will be executed using /bin/sh

意味は /bin/shを使って実行されます です。
エラーでは無いためatコマンドは実行してくれるのですが、この警告がとても重要なのです。
Raspberry Pi オフィシャルOSである Raspbianは、標準のシェルとしてbashが使われています。
bashはとても高機能なので幅広く使われてるシェルプログラムなのですが、それも今のようなコンピュータが高性能になったおかげです。
それ以前は、性能の低いコンピュータに合わせたモノが使われていました。
atコマンドの警告表示に出ている/bin/shというのがまさにその使われていたshなのです。
Rasbianでこのshを見てみると

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4  1月 21  2014 /bin/sh -> dash

エイリアスでdashが呼ばれていました。
bashdash、1文字違いでヤヤコシイのですがどちらもシェルプログラムです。
両者同じものならわざわざ別に用意するワケがなく、もちろん別のシェルプログラム。
shとの互換性があるのがdashです。
互換性のないbash
動作しなかった配列変数を調べてみると、bashにはあってdash/shには無い機能の1つでした。
atコマンドが使うシェルプログラムの指定は出来ないのか調べてみましたが、それっぽい記述は見当たりません。
シェルスクリプト側を配列を使わない形に書き換えようとも考えたのですが、パッと良いアイディアが浮かびません。
そこで取った解決方法はコレ

#!/bin/sh
/bin/bash hogehoge.sh

bashを呼び出してシェルスクリプトを実行させる方法でした。
perl/ruby/python/php等のスクリプトも似たようにコマンドで呼び出して実行します。
bash向けシェルスクリプトもそれらと同様の方法で実行しました。
atコマンドがshのワケ
bashdash、1文字違いのシェルプログラムですが、その志しはまったく異なります。

dashPOSIX準拠のシェルプログラムです。
shの機能そのままにコンパクトで高速に動作する事を目的に作られています。
dashで走らせられるシェルスクリプトは実行速度の差はあってもshで走らせられる事ができる互換性のあるモノです。

bashshを拡張して高機能化したシェルプログラム。
後方互換のモノで、shのシェルスクリプトを実行可能にしつつ、さらに便利な機能も実装しているというもの。
ですから、bashの機能を使ってbash向けに作られたシェルスクリプトはshでは動かない可能性があります。

atコマンドもまたPOSIX準拠で作られており、そのためにshを標準シェルプログラムとして使っているのでしょう。
bashの未来
atコマンドのトラブルから学んだ今回のsh/dashbashの問題。
シェルスクリプト冒頭に書く

#!/bin/sh

コレもbash向けシェルスクリプトでは書くべきではないと言われている事は以前から知っていたのですが、今回の一件でその理由が良くわかりました。

bashは今回のRaspbianだけでなく、UbuntuやOS Xでも採用されてるシェルプログラムです。
WindowsもWindows Subsystem for Linuxという形で2016年夏リリース予定のWindows 10メジャーアップデート時に搭載されます。

これだけ見ると未来は明るいように見えますが、一方でPOSIX準拠が取れない現状。
POSIXモードというのも実装されていますが、それを前提として開発するならbashの存在価値は失われてしまいます。

心の片隅にとどめておき、どちらに転んでも良いシステム開発に心がけたいですね。

2016年4月17日日曜日

全自動エスプレッソマシン デロンギ マグニフィカの除石灰作業やりました

熊本で発生した大地震で死傷者多数。
連日のニュースに心を痛めてます。
地震大国に生まれ育ったが故の宿命だと思ってはいるものの、人生の中で何度も遭遇してるとツライものがあります。

 1人でも多くの人が助かりますように。
 そして、お怪我をされた方々の1日も早い回復をお祈りいたします。
 亡くなられた方々のご冥福をお祈りするとともに、遺族の方々にお悔やみ申し上げます。
 ツライ現状から早く脱し復興されん事を心よりお祈り申し上げます。
毎朝の食事はカフェラテから
我が家には全自動エスプレッソマシン
デロンギ マグニフィカ ESAM1200SJ
があります。
ボタン1つでコーヒー豆が挽かれ、そしてエスプレッソコーヒーが淹れられるとても便利なコーヒーメーカーです。

最近はとんと見かけなくなり、現在は同等機能の色違いであるコチラのみを見かけます。


デロンギ マグニフィカ ESAM1000SJ

シルバーにしろブラックにしろ、この機種は最新機と比べ機能や見た目で劣ります。
しかし、エスプレッソコーヒーを淹れるという基本機能はシッカリしてますし、何よりも軒並み10万円を超えるなかで半額程度で購入可能。
家庭用の手動式エスプレッソマシンでもグラインダーと一緒に買おうとすると4万円程度はするため、差額1万円でレストランにあるような全自動エスプレッソマシンが手に入るのはとても魅力的です。
その日は突然訪れる
いつものように朝食を作りカフェラテを淹れてふと本体を見ると、普段は点灯していない赤ランプが点いていました。

このランプは除石灰時期をお知らせするモノ。
使う水の硬度を初期設定するのですが、それを元に使用頻度を見極めて適切な時期に知らせてくれます。

この除石灰作業、専用の除石灰剤というのがあって購入時に1回分付属してくるのですが、以前1度行っているため手元にありません。
今回は購入するところからです。
困った時のアマゾン頼み
この除石灰剤、その辺のお店で買えるモノではなくデロンギの全自動エスプレッソマシンの取り扱いがある店舗でも在庫があったりなかったり。
我が家から一番近いお店も電車を乗り継がなくてはなりません。
デロンギ商品取扱店で取り寄せる事も可能かとは思うのですが、メーカー在庫があれば1週間程度、無ければそれ以上かかります。
それならということで、今回はネット通販で購入する事にしました。



今回購入したのはお馴染みアマゾン。
送料無料が2000円以上からになると突然発表され利用に抵抗感が生まれて日が浅いのですが、背に腹は代えられないという事で購入に踏み切りました。

ポチッっとな♪
お馴染みの箱がやってくる
朝に注文したら到着予定が翌日とのお知らせ。
さすが、(色々な意味で)無いものは無いアマゾン。早いです。

この日、所用で午前中は外出。
午後も何時に帰宅出来るかわからなかったのでコンビニ受け取りで注文しました。
思ったより早く帰宅出来たものの、受け取りに必要な到着メールが来ずドリップコーヒー飲んでくつろぎながら注文履歴を見るとコンビニに到着のステータスになっていました。

メールで認証コードがわからないと受け取れない事をスッカリ失念していて、コンビニで四苦八苦したのですが何とか受け取れて帰還。

便利なのか不便なのか...
一難去ってまた一難
久方ぶりに見るデロンギ純正除石灰剤。
以前は単に除石灰剤と呼んでいたのですが、EcoDecalkという商品名が付いたようで国内流通品の100ml小分けパッケージもそういう名前でした。

今回注文した写真のモノは、日本国内で未発売の500mlボトルタイプ。
付属の日本語説明書には1回125ccを使うように指示されているため4回分の計算なのですが、国内流通品は1回1パック100ml。
ボトルのメモリも5回分記載されているため、それは合っているようです。


さっそく作業をしようと思った矢先にいきなりツマヅキました。

フタが開かない!?

一見すると普通のフタで回せば開きそうなのですが、いくら回しても空回り。
よくみると表面に「1.↓(押す)」「2.↺(回す)」とあります。
押し込んでも手応えが無く、回しても相変わらず空回り。

何コレ?


下に押しながら回してやったら開きました。
フタが2重構造になっていて、手に触れる外フタと本体側の内フタは普段は回らないようになっています。
それを下方向に押し込むことによって噛合い、押し込みながら回してあげれば開く仕組み。

子供が誤って開けて触れたり誤飲したりしないような配慮なのでしょうか?
良く出来てますね。
除石灰作業開始
年に1回やるかやらないかの低頻度な作業。やり方を覚えていません。

メーカーホームページに掲載されてる取扱説明書26ページを見ながら作業開始。
付属の説明書は持っているのですが、引っ張り出してくるのが面倒だったので。
インターネットって便利ですね♪


水タンクを取り出し、真水1Lに除石灰剤100mLを加え本体にセット。
廃液を受ける1.5L以上入るボウルを置き、そのままでは置けないのでかまぼこ板を数枚かさねて敷いてトレイを拡張します。
電源をボタンを押すと何時も通りの初期クリーニングが始まり廃液が少々出てきます。
準備が完了したら除石灰ランプのついたクリーニングボタンを5秒長押し。
スチームツマミをONまでしっかり回したら、あとは水タンクが空になって給水タンク注意ランプが点灯するまで放置です。
途中、止まってウンともスンとも言わなくなりますが、除石灰剤を内部になじませるための漬け置き時間かと思います。
ですから、本体を信じてそのまま放置しておきましょう。

説明書にある20分かからないぐらいで給水タンク注意ランプが点灯します。
そしたらスチームツマミをOFFまでキッチリ回して停止。
ボウルの廃液を捨て、水タンクを取り出し残った除石灰剤入りの真水を捨てて洗い、再び真水を満タンまで入れてセット。
廃液を再び受け止めるための空のボウルをセットしたら、再びスチームツマミをONまで回します。
排水が始まるので給水タンク注意ランプが点灯するまで出し続けます。
いつものエスプレッソマシンで一杯
除石灰作業を終えてエスプレッソコーヒーを淹れました。
普段はカフェラテを注ぐマグカップにダイレクトに落としているのですが、時々こうして計量カップを使って味と湯量をチェックします。
エスプレッソも目安としてシングルショット(1杯)30mL。
カップを見ると20mLほど湯量が多いので減らします。
コーヒーの濃さは湯量減らせば最適になりそうだったのでそのままに。
この後、コレを捨てるのはもったいないので、砂糖を加えて飲みました。

メンテナンス後のエスプレッソマシンは気持ちいいですね♪


2016年4月15日金曜日

第28回春日部大凧マラソン大会書類一式届きました

左足を痛めてもうすぐ1ヶ月。
筋トレと水泳でトレーニングは続けていますが、ランニングは残念ながらまだ出来ず。
大会の日も近くなり不安がよぎっております。

さて、そんな中ついに届きました!


第28回春日部大凧マラソン大会 書類一式

大会当日はこのゼッケンと計測用チップを身につけて会場に行って走るだけ。
とても便利です。

書類にざっと目を通した限り、前回大会から変わった事が2つありました。
まず1つ目。


写真撮影がSTK photo serviceに変わりました。

前回はPhoto Createが運営するALL SPORTS communityでした。
撮影された写真はどういう形(サイズや形状、DLの有無)で販売されるのか。また、おイクラなのかが書かれていないため良いのか悪いのかはわかりません。
気になるところです。

次に2つ目


有料の手荷物預かりサービスがはじまるそうです。
料金は500円。注意事項を読む限り、この500円というのは万が一紛失した場合の保険料かと思われます。
金銭・貴金属等の貴重品は預けられません。万が一預けて紛失しても保険の支払い対象にはなりませんのでご注意を。

ゼッケンが届いたので前回同様にコレ


ゼッケン留め BIBFIX

これ用に穴を広げる作業を後日したいと思います♪


今回が私の人生初となるハーフマラソン大会。
しっかり準備して気持よく走りたいですね。

2016年4月6日水曜日

Raspberry Piで思い出す🤔ネットワークは接続が保障されない技術

Raspberry Pi 2 Model Bが我が家にやってきてから、何かとLinux色が強くなってる今日このごろ。
そんな環境を使っていて忘れていた肝心な事を思い出しました。
今回はそんな話を書きたいと思います。
事の発端はWebDAV
Raspberry Piで使えるOSの1つであるRaspbianは、WebDAVがマウント出来るようになるdavfs2パッケージのインストールが可能です。
私は、これを使ってインターネット上のストレージサービスBOXをマウント。
これによってRaspberry PiをSDカード 64GBBOX 50GBという環境で使っています。
(現在BOXの個人向け無料プランは現在10GBとなっています。)

再起動をかける事がシバシバあるRaspberry Pi。
davfs2でWebDAVを手動マウントするとその度に解除されてしまうため、fstabの設定を使い起動時にマウントするようにしました。

しかし、それが誤ちだった事に気が付きました。
ブレーカーが落ちる事故
我が家のRaspberry Piの置き場所はダイニングキッチン。
生活をしていく上で必要とされる衣食住の食をツカサどる大切な生活空間です。
ここに置かれている理由は、この場所の温度湿度気圧を測定しているのが1つ。
もう1つは、電話回線を引き込むジャックがココにあるためネットワーク主要機器があり、安定した通信が得られる有線でかつ、コレが基本であるRaspberry Pi 2に都合が良かったからです。

現代のキッチン用品はとにかく電化製品が多いです。
  • 冷蔵庫
  • 電子レンジ
  • 食器洗い乾燥機
  • 電気ケトル
  • オーブントースター
  • コーヒーメーカー
  • エスプレッソマシン
これだけのモノが我が家のキッチンにはあります。
さらに、我が家のブレーカー事情は厄介で、脱衣所とキッチンの分岐ブレーカー(大元の主管ブレーカーとは別に付けられた小さいブレーカー)がセットで1つなのです。
この分岐ブレーカー、20Aという容量なため電化製品を幾つか動かすとすぐに落ちてしまいます。
ブレーカーが落ちてRaspberry Piがシャットダウンする事なく電源が切れます。
コレによって何度かOS Raspbianがカーネルパニックが起き、起動不能に陥った事がありました。
幸いな事にこのブログを書くキッカケとなった電源切れの時はカーネルパニックは起きなかったものの、忘れかけていた事を思い出させてくれました。
バックアップ失敗
システムチェックのため定期的に行っているバックアップを臨時で行いました。すると失敗。
原因は起動時にマウントされてるはずのWebDAVでした。
ブレーカーが落ちて停電後、ブレーカーを戻して電気が流れると再起動します。
本来ならfstabの設定でこの時にマウントされるはずなのですが、今回に限ってマウントされていません。

なぜ?
早すぎたRaspberry Pi
ダイニングキッチンのブレーカーが落ちるとRaspberry Piだけでなくネットワーク主要機器も落ちます。
ブレーカーを復帰させる事でこれらすべてが再起動するのですが、この時に真っ先に起動したのがRaspberry Pi。
その後にネットワーク主要機器が再起動しました。

インターネットに接続できない状態でRaspberry Piが起動してしまうと、マウントされるはずのBOXがマウント出来ません。
その結果、バックアップに失敗しました。
接続保障ないモノは起動時自動マウントしてはいけない
Linuxには様々なモノをストレージ化してマウントする事が出来ます。
今回紹介したWebDAV以外にも、WindowsでおなじみのSMBやFTPなども可能です。
ただ、今回のように起動時にネットワークが必ず接続出来るとは限りません。
インターネットと接続する機器の問題だけではなく、そこから先の経路で障害が起きていたり、大元のサーバーで障害が起きていたり。
そういう事態を考えると、起動時に自動マウントする設定は行わないほうが良いでしょう。
理想のマウント方法と使い方
3つの手順が必ず必要です。
  1. 使用したいストレージが既にマウントされていないか確認
  2. マウントされていない場合はマウントする
  3. マウント出来なかった場合を想定する
今回はネットワークを経由したストレージを題材に書きましたが、場合によってはUSBのようなホットプラグ対応デバイスも対象となります。
Raspberry Piの特殊事情
Raspberry Piは、ストレージが接続出来るI/Fが標準でSDカードスロットとUSBのみ。どちらもホットプラグ対応デバイスです。
SDカードスロットは、SoCの作りの関係で起動ドライブとして決め打ちされているためどうしようもありません。
また、USBも手軽に増設可能なI/Fがコレしかないため、ストレージメーカーもこれを前提としたRaspberry Pi向け製品をリリースしています。
Linuxは、これらストレージにUUIDを割り当てて機器を特定し、マウント時に固定化できる仕組みがあります。
これを使い今回のWebDAVのように起動時に自動マウントして固定ストレージとして使う事があります。
しかし、起動時にUSB接続機器のUUIDの認識が遅れてマウント出来ない不具合が出るケースがあり、やはりそういう使用を想定していないようです。
ネットワークは接続保障されない技術
ネットワークは接続保障がありません。
マウントしてOS標準実装された操作で使う事は、汎用性・利便性の面でとても有利です。
しかし、経路障害やサーバー故障、システムのアップデートや定期メンテ等、様々な事情で止まります。
接続性の高い機器同様に解説される事が多いですが、接続保障のないネットワークだという事を念頭にシステム開発したいものです。