ちぎっては投げるブログ

Programming, Android, RaspberryPi, Digital Devices, Kinkuma Hamster...

Jenkinsのジョブ内でexpectコマンドを呼ぶときの注意点

f:id:mczh:20161002224207p:plain

expectコマンドは、シェルの特定文字列の出力を待ち、任意文字を入力として与えることができる。

引数で渡すことのできないパスワード入力などに使われる。たとえばsshのパスワード入力の自動化とか。

expect -c "
set timeout 5
spawn ssh hoge@serverHost
expect \"password:\"
send \"PASSWORD\n\"
expect \"$\"
interact
"

このようにすると、sshがシェルスクリプト上で自動で実行できる。

expectコマンドは、一般に最後はinteractで終わらせる例が多く見つかるが、これはユーザの標準入力を受け付けるようにするコマンドである。 JenkinsJobやcrontabで実行した場合には画面がないため、interactがうまく実行できず、処理がおかしくなってしまう。 そのため、interactは使わないようにする。

ところで、このような処理が必要になる場合というのは、sshでリモートサーバのコマンドを自動実行するスクリプトであると考えられる。 その場合には、expectコマンドではなく、前記事で書いたように特定のコマンドのみ実行できる秘密鍵を登録してあげるほうが良い。

denpa-shinbun.com

Linuxシス管系女子を読んで初めて知ったシェル知識のメモ

先日買った、まんがでわかるLinuxシス管系女子を読み終わった。

意外と知らないことですぐに使えそうなものもあったのでメモしておく。

圧縮ファイルの中身をcatで表示する

zcatを使うと展開せずに表示できる

bashのコマンド履歴を複数のターミナルで共有する方法

.bashrcを編集すると、メモリー上のコマンド履歴を同期するように出来る。

function share_history {
    history -a
    history -c
    history -r
}
PROMPT_COMMAND='share_histor

コマンド置換の書き方

`コマンド`と、$(コマンド)があるが、前者は後方互換のため残っているもので、後者が推奨。

特定のコマンドのみ実行可能な秘密鍵の登録方法

.ssh/authorize_keysに秘密鍵を追記するときに、

command="コマンド" 秘密鍵

と書くと、その鍵では記述したコマンドのみ実行可能となる。 パスフレーズなしの秘密鍵を用いる場合には、このようにすることでうっかり秘密鍵が漏洩しても被害を減らせる。

dfの意味

空き容量を表示するコマンドだが、覚えにくいと思っていた。 Disk Freeの略、とマンガに書いてあったので今後は覚えられそう。

df -h

dfコマンドを人間が読みやすい形式にする。Human readableだからh。 ふだんはscriptで処理することを考慮しているため、人間にとって読みやすい形式にしていない。

caseでワイルドカードを使う

シェルのcase文は*が使える。 ブラケットも使えるが、正規表現は使えないので一文字のみ

漫画なのでさくっと読める。シェルは、「がっつり勉強しよう!」という感じではなくて、「その場で必要なら調べよう!」で身につけてきたので、抜けている知識がだいぶあると感じた。

自宅にポケモンが現れたら、実際に鳴き声を流したい #ポケモンGo

denpa-shinbun.com

の続き。

せっかくRaspberry Piを使っているので、サーバでは出来ないことをしたいと思い、ポケモンの鳴き声を出してみることにした。

これで、ポケモンが現れると鳴き声が現実世界に鳴り響くという、仮想と現実がよりいりまじった、良い感じの世界観を作ることが出来る。

用意するモノ

  • Raspberry Pi
  • スピーカー
  • 鳴き声の音源ファイル

ちなみに我が家のスピーカはUSB電源、音声アナログ入力のこれ

準備

  • Raspberry Piにスピーカーを繋ぐ。
  • 鳴き声の音源ファイルをRaspberryPi上に保存する
    • ファイル名は0埋めした3桁図鑑No.wavとし、フォルダ名はpokevoiceとする
  • sudo -u root aplay -D plughw:0,0 適当なwav のコマンドで再生できることを確認しておく
    • Botをrootじゃないユーザで実行するならsudoは不要
    • plughwの値は、aplay -lで確認する
    • 音量も調整しておく

PokemonGo-SlackBotの編集

pythonは触ったことがないが、雰囲気で・・・。

send_to_slack関数を呼ぶ直前で、aplayにて音を再生すれば良い。

具体的には、mainprocess_step関数 でsend_to_slack関数を呼んでいるif文があるので、そこを編集する。

diffはこんな感じ。

$ git diff
diff --git a/pokemon_pb2.pyc b/pokemon_pb2.pyc
index a20598a..1aa12c1 100644
Binary files a/pokemon_pb2.pyc and b/pokemon_pb2.pyc differ
diff --git a/pokeslack.py b/pokeslack.py
index 4c2f5e7..fdb361b 100755
--- a/pokeslack.py
+++ b/pokeslack.py
@@ -922,8 +922,10 @@ transform_from_wgs_to_gcj(Location(Fort.Latitude, Fort.Longitude))
             else:
                 user_icon = ':pokeball:'

-
-
+            print "pokemon = " + str(poke.pokemon.PokemonId)
+            from subprocess import check_call
+            cmd =  "aplay -D plughw:2,0 ./pokevoice/" + str(poke.pokemon.PokemonId).zfill(3) + ".wav"
+            check_call( cmd.split(" ") )
             send_to_slack(alert_text, pokename, user_icon, slack_webhook_urlpath)

             spotted_pokemon[poke.SpawnPointId] = {'disappear_datetime': disappear_datetime, 'pokename': pokename}
diff --git a/transform.pyc b/transform.pyc
index 2875abb..9a0e24f 100644

処理内容は見たまま単純で、図鑑Noを取ってきて0埋めしてファイルパスにし、aplayに渡しているだけである。

AR感が出てきてなかなか良い感じなので、かなりおすすめだ。さらに戦闘突入BGMを合わせるのもいいかもしれない。