min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

bash echo-sdコマンドで >突然の死< ジェネレーター を試す

ツイッターでよく見かける「囲み文字」を作るコマンドがあるらしい。

f:id:min117:20180623134132p:plain

 

 

 

>突然の死<ジェネレーター - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

f:id:min117:20180623135857p:plain

暇なのか天才なのかよく分からないけど、すごいものを作るもんだ。

さっそくインストールしてみる。

 

$ wget -nv https://raw.githubusercontent.com/fumiyas/home-commands/master/echo-sd

f:id:min117:20180623140120p:plain

 

$ sudo install -m 0755 echo-sd /usr/local//bin/echo-sd

f:id:min117:20180623135733p:plain

 

使い方は簡単。echo-sd のあとに言葉を指定するだけ。

$ echo-sd 突然の死

f:id:min117:20180623134132p:plain

 

$ echo-sd --stress hoge hoge セカント コセカント コタンジェント | sed 1,4d

f:id:min117:20180623140453p:plain

 

twitter

@minyoruminyon

をフォローすると延々と鑑賞できる。

f:id:min117:20180623135657p:plain

 

ちょっと cowsay コマンドに似てるかも。

min117.hatenablog.com

 

fortuneコマンドが人生の名言を言ってくれるので

$ fortune

f:id:min117:20180623141226p:plain

それを echo-sd にパイプしてみるが、標準入力は認識しないようだ(デフォルト文字列「突然の死」が出てしまう。

$ fortune | echo-sd

f:id:min117:20180623141331p:plain

引数として渡してみる。

 

$ echo-sd `fortune`

f:id:min117:20180623141414p:plain

縦になってしまった。短冊メーカーみたい。

 

ウシにも喋らせてみる。

$ echo-sd 突然の死 | cowsay

f:id:min117:20180623141525p:plain

 

 

vim テキスト全ての行の2列目以降だけを一括で消す(ホールドバッファ機能)

こんなテキストファイルがある

$ vim HoldBuffer_test.txt

f:id:min117:20180623100748p:plain

f:id:min117:20180623100652p:plain

 

青いところだけ残したい赤いところだけ消したい

コマンド一発でやりたい。

f:id:min117:20180623100630p:plain

 

 

 

vimホールドバッファ機能を使えばできる。

min117.hatenablog.com

 

残したいところをバッファにホールド(保持)しておき

消したいところについては s/編集前/後/g で削除する。

 

vimのコマンドモードで

%s/\(^.*mp4\).*/\1/g

 

大きく書くと

%s/\(^.*mp4\).*/\1/g

 

エスケープしたカッコ で囲まれた部分をバッファにホールド(保持)しておき、それをそのまま \1 で受ける。結果  ^.*mp4 の部分は残る

 

赤文字の .* は消える。 s/編集前//g の書式の「」が無いから。

 

これが

f:id:min117:20180623101405p:plain

 

こうなる

f:id:min117:20180623102313p:plain

 

%s/\(^.*mp4\).*/\1/g

^.*mp4 には正規表現が使えるから、あとはどうとでもなる。vim最高すぎる。

 

orebibou.com

 

 

 

RaspberryPi3 neofetch コマンドでOSロゴとシステム情報を表示する

neofetch という面白いコマンドを知った。RaspberryPi3 で実行するとこうなる。

$ neofetch

f:id:min117:20180622212947p:plain

OSのロゴとシステム情報を表示するようだ。DebianUbuntuもある。

orebibou.com

 

 

 

RaspberryPi のインストール方法は他とは異なる。このサイトの「All other versions」の手順になる。

github.com

 

この手順どおりインストールしていく。f:id:min117:20180622213905p:plain

 

$ echo "deb http://dl.bintray.com/dawidd6/neofetch stretch main" | sudo tee -a /etc/apt/sources.list

f:id:min117:20180622214243p:plain

 

$ curl "https://bintray.com/user/downloadSubjectPublicKey?username=bintray" | sudo apt-key add -

f:id:min117:20180622214247p:plain

 

$ sudo apt-get update

f:id:min117:20180622214251p:plain

 

$ sudo apt-get install neofetch

f:id:min117:20180622214224p:plain

 

めちゃカッコいい。

$ neofetch

f:id:min117:20180622212947p:plain

 

オプション指定で Ubuntu等 のロゴも出せる。

 

$ neofetch --ascii_distro ubuntu

f:id:min117:20180622214707p:plain

 

 

$ neofetch --ascii_distro Debian

f:id:min117:20180622214947p:plain

 

Redhat系も勿論ある。

$ neofetch --ascii_distro Redhat

f:id:min117:20180622220504p:plain

 

$ neofetch --ascii_distro fedoraf:id:min117:20180622220454p:plain

 

$ neofetch --ascii_distro CentOS

f:id:min117:20180622220459p:plain

 

しっかりAndroid系まで。

$ neofetch --ascii_distro Andoroid

f:id:min117:20180622220431p:plain

 

なぜにWindows。しかも再現性高い。

$ neofetch --ascii_distro windows

f:id:min117:20180622220437p:plain

 

slackware系もしっかり。

$ neofetch --ascii_distro SUSE

f:id:min117:20180622220116p:plain

 

$ neofetch --ascii_distro slackware

f:id:min117:20180622220255p:plain

 

組み込み系もこのとおり。

$ neofetch --ascii_distro Arch

f:id:min117:20180622220511p:plain

 

$ neofetch --ascii_distro freebsd

f:id:min117:20180622220351p:plain

 

$ neofetch --ascii_distro Gentoo

f:id:min117:20180622220326p:plain

 

なんと純国産まで。

$ neofetch --ascii_distro puppy

f:id:min117:20180622220138p:plain

 

$ neofetch --ascii_distro solaris

f:id:min117:20180622220157p:plain

 

$ neofetch --ascii_distro manjaro

f:id:min117:20180622220417p:plain

 

 

Linuxの派生図ぶん試してたら1年かかる。

https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg

$ man neofetch

f:id:min117:20180622214501p:plain

RaspberryPi3 テレビリモコンから omxplayer を操作する(mkfifo /tmp/cmd → omxp-with-cec.sh)

以前の記事で、omxplayer の操作(一時停止、再生)をbashコマンドからできることが分かった。FIFO経由でコマンドを流し込んでやれば動く。

min117.hatenablog.com

 

さらに前回記事では、RaspberryPi3を(HDMIで)繋いだテレビのリモコンで押したキー信号(上下左右、PAUSE等)を捕捉できることが分かった。

min117.hatenablog.com

 

これを組み合わせれば、テレビリモコンで押したキー信号(上下左右、PAUSE等)を捕捉しその内容に応じてomxplayerを操作できるようになる。

 

 

 

<流れ>

① あらかじめRaspberryPiで FIFOを作って動画(gakki.mp4)のinputとして待機させる

$ mkfifo /tmp/cmd &

$ omxplayer gakki.mp4 < /tmp/cmd &

f:id:min117:20180617102837p:plain

 

② リモコンを押すと

f:id:min117:20180616150535j:plain

 

③ RaspberryPi3 がその信号を捕捉する

$ cec-client | grep --line-buffered -Po '(?<=key pressed: )\w+(?= \(\d, \d\)$)'

f:id:min117:20180616151612p:plain

 

捕捉したボタン信号をFIFO経由でomxplayerに送り込む。例えば

「left」なら

f:id:min117:20180617101037p:plain

巻き戻しされる。

f:id:min117:20180617101351j:plain

「right」なら

f:id:min117:20180617101432p:plain

早送りになる。

f:id:min117:20180617101552j:plain

 

今回はこの④の部分を作る

このサイトにあるスクリプトomxp-with-cec.sh」が最高だったので、そのまま使わせてもらう。

takuya-1st.hatenablog.jp

 

$ vim omxp-with-cec.sh

f:id:min117:20180617102424p:plain

例えば

 30行目 KEYS_LEFT=$'\e'[D で固定された値 '\e'[D 

 41行目の関数onleft()における echo -ne $KEYS_LEFT > /tmp/cmd によって

FIFO(/tmp/cmd)に流し込まれている。

このFIFOから値 '\e'[D を受け取った omxplayerは、それを(キーボードからの打鍵と同じものと)解釈して、巻き戻しや早送りの動作をする(上記④)。

f:id:min117:20180617102654p:plain

94行目ではリモコンからの信号を捕捉し(上記③)

98行目で、信号に応じてomxplayerに '\e'[D を送り込む関数を呼んでいる

f:id:min117:20180617102702p:plain

 

一連の流れを通しで実行してみる。

$ rm /tmp/cmd

$ mkfifo /tmp/cmd

$ omxplayer gakki.mp4 < /tmp/cmd &

$ ./omxp-with-cec.sh

f:id:min117:20180617110625p:plain

リモコンで見事に操作できた。本当に素晴らしい。

f:id:min117:20180617104627j:plain

 

 

あとは①の手順(あらかじめFIFO作成して待機させる)が面倒くさいので、①から④までをコマンド一つでできるように alias に書いてしまう。 

 

$ vim ~/.bashrc

f:id:min117:20180617105037p:plain

(omxplayer gakki.mp4 < /tmp/cmd &) &  カッコ書きにしてバックグラウンド実行させているところがミソ。

cdPT3 や cdsh とあるのは、特定のフォルダにcdしてるだけの自作コマンド。

 

あらかじめタスクをkillしておかないと、複数あがって動きがおかしくなる。自作コマンド KILLALL もaliasしておく。

f:id:min117:20180617105043p:plain

 

コピペ用

alias myomxp="KILLALL && \

echo ' \

mkfifo /tmp/cmd' &&  \

echo 'cdPT3 && omxplayer gakki.mp4 < /tmp/cmd(FIFOから入力)& (bg再生)' && \

echo 'cdsh && ./omxp-with-cec.sh(リモコンからのcecを受け取ってFIFOに流す)' && \

echo 'リモコン押してみて' && \

mkfifo /tmp/cmd; cdPT3 && (omxplayer gakki.mp4 < /tmp/cmd &) & cdsh && (./omxp-with-cec.sh &) & echo -ne p > /tmp/cmd"

#mkfifo /tmp/cmd; cdPT3 && (omxplayer gakki.mp4 < /tmp/cmd &) & echo -ne p

> /tmp/cmd & cdsh && ./omxp-with-cec.sh &"

 

alias KILLALL=' \

 echo "KILLALLが呼ばれました" && \

 echo "KILL前プロセス" && \

 ps aux | grep -v grep | grep "omxplayer" && \

 ps aux | grep -v grep | grep "mplayer"   && \

 ps aux | grep -v grep | grep "cec"       ;  \

 for i in  $(ps aux | grep -v grep | grep omxplayer  | awk '\''{print $2}'\''); do echo "$i"; sudo kill -9 "$i"; done ; \

 for i in  $(ps aux | grep -v grep | grep mplayer    | awk '\''{print $2}'\''); do echo "$i"; sudo kill -9 "$i"; done ; \

 for i in  $(ps aux | grep -v grep | grep cec-client | awk '\''{print $2}'\''); do echo "$i"; sudo kill -9 "$i"; done ; \

 for i in  $(ps aux | grep -v grep | grep omxp-with-cec.sh | awk '\''{print $2}'\''); do echo "$i"; sudo kill -9 "$i"; done; \

 echo "KILL後プロセス" && \

 ps aux | grep -v grep | grep "omxplayer" && \

 ps aux | grep -v grep | grep "mplayer"   && \

 ps aux | grep -v grep | grep "cec"'

 

 

次回は FIFO に流す動画(上記①)を引数で取ってこれるように改造する。

RaspberryPi3 「テレビリモコンで押したキー信号」を捕捉する cec-client | grep --line-buffered -Po '(?<=key pressed: )\w+(?= \(\d, \d\)$)'

以前の記事で、cec-clientなるプログラムを使えばRaspberryPiからテレビを操作できることが分かった。

min117.hatenablog.com

 

今回も cec-client を使うが、やりたいのは(電源オンオフより)もっと複雑。

リモコンで押されたキーを捕捉したい。つまりこうなる。

f:id:min117:20180616151612p:plain

 

状況としては、まずテレビにRaspberryPiがHDMI繋がっていて

f:id:min117:20180616150258j:plain

そのテレビに向けてリモコンを押す

f:id:min117:20180616150535j:plain

テレビのリモコンの信号HDMIケーブル経由でRaspberryPiに送られるので、RaspberryPi側ではその信号を cec-client で受け取る

f:id:min117:20180616145849p:plain

受け取った信号の内容は上のようにズラズラと出てくる。

赤枠の部分がリモコンで押されたキーを意味する行になる。

さらにその中の青枠の部分が押されたリモコンの矢印方向を意味するので、ここだけを取り出せれば、リモコンでどの方向のキーが押されたかを把握することができる。

 

 

この記事にやり方がバッチリ載っていた。

takuya-1st.hatenablog.jp

 

cec-client の出力を grep して必要な部分に絞り込んでいけばよい。

$ cec-client | grep 'key pressed'

f:id:min117:20180616153720p:plain

key pressed: (3, 0) に囲まれた left が取り出せればよい。

 

$ cec-client | grep --line-buffered -Po '(?<=key pressed: )\w+(?= \(\d, \d\)$)'

f:id:min117:20180616152327p:plain

 

 

grep -Poオプション の意味はこれ。

 -P Perl正規表現を使う

 -o マッチした行のうち、必要な列(フィールド)のみ取り出す

min117.hatenablog.com

 

-Po '(?<=key pressed: )\w+(?= \(\d, \d\)$)'

とすれば \w+ でキャプチャされた文字列を捕捉することができる。

 

--line-buffered は1行単位で出力させるオプション。

qiita.com

 

これでテレビのリモコンからの信号を RaspberryPi が解釈できるようになった。これを omxplayer に送れば「一時停止」「巻き戻し再生」「早送り再生」ができるようになる。

次記事に続く。

 

bash grepの-oP(または-Po)オプションとは? → 正規表現にマッチした列のみ抜き出す

素晴らしい記事を発見。grep には -oPというオプションがあるらしい(-Poでも同じ)。

 

-o

マッチした列のみ切り出す(grep | awk 正規表現 と同じ)

 

-P

Perl正規表現を使って抜き出す

 

とくに -P(ハイフンP)オプションについては情報がなくて探すのに苦労した。

greymd.hatenablog.com

f:id:min117:20180615072351p:plain

f:id:min117:20180615072400p:plain

f:id:min117:20180615072504p:plain


 

 

これを応用すれば RaspberryPi でテレビリモコンの信号を解釈できるようになる。

min117.hatenablog.com

 

他にも素晴らしい記事が。

takuya-1st.hatenablog.jp

takuya-1st.hatenablog.jp

 

awk正規表現

The GNU Awk User's Guide - 正規表現

codezine.jp

 

 

参考)

min117.hatenablog.com

bash grepの前にバックスラッシュをつけて「\grep」と書く意味は?

例えば

 INSTALLED=$(dpkg -l \grep $1)

のようにして変数INSTALLEDを設定する場合なぜgrepの前にバックスラッシュがあるのか?

 

答え)

\grep

/bin/grep または /usr/bin/grep にある システムにデフォルトのgrepを使うという意味。つまり、すべてのalias設定を無視して素のgrepを使う場合にバックスラッシュをつける。

 

参考)

takuya-1st.hatenablog.jp

stackoverflow.com

 

\grep means execute system default grep from /bin/grep OR /usr/bin/grep ignoring all local environment aliases you may have set up for grep.

 

勉強になる。

f:id:min117:20180614231503p:plain

 

 

 

同様に \cp  \mv とすれば、alias の設定を無視して素の cp や mv を使えるようだ。

 

関連)

min117.hatenablog.com