1. Qiita
  2. 投稿
  3. シェル芸

【あそぼうよ】様々なコマンド達を何も考えずにつないで遊ぶ vol.2

  • 12
    いいね
  • 0
    コメント
に投稿

きっかけ

昨年は好評いただいたので、またやります。

【たのしいな】様々なコマンド達を何も考えずにつないで遊ぶ

Screen Shot 2016-09-01 at 6.03.28 PM.png

この記事は一体何なのか?

いろんな種類のコマンドを、シェルの機能で適当につなげてシェル芸1をする。すると、なんとたのしい。

実行環境

Mac OSX Yosemite 10.10.5の端末上で実施。
zshを使って動作確認してますが、多分bashでも動きます。

Terminal
$ zsh --version
zsh 5.0.6 (x86_64-apple-darwin13.3.0)

どんなコマンドを使うのか?

$ snacknomama

スナックのママの名前や店名2、波乱万丈の人生を要約したものをランダムに出力するコマンド。

インストール方法
$ gem install snacknomama
実行例
$ snacknomama
店名: スナック 奈々洋子
ママ: シエ
人生: 両親離婚->高等学校退学->結婚出産->旦那浮気->離婚バツ3

# 店名のみを表示
$ snacknomama -s
スナック ビートル・ブローズ

$ emspect

絵文字に関する詳細情報3を表示、検索できるコマンド。

インストール方法
$ npm install -g emspect
実行例
## "apple"に関連のある絵文字を表示
$ emspect apple
🍎 RED APPLE (U+1F34E) - apple, fruit, plant, red :apple:
🍏 GREEN APPLE (U+1F34F) - apple, fruit, green, plant :green_apple:

$ matsuya

松屋のメニュー名を動的自動生成できるコマンド。前回もお世話になりました。

インストール方法
$ gem install matsuya
実行例
$ matsuya
オリジナルテキ定食

$ matsuya
旨辛ネギたま牛豆腐旨辛ネギたま牛焼肉定食

$ faker-cli

ランダムに色々(数字、人名、適当な画像などなど色々)生成してくれる。前回もお世話になりました。

インストール方法
$ npm install -g faker-cli
実行例
## 日本人の苗字
$ faker-cli -L ja -n lastName
"田中"

## 適当な人物の画像のURL
$ faker-cli -I avatar
"https://s3.amazonaws.com/uifaces/faces/twitter/grethlen/128.jpg"

$ marky_markov

分かち書きした文章を入力すると、単語同士のネットワーク(マルコフ連鎖)を作成し、マルコフ連鎖モンテカルロ法により、よしなに文章を生成してくれる。

インストール方法
$ gem install marky_markov
使い方
# 学習させる
$ marky_markov read <(echo "A の 意味 は B です。 B の 意味 は C です。")

# 一文適当に生成
$ marky_markov speak -c 1
A の 意味 は C です。.

# 学習データを忘れる
$ marky_markov --reset

$ rubipara

プリパラというアニメの情報を表示する。

インストール方法
$ gem install rubipara
実行例
# キャラクターを一覧で表示させるぷり
$ rubipara character
#=> lala    : 真中らぁら
#=> mirei   : 南みれぃ
#=> sophie  : 北条そふぃ
#=> shion   : 東堂シオン
#=> dorothy : ドロシー・ウェスト
#=> leona   : レオナ・ウェスト

# アニメのエピソードを表示させるぷり
$ rubipara episode 1
#=> 第1話 アイドル始めちゃいました!

$ cure

端末上であらゆるプリキュア関連の情報の表示、加工、抽出ができる。Cureutils(きゅあゆーてぃるず)というRuby製のツール。Qiitaに作者の記事あり。

インストール方法
$ gem install cureutils
実行例
# プリキュア一覧を表示
$ cure precures
キュアブラック
キュアホワイト
シャイニールミナス
キュアブルーム
# (中略)

# 存在するプリキュアの名前のみをgrep
$ echo "キュアエース\nキュアスペード\nキュアハート\nキュアダイヤ" | cure grep
キュアエース
キュアハート

$ jo

コマンドラインから簡単にJSON形式のテキストを作成できるコマンド。

インストール方法
brew install jo
実行例
$ jo number=443 string=hello
{"number":443,"string":"hello"}

$ unsplash

unsplashという写真素材サイトから無難な風景写真を習得できる。(注:サービスがちょくちょく不安定で、たまに画像が取得できないです。)

インストール方法
$ npm install -g unsplash-cli
実行例
# コマンドを実行すると、なんか良さ気な画像のURLが出現する。
$ unsplash link -r

The following link has been successfully copied to clipboard:

         https://unsplash.it/300/200?image=777
画像例

200.jpg

$ rhymer

与えられた文章の中から韻を踏んでいるラップっぽいフレーズの組み合わせを見つけ出す[^rhymer_author]。Qiitaに記事あり。

インストール方法
$ git clone https://github.com/suzuki86/rhymer.git
$ cd rhymer
$ bundle install
$ gem build rhymer.gemspec
$ gem install rhymer-x.x.x.gem
実行例
$ rhymer spit "「今日は勉強をする」と言ったら、多くの反響があった。"
今日は勉強 多くの反響

$ echo-sd

突然の死を起こす。引数の文字列を尖った吹き出しで囲んで表示する。吹き出し以外にも色々オプションが充実している。前回もお世話になりました。

インストール方法
$ wget -nv https://raw.githubusercontent.com/fumiyas/home-commands/master/echo-sd
$ sudo install -m 0755 echo-sd /usr/local/bin/echo-sd
$ rm echo-sd
実行例
$ echo-sd
_人人人人人人_
> 突然の死 <
 ̄Y^Y^Y^Y^Y^Y^ ̄

## -sオプションで標準入力を吹き出しで囲む
$ echo "こんにちは" | echo-sd -s
_人人人人人人人_
> こんにちは <
 ̄Y^Y^Y^Y^Y^Y^Y^ ̄

## --stressオプションで仕事のストレスの状態遷移図を表示
$ echo-sd --stress AAAAA BBBBB CCCCC DDDDD
AAAAA
    ↘
   BBBBB
    ↙
CCCCC
    ↘
   DDDDD
    ↙
_人人人人人人人人人_
> 仕事のストレス <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄

$ cowsay

メッセージをつぶやくウシのアスキーアートを生成する。標準入力が吹き出しに入り、牛がしゃべる感じになる。オプションを変えると牛以外も色々できる。前回もお世話になりました。

インストール方法
$ brew install cowsay
実行例
$ echo 'Typical cowsay output!' | cowsay
 ________________________
< Typical cowsay output! >
 ------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

$ pen

Markdown形式のファイルを指定すると、ブラウザが開き、ファイルの変更に応じてリアルタイムにそのMarkdownのプレビューを表示してくれる。

インストール方法
$ npm install -g @noraesae/pen
実行例
$ pen README.md
listening 6060 ...

# ここで、localhost:6060を開くと、README.mdが綺麗に表示されたものが表示されている。

比較的一般的なコマンド

$ convert

画像処理関連のコマンド集であるImageMagicに含まれるコマンド。画像ファイルの保存形式を変換したりあらゆる編集をしたりできる。

インストール方法
$ brew install imagemagick
実行例
# JPGをPNGに変換。
$ convert A.jpg A.png

$ mecab

オープンソースの形態素解析ソフト「MeCab」のコマンド。標準入力から与えられた文章を分かち書きし、品詞や読みなどの情報を出してくれる。前回もお世話になりました。

インストール方法
$ brew install mecab mecab-ipadic
実行例
## 標準入力を形態素解析する
$ echo "秋田は飽きた。" | mecab
秋田    名詞,固有名詞,地域,一般,*,*,秋田,アキタ,アキタ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
飽き    動詞,自立,*,*,一段,連用形,飽きる,アキ,アキ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。
EOS

$ w3m

端末上で動くウェブブラウザ。特定のコマンドラインオプションを加えると、簡単なWebスクレイピングツールとなる。

インストール方法
$ brew install w3m
実行例
# Googleを端末で開く
$ w3m google.com

# 開いた結果をそのまま標準出力に出す
$ w3m -dump google.com
検索画像マップ Play YouTube ニュース Gmail ドライブもっと見る >>
ウェブ履歴 | 設定 | ログイン

日本

            [                                                         ] 検索オプショ
                                                                        ン言語ツール
                         [Google 検索][I'm Feeling Lucky]
# (中略)

$ curl

任意のHTTPリクエストを投げるコマンド。すでに入っている人も多いかもしれない。ない人は以下の方法でインストール 。

インストール方法
$ brew install curl
example.com に対してRequest送る。
実行例
$ curl example.com
<!doctype html>
<html>
<head>
    <title>Example Domain</title>
# (中略)

$ nc

主にTCP/UDP通信の送受信ができるコマンド。すでに入っている人も多いかもしれない。ない人は以下の方法でインストール 。

インストール方法
$ brew install netcat
簡単なHTTP通信のリクエスト、レスポンスをする。
実行例(端末1)
## 8080番ポートでTCP通信を受信待機する
$ nc -l 8080 <<<"HTTP/1.0 200 Ok"
実行例(端末2)
## 実行後、端末1側にリクエスト情報が表示される。
$ curl -v localhost:8080 -d 'test'

coreutils

shufmd5sumなどのLinuxに入っているGNUの標準コマンドを、OSXで利用するためcoreutils(こあゆーてぃるず)と呼ばれるツールを利用する。gshuf, gmd5sumのように先頭にgのついた形で使える。

インストール方法
$ brew install coreutils
実行例
## shufコマンド
$ seq 10 | gshuf
3
8
4
7
2
6
5
1
9
10

OSX 依存のコマンド

$ open

OSXに標準で入っているコマンド。何でも開く万能コマンド。ディレクトリを指定するとFinder、画像をopenすると画像ビューワーなど、拡張子に対応した閲覧ソフトを開いてくれる。また、URLを渡すとブラウザを開く。

実行例
## カレントディレクトリをFinderで開く
$ open .

## URLをブラウザで開く
$ open http://example.com

$ say

OSXに標準で入っているコマンド。引数に文字列を与えると、その文字列を音声に変換してスピーカーから出力するコマンド。

実行例
## 流ちょうな声で"Hello World"という声をスピーカーから出す。
$ say "Hello World"

## -v Kyoko というオプションをつければ女性の声で日本語も発音できる。
$ say -v Kyoko "こんにちは"

その他のコマンド

echowhile などのシェルのループ文、sed, awk, perlなどの実行環境でビルドインになっているコマンドの力も適宜借ります。

--- 以下、悲惨な結果の数々 ---

牛の絵文字を表示

Terminal
$ emspect :ox: -f '%C'
🐂

リアルな牛を思うアスキーアート牛

Terminal
$ emspect :ox: -f '%C' | cowsay
 ______
< 🐂 >
 ------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

絵文字をハッシュにする

Terminal
# 牛
$ emspect :ox: -f '%C'
🐂

# ハッシュ化した牛(ハッシュドビーフ)
$ emspect :ox: -f '%C' | gmd5sum
6f684ae9177aac2ab092f1713a7af590  -

# 芋
$ emspect :sweet_potato: -f '%C'
🍠

# ハッシュ化した芋(ハッシュドポry)
$ emspect :sweet_potato: -f '%C' | gmd5sum
b721d4258a46e85d64807a3c407d01ac  -

とりあえず全ての絵文字の情報を表示してみる

Terminal
$ emspect
😀 GRINNING FACE (U+1F600) - face, grin :grinning:
😁 GRINNING FACE WITH SMILING EYES (U+1F601) - eye, face, grin, smile :grin:
😂 FACE WITH TEARS OF JOY (U+1F602) - face, joy, laugh, tear :joy:
🤣 ROLLING ON THE FLOOR LAUGHING (U+1F923) - face, floor, laugh, lol, rofl, rolling
😃 SMILING FACE WITH OPEN MOUTH (U+1F603) - face, mouth, open, smile :smiley:
😄 SMILING FACE WITH OPEN MOUTH AND SMILING EYES (U+1F604) - eye, face, mouth, open, smile :smile:
# (中略)
グレープをグレップ
Terminal
$ emspect | grep grape
🍇 GRAPES (U+1F347) - fruit, grape, plant :grapes:

スナックのママの情報が味気ないので、ランダムにお花でデコレーション

Terminal
# Before
$ snacknomama
店名: スナック ジャ花バージン
ママ: スミエ
人生: 両親富豪->高等学校卒業->結婚出産->旦那借金->離婚バツ3

# After!
$ snacknomama | sed 's/^/'$(emspect flower -f "%C" | gshuf | head -n 1)' /'
🌺 店名: スナック タンポポ舞ナイトパブ・ギャラン
🌺 ママ: ハナハ
🌺 人生: 両親死別->中学校中退->結婚出産->旦那借金->離婚バツ1

キティちゃんもつけて更にかわいく、スナックの看板っぽい何かを作る

Terminal
$ snacknomama | head -n 2 | sed 's/^/'$(emspect flower -f "%C" | gshuf | head -n 1)' /' | xargs | cowsay -f hellokitty
 ______________________________________
/ 🌹 店名: スナック            \
| ゅっせるジージックスバー |
\ 🌹 ママ: ミカ                  /
 --------------------------------------
  \
   \
      /\_)o<
     |      \
     | O . O|
      \_____/

しかし何の可愛げもないJSONにされるスナックのママの人生

Terminal
$ snacknomama | sed 's/: /=/g;s/ /\\ /g' | xargs jo -p
{
   "店名": "スナック キャッスル子",
   "ママ": "ウナ",
   "人生": "両親死別->高等学校中退->結婚出産->旦那借金->離婚バツ1"
}

スナックのママの人生を返すAPIを作る

Terminal1
$ while :; do snacknomama | \
sed 's/: /=/g;s/ /\\ /g' | \
xargs jo -p | \
sed '1iHTTP/1.0 200 Ok\n' | \
nc -l 8080;done
Terminal2
# curlで何回でも叩ける
$ curl localhost:8080
{
   "店名": "スナック あき愛ステップ",
   "ママ": "ジュンナ",
   "人生": "両親富豪->中学校中退->結婚出産->旦那借金->離婚バツ4"
}

# 叩くごとに結果が異なる
$ curl localhost:8080
{
   "店名": "スナック むつ",
   "ママ": "アユ",
   "人生": "両親離婚->中学校中退->結婚出産->旦那暴力->離婚バツ2"
}

2つターミナルを開いてお試しください4

落ち着かないスナックのママの人生に強引にオチを

Terminal
$ snacknomama -z | sed 's/->/ /g' | xargs echo-sd --stress
両親死別
    ↘
   中学校中退
    ↙
結婚出産
    ↘
   旦那酒
    ↙
_人人人人人人_
> 離婚バツ3 <
 ̄Y^Y^Y^Y^Y^Y^ ̄

見ざる聞かざる言わざる

terminal
$  emspect monkey -f '%c' | head -n 3
🙈
🙉
🙊

Kyoko「ミザル、キカザル、イワザル」

実は say コマンドに絵文字を渡すと、その絵文字の説明をしてくれます。

terminal
$  emspect monkey -f '%c' | head -n 3 | say -v Kyoko

「見ざる聞かざる言わざる」を止めた猿に襲いかかる残酷な現実

Terminal
$ emspect monkey -f '%C' | head -n 4 | xargs echo-sd --stress
🙈
    ↘
   🙉
    ↙
🙊
    ↘
   🐵
    ↙
_人人人人人人人人人_
> 仕事のストレス <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄

スマイルを表示

Terminal
$ emspect smile -f '%C' | head -n 1
😁

わ た し で す 5

Terminal
$ emspect smile -f '%C' | head -n 1 | echo-sd -s | echo-sd -sf"わ た し で す"
_人人人人人人人_
> _人人人_ <
> > 😁 < <
>  ̄Y^Y^Y^ ̄ <
 ̄Y^Y^Y^Y^Y^Y^Y^ ̄
わ た し で す

いろいろごった煮にする(1回目)

Terminal
$ emspect -f '%C' | gshuf | head -n 1 | \
echo-sd -s | echo-sd -sf"$(matsuya | grep -o . | xargs)" | \
sed "1iこの殺伐とした記事に$(faker-cli -L ja -n lastName)が!"

この殺伐とした記事に"高橋"が!
_人人人人人人人_
> _人人人_ <
> > 👖 < <
>  ̄Y^Y^Y^ ̄ <
 ̄Y^Y^Y^Y^Y^Y^Y^ ̄
牛 め し

ランダムに色んな顔を表示してみる

Terminal
$ emspect -c "U+1F61" -f "%C" | gshuf | head -n 1
😓

$ emspect -c "U+1F61" -f "%C" | gshuf | head -n 1
😛

$ emspect -c "U+1F61" -f "%C" | gshuf | head -n 1
😓

表情豊かな人に訪れる残酷な現実

Terminal
$ emspect -c "U+1F61" -f "%C" | gshuf | head -n 4 | xargs echo-sd --stress

😐
    ↘
   😙
    ↙
😘
    ↘
   😜
    ↙
_人人人人人人人人人_
> 仕事のストレス <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄

パワフルプロ野球にありそうなチーム表 6 っぽい何かを作る

Terminal
$ yes 'echo $(faker-cli -L ja -n lastName | xargs)":"$(emspect -c "U+1F61" -f "%C" | gshuf | head -n 1)' | \
head -n 50 | sh | xargs -n 3 | tr ' ' '\t'
渡辺:😘  田中:😗  小林:😒
斎藤:😐  木村:😑  山田:😛
田中:😞  林:😜    斎藤:😗
佐藤:😔  高橋:😖  木村:😛
木村:😕  佐藤:😛  井上:😘
# (中略)

音楽ゲームにありそうな譜面7を出力する

Terminal
for i in {1..100}; do emspect -a arrow -a cardinal -f "%C" | gshuf | head -n 2 | sed '$,${s/$/ ■ ■ ■ ■/}' | xargs -n 1 | gshuf | head -n 4 | xargs && sleep 0.5; done
■ ⬇ ■ ■
■ ⬇ ■ ■
■ ■ ⬆ ■
■ ⬇ ➡ ■
⬇ ■ ➡ ■
■ ■ ⬅ ➡
# (中略)

車が走る

アニメーションで右から左に移動します。

Terminal
$ seq 50 1 | \
perl -anlE 'printf "_" x $_."'$(emspect car -f "%C" | gshuf| head -n 1)" "$(emspect -f "%C" :dash:)'"; print "_" x $.' | \
while read s; do sleep 0.1 && echo -n "\r"$s ;done
______________________________________🚓 💨_____________

こんな感じ

car_emspect.gif

おこめ + さかな = すし

Terminal
$ echo "$(emspect :rice: -f '%C') + $(emspect :fish: -f '%C') = $(emspect :sushi: -f '%C')"
🍚 + 🐟 = 🍣

お米と魚の衝突実験

Terminal
$ seq 20 10 | \
perl -anlE 'say "." x ($.)."'$(emspect :rice: -f "%C")'".("." x ($_-$.))."'$(emspect :fish: -f "%C")'".("." x $.);' | \
while read s; do sleep 0.1 && echo -n "\r"$s | \
sed -r 's/[^\.]{2}/'$(emspect :sushi: -f "%C")'/' ;done

sushi_emspect.gif

キュアソード(プリキュアの一人)の変身の口上を表示

Terminal
$ cure echo -qp cure_sword
プリキュアラブリンク!
L! O! V! E!
勇気の刃! キュアソード!
響け愛の鼓動!ドキドキプリキュア!
このキュアソードが愛の剣で
あなたの野望を断ち切ってみせる!

キュアソードの変身の口上の中で、ラップになっている箇所を抽出

Terminal
$ rhymer spit "$(cure echo -qp cure_sword)"
プリキュアラブリンクL!O!V!E!勇気の刃キュアソード響け愛の鼓動 愛の鼓動ドキドキプリキュアこのキュアソードが愛の剣であなたの野望

キュアソード響け愛の鼓動(コドォウ)
愛の剣であなたの野望(ヤボォウ)

プリキュアの変身の口上の中に出てくる品詞が「名詞」の単語をランダムに松屋のメニューと入れ替える

通常のキュアフローラ
Terminal
$ cure echo -qa -p cure_flora
プリキュア!プリンセスエンゲージ!
咲き誇る花のプリンセス!キュアフローラ!
強く、やさしく、美しく!
Go!プリンセスプリキュア!
冷たい檻に閉ざされた夢、返していただきますわ!
お覚悟はよろしくて?
エクスチェンジ!モードエレガント!
舞え、花よ!プリキュア・フローラル・トルビヨン!
(ドリーミング)
ごきげんよう
松屋版キュアフローラ (適宜結果に改行を入れてます)
Terminal
$ cure echo -qa -p cure_flora | mecab -E '' | \
while read line;do (printf "$line "; matsuya) | \
awk 'BEGIN{srand()} {printf $0" ";if($2~/^名詞/){i=int(rand()*10)%2}else{i=0} print i}' | \
awk '$NF{print $(NF-1)} !$NF{print}';done | \
awk '{printf $1}' | awk 1
プリキュア!オリジナルカレーネギ塩豚バラ生姜焼定食!
咲き誇るブラウンソースハンバーグ定食のオリジナルカレギュウ(プレミアム牛肉使用)!キュアフローラ!
強く、やさしく、美しく!
Go!プリンセスプリキュア!
冷たい檻に閉ざされた夢、返していただきますわ!おプレミアム牛めしはよろしくて?
オリジナルカレー!プレミアム旨辛ネギ塩豚カルビ丼!
舞え、スタミナ旨辛ネギたっぷりネギたま牛焼肉定食よ!ビビン丼!
(ドリーミング)
ごきげんよう
通常版キュアマジカル
Terminal
$ cure echo -qa -p cure_magical
キュアップ・ラパパ! ダイヤ!
ミラクル・マジカル・ジュエリーレ!
ふたりの魔法!キュアマジカル!
魔法つかいプリキュア!!
リンクルステッキ!
ダイヤ!永遠の輝きを私達の手に!
フルフルリンクル!
プリキュア・ダイヤモンド・エターナル!
松屋版キュアマジカル
Terminal
$ cure echo -qa -p cure_magical | mecab -E '' | while read line;do (printf "$line "; matsuya) | awk 'BEGIN{srand()} {printf $0" ";if($2~/^名詞/){i=int(rand()*10)%2}else{i=0} print i}' | awk '$NF{print $(NF-1)} !$NF{print}';done | awk '{printf $1}' | awk 1
キュアップ・ラパパ! 鶏のチリソースハンバーグ定食!
牛めし!
オリジナルカレギュウの魔法!キュアマジカル!
魔法つかいプリキュア!!
プレミアム旨辛ネギたっぷりネギ塩ポン酢牛めし!
プレミアム旨辛ネギ塩豚カルビ焼たま牛焼肉定食!
プレミアムキムチ牛めしの(プレミアム牛肉使用)を私達の手に!
フルフルリンクル!
プリキュア・ダイヤモンド・エターナル!

プリキュア45人全員の変身の口上の中からラップっぽい箇所をすべて列挙

Terminal
$ cure precures | cure tr '[:precure_name:]' '[:girl_name:]' | while read girl;do  rhymer spit "$(cure echo -qp $girl)" ;done
金の花キュアブルームふたりはプリキュア聖なる泉 金の花キュアブルームふたりはプリキュア聖なる泉を汚す者よ阿漕
デュアル・スピリチュアル・パワー花開け大地 金の花キュアブルームふたりはプリキュア聖なる泉を汚す者よ阿漕
デュアル・スピリチュアル・パワー花開け大地 金の花キュアブルームふたりはプリキュア聖なる泉
銀の翼キュアイーグレットふたりはプリキュア聖なる泉 銀の翼キュアイーグレットふたりはプリキュア聖なる泉を汚す者よ阿漕
プリキュアメタモルフォーゼ知性 キュアアクア希望の力と未来の光華麗
(レディ?)プリキュア・スマイルチャージ(ゴーゴーレッツ (レディ?)プリキュア・スマイルチャージ(ゴーゴーレッツゴーピース
(レディ?)プリキュア・スマイルチャージ(ゴーゴーレッツゴーマーチ (レディ?)プリキュア・スマイルチャージ(ゴーゴーレッツゴーマーチ!!)勇気
このキュアダイヤモンドがあなた このキュアダイヤモンドがあなたの頭
プリキュアラブリンクL!O!V!E!勇気の刃キュアソード響け愛の鼓動 愛の鼓動ドキドキプリキュアこのキュアソードが愛の剣であなたの野望
ルンルン!)プリキュアくるミラーチェンジ大地 ミラーチェンジ大地に実る命

泉(イズミィ)、阿漕(アコギィ)……
チェンジ大地(ダイチィ)、ミノル命(イノチィ)……

青空文庫から走れメロスの本文を取得して分析する

※ お手元で試す時は、連続で叩きすぎないようにして下さい。

Terminal
$ w3m -dump -cols 999 http://www.aozora.gr.jp/cards/000035/files/1567_14913.html | \
awk NF | sed -n '3,/^━*$/p;' | sed '$d'
 メロスは激怒した。必ず、かの邪智暴虐(じゃちぼうぎゃく)の王を除かなければならぬと決意した。メロスには政治がわからぬ。メロスは、村の牧人である。笛を吹き、羊と遊んで暮して来た。けれども邪悪に対しては、
# (中略)
品詞ごとに、空白で分割(分かち書き)にする
Terminal
$ w3m -dump -cols 999 http://www.aozora.gr.jp/cards/000035/files/1567_14913.html | \
awk NF | sed -n '3,/^━*$/p' | sed '$d' | mecab -Owakati | awk NF
  メロス は 激怒 し た 。 必ず 、 かの 邪智 暴虐 ( じ ゃちぼうぎゃく ) の 王 を 除か
# (中略)

空白で分かち書きされた文章を学習し、走れメロスの文章を再構築する

Terminal
# 走れメロス本文から、単語同士のネットワークを作る(学習)。
$ marky_markov read \
<(w3m -dump -cols 999 http://www.aozora.gr.jp/cards/000035/files/1567_14913.html | \
awk NF | sed -n '3,/^━*$/p' | sed '$d' | mecab -Owakati | awk NF)

# そのネットワークを使って、適当に一文つくってみる(生成)。
$ marky_markov speak -c 1 | tr -d ' '
メロスが帰って来た。と大声で刑場の群衆にむかって叫んだ。生かして置けぬ。メロスは悪びれずに答えた。呼吸

# 生成結果は毎回異なる。
$ marky_markov speak -c 1 | tr -d ' '
高々と立てられ、縄を打たれたのか、ついに、がくりと膝を折った。義務遂行の希望である。メロスはそれ

「メロスはそれ」

支離滅裂な文章で有名な小説である「ドグラ・マグラ」8を学習する

Terminal
# 学習
$ marky_markov --reset && \
marky_markov read <(w3m -dump -cols 999 http://www.aozora.gr.jp/cards/000096/files/2093_28841.html | \
awk NF | sed -n '4,/^━*$/p' | sed '$d' | \
mecab -Owakati | awk NF)

# 生成
$ marky_markov speak -c 1 | tr -d ' '
時間の割合が、何だか、そんな大きな事実に照し合せてしまいまして、唇の色に、みんな眼をこすった。……不思議

元々が支離滅裂な文なので、違和感がない。

ドグラ・マグラの文章から適当に文章を生成しまくり、ラップを自動生成する。

Terminal
# 50回くらいやると1個くらいでてきます。
$ yes "marky_markov speak -c 1 | tr -d ' ' | xargs rhymer spit" | head -n 50 | sh
三重の恋を敵本主義の世の中 生やさしい御方
まりが遅うなっております奥のドン底 まりが遅うなっております奥のドン底のドンドコ
そうした得意時代 のを待っていないとドウモ具合

献本主義のヨノナカァ、生易しいオカタァ

プリキュア45人分の変身と攻撃の口上から適当に文章を生成する

口上を学習
Terminal
# プリキュア45人分の口上を学習(少し時間かかります)
$ marky_markov --reset && \
cure precures -m | cure tr '[:precure_name:]' '[:girl_name:]' | \
while read name;do printf "$name "; \
marky_markov read <(cure echo -qap $name | xargs | mecab -Owakati) ; done
口上を生成
Terminal
$ marky_markov speak -c 1 | tr -d ' '
さん、このキュアダイヤモンドがあなたのハートは祈りのしるし!とれたてフレッシュ、キュアパイン!レッツプリキュア!悪いの悪いの飛んでいけ!プリキュア!プリンセス

$ marky_markov speak -c 1 | tr -d ' '
守るために心をひとつに!光の意志よ!阿漕な真似はお止めなさい!エクスチェンジ!モードエレガント!高鳴れ、海よ!プリキュア・フローラル・トルビヨン!ドリーミング

プリキュア45人分の変身と攻撃の口上と走れメロスを混ぜて適当な文章を再構築する

プリキュア45人分の口上を学習
Terminal
$ marky_markov --reset && \
cure precures -m | cure tr '[:precure_name:]' '[:girl_name:]' | \
while read name;do printf "$name "; \
marky_markov read <(cure echo -qap $name | xargs | mecab -Owakati) ; done
走れメロスも学習
Terminal
$ marky_markov read <(w3m -dump -cols 999 http://www.aozora.gr.jp/cards/000035/files/1567_14913.html | awk NF | sed -n '3,/^━*$/p' | sed '$d' | mecab -Owakati | awk NF)
プリキュア名が入っている学習結果のみを抽出9
Terminal
$ yes "marky_markov speak -c 1 | tr -d ' '" | head -n 10 | sh | cure grep
勇者に不似合いな不貞腐(ふてくさ)れた夢、返していただきますわ!お覚悟決めなさい!ブラックサンダー!ホワイトサンダー!プリキュアきらり
# (中略)

ランダムにプリパラのキャラクターのプロフィールを表示する

Terminal
$ rubipara character $(rubipara character | awk '$0=$1' | gshuf | head -n 1)

南みれぃ プロフィール
名前    : 南みれぃ
声優    : 芹澤優
学年    : 中学1年生
チーム  : SoLaMi SMILE
口癖    : 計算どおり

プリパラのキャラクターの口癖を松屋のメニューにし、食いしん坊キャラっぽくする

Terminal
$ rubipara character $(rubipara character | awk '$0=$1' | gshuf | head -n 1) | \
sed -r "s/^(口癖[^:]*: )(.*)/\1$(matsuya)/"

東堂シオン プロフィール
名前    : 東堂シオン
声優    : 山北早紀
学年    : 中学1年生
チーム  : Dressing Pafé
口癖    : 豚カルビめし

$ rubipara character $(rubipara character | awk '$0=$1' | gshuf | head -n 1) | \
sed -r "s/^(口癖[^:]*: )(.*)/\1$(matsuya)/"

北条そふぃ プロフィール
名前    : 北条そふぃ
声優    : 久保田未夢
学年    : 中学2年生
チーム  : SoLaMi SMILE
口癖    : スタミナ豚バラブラウンソース定食

松屋で注文をする小学5年生

$ rubipara kashikoma $(matsuya)


                 /^v \
               _{ / |-.(`_ ̄}__
        _人_  〃⌒ ン'八{   `ノト、`ヽ
        `Y´  {l/ / /    / Vノ } ノ    (      プレミアム牛めし      )
          ,-m彡-ァ Lメ、_彡イ } }<く   O
         / _Uヽ⊂ニ{J:}  '⌒V  {  l| o
       /  r‐='V(「`¨,  r=≪,/ { .ノノ
      /   /_xヘ 人 丶-  _彡イ ∧〉
      (  ノ¨フ’  `^> ‐ァァ <¨フイ
       --=〉_丶/ノ { 彡' '|           Everyone loves Pripara!
           ^  '7^ O〉|’ ,丿
____ ___ __ _{’O 乙,_r[_ __ ___ __________________________

何も考えずごった煮にする(2回目)

事前に走れメロスを学習する
Terminal
$ marky_markov --reset && \
marky_markov read <(w3m -dump -cols 999 http://www.aozora.gr.jp/cards/000035/files/1567_14913.html | \
awk NF | sed -n '3,/^━*$/p' | sed '$d' | mecab -Owakati | awk NF)
結果
$ rubipara kashikoma "$(marky_markov speak -c 1 | tr -d ' ')" | \
sed "1iこの殺伐とした記事に$(cure precures -m | gshuf | head -n 1)が!" | \
sed "\$a$(echo-sd $(snacknomama -s ) | tr '\n' '@' | sed 's/@/\\n/g')"

この殺伐とした記事にキュアダイヤモンドが!


                 /^v \
               _{ / |-.(`_ ̄}__
        _人_  〃⌒ ン'八{   `ノト、`ヽ
        `Y´  {l/ / /    / Vノ } ノ    (単純な男だ。先ず、その身代りの男を死なせ)
          ,-m彡-ァ Lメ、_彡イ } }<く   O
         / _Uヽ⊂ニ{J:}  '⌒V  {  l| o
       /  r‐='V(「`¨,  r=≪,/ { .ノノ
      /   /_xヘ 人 丶-  _彡イ ∧〉
      (  ノ¨フ’  `^> ‐ァァ <¨フイ
       --=〉_丶/ノ { 彡' '|           Everyone loves Pripara!
           ^  '7^ O〉|’ ,丿
____ ___ __ _{’O 乙,_r[_ __ ___ __________________________

_人人人人人人人人人_
> スナック    <
> 幸パブ・モア砂 <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄

松屋好きのプリパラのキャラクターとスナックのママのプロフィールを混ぜる

Terminal
$ (rubipara character $(rubipara character | awk '$0=$1' | gshuf | head -n 1); snacknomama) | \
awk '$1=$1' | sed -r "s/^(口癖[^:]*: )(.*)/\1$(matsuya)/" | sed 's/:/\t:/g'
レオナ・ウェスト プロフィール
名前    : レオナ・ウェスト
声優    : 若井友希
学年    : 中学1年生
チーム  : Dressing Pafé
口癖    : キムチチゲカルビ焼膳(プレミアム牛肉使用)
店名    : スナック PUB
ママ    : リオ
人生    : 両親死別->高等学校退学->結婚出産->旦那借金->離婚バツ1

中学1年生(高等学校退学)

スナックのママの人生が不憫なのでなんとかする

スナックのママの人生を100回分学習10
Terminal
# 100回学習
$ yes 'marky_markov read <(snacknomama -z | sed "s/->/ - > /g")' | head -n 100 |  bash

# 生成
$ marky_markov speak -c 1
旦那借金 - > 高等学校中退 - > 離婚バツ4.
プリキュアの変身口上を矢印で結び、それも全員分学習する。
Terminal
# 学習対象の文字列
$ cure echo -qp magical | sed 's/$/@/' | tr -d '\n' | sed 's/@$/\n/;s/@/ - > /g'
キュアップ・ラパパ! ダイヤ! - > ミラクル・マジカル・ジュエリーレ! - > ふたりの魔法!キュアマジカル! - > 魔法つかいプリキュア!!

# 学習
$ cure precures | cure tr '[:precure_name:]' '[:girl_name:]' | while read name;do printf $name; marky_markov read <(cure echo -qp $name | sed 's/$/@/' | tr -d '\n' | sed 's/@$/\n/;s/@/ - > /g') ;done
プリティでキュアキュアなスナックのママの人生を生成する
Terminal
$ snacknomama | sed -r '${s/(人生: ).*/\1'"$(marky_markov speak -c 1 | sed 's/- >/->/g')"'/}'
店名: スナック ゆみ
ママ: モモカ
人生: プリキュアくるりんミラーチェンジ! -> 旦那借金 -> 世界に広がるビッグな愛!キュアラブリー! -> 結婚出産 -> 離婚バツ4.

$ snacknomama | sed -r '${s/(人生: ).*/\1'"$(marky_markov speak -c 1 | sed 's/- >/->/g')"'/}'
店名: スナック うさぎちゃん
ママ: ウツキ
人生: 英知の光! キュアダイヤモンド! -> 旦那借金 -> 旦那暴力 -> とっととお家に帰りなさい!.

世界に広がるビッグな愛(意味深)

どっかの人物の画像を表示する

下記のコマンドを実行すると、自動的にブラウザが開いて、人物の画像が表示されます。

Terminal
$ faker-cli -I avatar | xargs open

B.jpeg

なにかの背景画像を表示する

下記のコマンドを実行すると、自動的にブラウザが開いて、いかにも何かの背景にできそうな無難な画像が表示されます。

Terminal
$ unsplash link -r | tail -n 1 | xargs -I@ open @

A.jpeg

なにかの背景画像にどっかの人物の画像を重ねる。

下記のコマンドを実行すると、合成された画像が出現します。実行したディレクトリにresult.jpgという画像が生成されます。

Terminal
$ convert <(unsplash link -r | tail -n 1 | xargs curl -L) \
<(faker-cli -I avatar | xargs curl -L) \
-evaluate-sequence min result.jpg && open result.jpg
題:チューリップの精霊

C.jpeg

文字列を含んだ画像を作る

下記のコマンドを実行すると「たのしいな」という文字の画像が既存の画像ビューワーで表示されます11

Terminal
$ convert -background white \
-fill black \
-font "/Library/Fonts/Hiragino Sans GB W6.otf" \
-pointsize 32 label:たのしいな text.png && \
open text.png

Screen Shot 2016-12-23 at 6.06.53 PM.png

ランダムに取得した背景にプリパラのアニメの各話のタイトルをランダムにくっつける。

下記のコマンドを実行すると、カレントディレクトリに「result_title.jpg」という画像が作成され、画像ビューワーで自動的に開かれます。

Terminal
# プリパラというアニメの話数をランダムに表示する
$ rubipara episode $(seq 30 | gshuf | head -n 1)
第26話  いよいよあの子がデビューでちゅ

# 画像生成
$ M=$(rubipara episode $(seq 30 | gshuf | head -n 1)); \
unsplash link -r | tail -n 1 | xargs curl -L | \
convert - -font '/Library/Fonts/Hiragino Sans GB W6.otf' \
-pointsize 13 \
-gravity South \
-fill black -draw "text 0,0 '$M'" \
-fill white -draw "text 2,2 '$M'" \
result_title.jpg && \
open result_title.jpg
お茶農家始めちゃいました!

result_title1.jpeg

奇跡的にキャプションと画像が合った例

kiseki.jpg

羽ばたくな

wwwww.jpeg

無限に出現するスナックのママの自己紹介スライドショー

下記のコマンドを実行すると、ブラウザが開き、スナックのママの自己紹介用プレゼン資料が延々と流れ始める。

Terminal
# 開始
$ pen test.md & while true; \
do (echo '# 自己紹介'; echo '![]('`faker-cli -I avatar | xargs`')' | \
xargs; snacknomama | sed 's/^/\n## /g' | sed 's/:/\n###### /g' | \
sed '/店名/{s|$|\n![]('"$(faker-cli -I nightlife | xargs)"')\n|}') | \
tee > test.md ; sleep 3 ;done

# 注: 止める時は、nodeのプロセスを止めてください
$ killall node

パワポカラオケにお使い下さい。

ランダムに葬儀用の画像素材を用意する

下記のコマンドを実行すると、どっかの人物の画像を葬儀用写真風に加工し、結果をresult_sougi.jpgに保存します。不謹慎でごめんなさいごめんなさい。

Terminal
$ faker-cli -I avatar | xargs curl -L | \
convert -type GrayScale \
-border 10x10 -bordercolor black \
-border 7x7 -bordercolor white \
-stroke white -strokewidth 10 -draw "line -5,40 81,-10" \
-stroke black -strokewidth 10 -draw "line -5,30 81,-10" \
-stroke white -strokewidth 10 -draw "line 167,40 81,-10" \
-stroke black -strokewidth 10 -draw "line 167,30 81,-10" \
- result_sougi.jpg && \
open result_sougi.jpg

result_sougi.jpg

突然の死ということにする

Terminal
$ faker-cli -I avatar | xargs curl -L | \
convert -type GrayScale \
-border 10x10 -bordercolor black \
-border 7x7 -bordercolor white \
-stroke white -strokewidth 10 -draw "line -5,40 81,-10" \
-stroke black -strokewidth 10 -draw "line -5,30 81,-10" \
-stroke white -strokewidth 10 -draw "line 167,40 81,-10" \
-stroke black -strokewidth 10 -draw "line 167,30 81,-10" \
- - | convert -font '/Library/Fonts/Hiragino Sans GB W6.otf' \
-pointsize 8 -gravity North \
-fill black -draw "text 1,13 '$(echo-sd)'" \
-fill white -draw "text 0,12 '$(echo-sd)'" \
- sudden_death.jpg && \
open sudden_death.jpg

sudden_death.jpg

突然死なりに適当な遺影である。

「「え!?俺達がプリキュア!?」」

下記のコマンドを実行すると、2種類の人物画像を取得し、合体させて表示します。

Terminal
# 台詞を変数に入れる
$ M=$(cure echo -qp cure_black | tail -n 3 | tr '\n' '\\n');

# 出力
$ convert +append <(faker-cli -I avatar | xargs curl -L) \
<(faker-cli -I avatar | xargs curl -L) - | \
convert -font '/Library/Fonts/Hiragino Sans GB W6.otf' \
-gravity South \
-pointsize 12 \
-fill black \
-draw "text 0,12 '$M'"  \
-draw "text 0,11 '$M'"  \
-draw "text 0,13 '$M'"  \
-draw "text -1,12 '$M'"  \
-draw "text 2,12 '$M'"  \
-fill white -draw "text 0,12 '$M'"  \
- combine.jpg && \
open combine.jpg

combine.jpg

「「「「「え!?俺達がプリキュア!?」」」」」

下記のコマンドを実行すると、5種類の画像を取得し、合体させ、色付きのキャプションを入れ、即興で「Yes!プリキュア5」を作ります。

Terminal
$ cure precures | sed -n '6,10p' | \
gxargs -I@ echo '<(sleep $((RANDOM%5)) && \
faker-cli -I avatar | xargs curl -L | \
convert -font "/Library/Fonts/Hiragino Sans GB W6.otf" \
-gravity South -pointsize 12 \
-fill $(echo "@" | cure tr "[:precure_name:]" "[:color:]") \
-draw "text 0,12 \"@\"" - - )' | \
tr '\n' ' ' | sed 's/^/convert +append /;s/$/ precure5.png/' | \
bash && open precure5.png

precure5.jpeg

$\large{「「「「「Yes!プリキュア5!」」」」」}$

むすび

いかがでしたでしょうか。昨年好評だったので、今年もこのような記事を書きました。今年は特に、なかなか長めのコマンドも多く、一回読んだだけでは、一体何をしているのかまったくわからなかったシェル芸も多かったと思います。
この記事の内容がちんぷんかんぷんだという初学者の方に一つアドバイスですが、そういう時は、一旦気になるシェル芸をコピーして、手元で実行してみて下さい。そのあと、コマンドの後ろから、パイプ(|) を一つ一つ外して、出力結果を確認してみると理解が深まります。

例えば、下記のようなシェル芸があったとしたら

Terminal
$ commandA | commandB | commandC | commandD ...

こんな感じで結果を確認します。

Terminal
# まずcommandDをはずして結果を確認
$ commandA | commandB | commandC

# それでも理解できなかったら、commandCもはずして確認
$ commandA | commandB

# 以下同様
...

このようにして、まずは写経して、実行。そして自分なりにちょっと削って実行、を繰り返すのは、人のテクニックを盗むのにも良い方法だと思います。

また、この記事にあるようなコマンドを使って「もっと面白いことしてみたよ!」という方は、ぜひコメントしてみてください。


  1. マウスも使わず、ソースコードも残さず、GUIツールを立ち上げる間もなく、あらゆる調査・計算・テキスト処理をCLI端末へのコマンド入力一撃で終わらすこと。あるいはそのときのコマンド入力のこと。 https://blog.ueda.asia/?page_id=1434 

  2. 作者の記事 http://razokulover.hateblo.jp/entry/2016/01/04/123608 によると、実際に存在する山手線と中央線沿線のスナック名を素材として利用しているとのこと。 

  3. 作者の記事によると「コードポイント、名前、キーワード、GitHubのショートコードなど」を表示できるとのこと https://blog.misosi.ru/2016/12/20/released-emspect/ 

  4. これが今流行のマイクロサービスというやつですね。 

  5. ブーム君のこと http://dic.nicovideo.jp/a/%E7%A7%81%E3%81%A7%E3%81%99%E3%80%82 

  6. なんかこんな図 http://gamesenin.jp/img/PW2014057.png/ 

  7. こういうのです http://www.dualshockers.com/2010/07/12/hyperkin-gives-dance-dance-revolution-fans-a-new-reason-to-well-dance/ 

  8. 三大奇書の一つに数えられる探偵小説家の夢野久作の代表作。読了したことがあるが、ひどく疲れる。 

  9. 「夢」とか「正義」などの単語を経由して、メロス本文とプリキュアの変身口上が単語のネットワークでつながるらしい。 

  10. 生成される結果が、ある程度面白くなるように -> という文字列が2単語扱いになるように - > に置換している。marky_markovが提供するのは、デフォルトでは深度2のマルコフ連鎖であるため、この置換をすることで、人生のイベント間の結合度をゆるくしている。例えば "A -> B" では"A"と"B"の間には1単語しか入らないが、"A - > B" であればAとBの間は2単語となる。これにより、AからBに遷移する確率を下げ、他の人生イベントに遷移する確率を高めている。 

  11. "/Library/Fonts/Hiragino Sans GB W6.otf" というフォントが必要です。このフォントはOSX: Mavericks以降に含まれているはずです( https://support.apple.com/ja-jp/HT201375 ) 無い方はttfあるいはotfという拡張子を持ったお好きなフォントをお使い下さい。 

この投稿は Shell Script Advent Calendar 201624日目の記事です。
Comments Loading...