きっかけ
昨年は好評いただいたので、またやります。
この記事は一体何なのか?
いろんな種類のコマンドを、シェルの機能で適当につなげてシェル芸1をする。すると、なんとたのしい。
実行環境
Mac OSX Yosemite 10.10.5の端末上で実施。
zshを使って動作確認してますが、多分bashでも動きます。
$ 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
画像例
$ rhymer
与えられた文章の中から韻を踏んでいるラップっぽいフレーズの組み合わせを見つけ出す。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通信のリクエスト、レスポンスをする。
## 8080番ポートでTCP通信を受信待機する
$ nc -l 8080 <<<"HTTP/1.0 200 Ok"
## 実行後、端末1側にリクエスト情報が表示される。
$ curl -v localhost:8080 -d 'test'
coreutils
shuf
やmd5sum
などの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 "こんにちは"
その他のコマンド
echo
や while
などのシェルのループ文、sed
, awk
, perl
などの実行環境でビルドインになっているコマンドの力も適宜借ります。
--- 以下、悲惨な結果の数々 ---
牛の絵文字を表示
$ emspect :ox: -f '%C'
🐂
リアルな牛を思うアスキーアート牛
$ emspect :ox: -f '%C' | cowsay
______
< 🐂 >
------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
絵文字をハッシュにする
# 牛
$ emspect :ox: -f '%C'
🐂
# ハッシュ化した牛(ハッシュドビーフ)
$ emspect :ox: -f '%C' | gmd5sum
6f684ae9177aac2ab092f1713a7af590 -
# 芋
$ emspect :sweet_potato: -f '%C'
🍠
# ハッシュ化した芋(ハッシュドポry)
$ emspect :sweet_potato: -f '%C' | gmd5sum
b721d4258a46e85d64807a3c407d01ac -
とりあえず全ての絵文字の情報を表示してみる
$ 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:
# (中略)
グレープをグレップ
$ emspect | grep grape
🍇 GRAPES (U+1F347) - fruit, grape, plant :grapes:
スナックのママの情報が味気ないので、ランダムにお花でデコレーション
# Before
$ snacknomama
店名: スナック ジャ花バージン
ママ: スミエ
人生: 両親富豪->高等学校卒業->結婚出産->旦那借金->離婚バツ3
# After!
$ snacknomama | sed 's/^/'$(emspect flower -f "%C" | gshuf | head -n 1)' /'
🌺 店名: スナック タンポポ舞ナイトパブ・ギャラン
🌺 ママ: ハナハ
🌺 人生: 両親死別->中学校中退->結婚出産->旦那借金->離婚バツ1
キティちゃんもつけて更にかわいく、スナックの看板っぽい何かを作る
$ snacknomama | head -n 2 | sed 's/^/'$(emspect flower -f "%C" | gshuf | head -n 1)' /' | xargs | cowsay -f hellokitty
______________________________________
/ 🌹 店名: スナック \
| ゅっせるジージックスバー |
\ 🌹 ママ: ミカ /
--------------------------------------
\
\
/\_)o<
| \
| O . O|
\_____/
しかし何の可愛げもないJSONにされるスナックのママの人生
$ snacknomama | sed 's/: /=/g;s/ /\\ /g' | xargs jo -p
{
"店名": "スナック キャッスル子",
"ママ": "ウナ",
"人生": "両親死別->高等学校中退->結婚出産->旦那借金->離婚バツ1"
}
スナックのママの人生を返すAPIを作る
$ while :; do snacknomama | \
sed 's/: /=/g;s/ /\\ /g' | \
xargs jo -p | \
sed '1iHTTP/1.0 200 Ok\n' | \
nc -l 8080;done
# curlで何回でも叩ける
$ curl localhost:8080
{
"店名": "スナック あき愛ステップ",
"ママ": "ジュンナ",
"人生": "両親富豪->中学校中退->結婚出産->旦那借金->離婚バツ4"
}
# 叩くごとに結果が異なる
$ curl localhost:8080
{
"店名": "スナック むつ",
"ママ": "アユ",
"人生": "両親離婚->中学校中退->結婚出産->旦那暴力->離婚バツ2"
}
2つターミナルを開いてお試しください4。
落ち着かないスナックのママの人生に強引にオチを
$ snacknomama -z | sed 's/->/ /g' | xargs echo-sd --stress
両親死別
↘
中学校中退
↙
結婚出産
↘
旦那酒
↙
_人人人人人人_
> 離婚バツ3 <
 ̄Y^Y^Y^Y^Y^Y^ ̄
見ざる聞かざる言わざる
$ emspect monkey -f '%C' | head -n 3
🙈
🙉
🙊
Kyoko「ミザル、キカザル、イワザル」
実は say
コマンドに絵文字を渡すと、その絵文字の説明をしてくれます。
$ emspect monkey -f '%C' | head -n 3 | say -v Kyoko
「見ざる聞かざる言わざる」を止めた猿に襲いかかる残酷な現実
$ emspect monkey -f '%C' | head -n 4 | xargs echo-sd --stress
🙈
↘
🙉
↙
🙊
↘
🐵
↙
_人人人人人人人人人_
> 仕事のストレス <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
スマイルを表示
$ emspect smile -f '%C' | head -n 1
😁
わ た し で す 5
$ emspect smile -f '%C' | head -n 1 | echo-sd -s | echo-sd -sf"わ た し で す"
_人人人人人人人_
> _人人人_ <
> > 😁 < <
>  ̄Y^Y^Y^ ̄ <
 ̄Y^Y^Y^Y^Y^Y^Y^ ̄
わ た し で す
いろいろごった煮にする(1回目)
$ 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^ ̄
牛 め し
ランダムに色んな顔を表示してみる
$ 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
😓
表情豊かな人に訪れる残酷な現実
$ emspect -c "U+1F61" -f "%C" | gshuf | head -n 4 | xargs echo-sd --stress
😐
↘
😙
↙
😘
↘
😜
↙
_人人人人人人人人人_
> 仕事のストレス <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
パワフルプロ野球にありそうなチーム表 6 っぽい何かを作る
$ 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を出力する
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
■ ⬇ ■ ■
■ ⬇ ■ ■
■ ■ ⬆ ■
■ ⬇ ➡ ■
⬇ ■ ➡ ■
■ ■ ⬅ ➡
# (中略)
車が走る
アニメーションで右から左に移動します。
$ 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
______________________________________🚓 💨_____________
こんな感じ
おこめ + さかな = すし
$ echo "$(emspect :rice: -f '%C') + $(emspect :fish: -f '%C') = $(emspect :sushi: -f '%C')"
🍚 + 🐟 = 🍣
お米と魚の衝突実験
$ 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
キュアソード(プリキュアの一人)の変身の口上を表示
$ cure echo -qp cure_sword
プリキュアラブリンク!
L! O! V! E!
勇気の刃! キュアソード!
響け愛の鼓動!ドキドキプリキュア!
このキュアソードが愛の剣で
あなたの野望を断ち切ってみせる!
キュアソードの変身の口上の中で、ラップになっている箇所を抽出
$ rhymer spit "$(cure echo -qp cure_sword)"
プリキュアラブリンクL!O!V!E!勇気の刃キュアソード響け愛の鼓動 愛の鼓動ドキドキプリキュアこのキュアソードが愛の剣であなたの野望
キュアソード響け愛の**鼓動(コドォウ)♪
愛の剣であなたの野望(ヤボォウ)**♪
プリキュアの変身の口上の中に出てくる品詞が「名詞」の単語をランダムに松屋のメニューと入れ替える
通常のキュアフローラ
$ cure echo -qa -p cure_flora
プリキュア!プリンセスエンゲージ!
咲き誇る花のプリンセス!キュアフローラ!
強く、やさしく、美しく!
Go!プリンセスプリキュア!
冷たい檻に閉ざされた夢、返していただきますわ!
お覚悟はよろしくて?
エクスチェンジ!モードエレガント!
舞え、花よ!プリキュア・フローラル・トルビヨン!
(ドリーミング)
ごきげんよう
松屋版キュアフローラ (適宜結果に改行を入れてます)
$ 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!プリンセスプリキュア!
冷たい檻に閉ざされた夢、返していただきますわ!おプレミアム牛めしはよろしくて?
オリジナルカレー!プレミアム旨辛ネギ塩豚カルビ丼!
舞え、スタミナ旨辛ネギたっぷりネギたま牛焼肉定食よ!ビビン丼!
(ドリーミング)
ごきげんよう
通常版キュアマジカル
$ cure echo -qa -p cure_magical
キュアップ・ラパパ! ダイヤ!
ミラクル・マジカル・ジュエリーレ!
ふたりの魔法!キュアマジカル!
魔法つかいプリキュア!!
リンクルステッキ!
ダイヤ!永遠の輝きを私達の手に!
フルフルリンクル!
プリキュア・ダイヤモンド・エターナル!
松屋版キュアマジカル
$ 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人全員の変身の口上の中からラップっぽい箇所をすべて列挙
$ cure precures | cure tr '[:precure_name:]' '[:girl_name:]' | while read girl;do rhymer spit "$(cure echo -qp $girl)" ;done
金の花キュアブルームふたりはプリキュア聖なる泉 金の花キュアブルームふたりはプリキュア聖なる泉を汚す者よ阿漕
デュアル・スピリチュアル・パワー花開け大地 金の花キュアブルームふたりはプリキュア聖なる泉を汚す者よ阿漕
デュアル・スピリチュアル・パワー花開け大地 金の花キュアブルームふたりはプリキュア聖なる泉
銀の翼キュアイーグレットふたりはプリキュア聖なる泉 銀の翼キュアイーグレットふたりはプリキュア聖なる泉を汚す者よ阿漕
プリキュアメタモルフォーゼ知性 キュアアクア希望の力と未来の光華麗
(レディ?)プリキュア・スマイルチャージ(ゴーゴーレッツ (レディ?)プリキュア・スマイルチャージ(ゴーゴーレッツゴーピース
(レディ?)プリキュア・スマイルチャージ(ゴーゴーレッツゴーマーチ (レディ?)プリキュア・スマイルチャージ(ゴーゴーレッツゴーマーチ!!)勇気
このキュアダイヤモンドがあなた このキュアダイヤモンドがあなたの頭
プリキュアラブリンクL!O!V!E!勇気の刃キュアソード響け愛の鼓動 愛の鼓動ドキドキプリキュアこのキュアソードが愛の剣であなたの野望
ルンルン!)プリキュアくるミラーチェンジ大地 ミラーチェンジ大地に実る命
泉(イズミィ)、阿漕(アコギィ)……
チェンジ大地(ダイチィ)、ミノル命(イノチィ)……
青空文庫から走れメロスの本文を取得して分析する
※ お手元で試す時は、連続で叩きすぎないようにして下さい。
$ w3m -dump -cols 999 http://www.aozora.gr.jp/cards/000035/files/1567_14913.html | \
awk NF | sed -n '3,/^━*$/p;' | sed '$d'
メロスは激怒した。必ず、かの邪智暴虐(じゃちぼうぎゃく)の王を除かなければならぬと決意した。メロスには政治がわからぬ。メロスは、村の牧人である。笛を吹き、羊と遊んで暮して来た。けれども邪悪に対しては、
# (中略)
品詞ごとに、空白で分割(分かち書き)にする
$ 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 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を学習する
# 学習
$ 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 ' '
時間の割合が、何だか、そんな大きな事実に照し合せてしまいまして、唇の色に、みんな眼をこすった。……不思議
元々が支離滅裂な文なので、違和感がない。
ドグラ・マグラの文章から適当に文章を生成しまくり、ラップを自動生成する。
# 50回くらいやると1個くらいでてきます。
$ yes "marky_markov speak -c 1 | tr -d ' ' | xargs rhymer spit" | head -n 50 | sh
三重の恋を敵本主義の世の中 生やさしい御方
まりが遅うなっております奥のドン底 まりが遅うなっております奥のドン底のドンドコ
そうした得意時代 のを待っていないとドウモ具合
献本主義のヨノナカァ、生易しいオカタァ
プリキュア45人分の変身と攻撃の口上から適当に文章を生成する
口上を学習
# プリキュア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
口上を生成
$ marky_markov speak -c 1 | tr -d ' '
さん、このキュアダイヤモンドがあなたのハートは祈りのしるし!とれたてフレッシュ、キュアパイン!レッツプリキュア!悪いの悪いの飛んでいけ!プリキュア!プリンセス
$ marky_markov speak -c 1 | tr -d ' '
守るために心をひとつに!光の意志よ!阿漕な真似はお止めなさい!エクスチェンジ!モードエレガント!高鳴れ、海よ!プリキュア・フローラル・トルビヨン!ドリーミング
プリキュア45人分の変身と攻撃の口上と走れメロスを混ぜて適当な文章を再構築する
プリキュア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
走れメロスも学習
$ 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
$ yes "marky_markov speak -c 1 | tr -d ' '" | head -n 10 | sh | cure grep
勇者に不似合いな不貞腐(ふてくさ)れた夢、返していただきますわ!お覚悟決めなさい!ブラックサンダー!ホワイトサンダー!プリキュアきらり
# (中略)
ランダムにプリパラのキャラクターのプロフィールを表示する
$ rubipara character $(rubipara character | awk '$0=$1' | gshuf | head -n 1)
南みれぃ プロフィール
名前 : 南みれぃ
声優 : 芹澤優
学年 : 中学1年生
チーム : SoLaMi SMILE
口癖 : 計算どおり
プリパラのキャラクターの口癖を松屋のメニューにし、食いしん坊キャラっぽくする
$ 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回目)
事前に走れメロスを学習する
$ 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^ ̄
松屋好きのプリパラのキャラクターとスナックのママのプロフィールを混ぜる
$ (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
# 100回学習
$ yes 'marky_markov read <(snacknomama -z | sed "s/->/ - > /g")' | head -n 100 | bash
# 生成
$ marky_markov speak -c 1
旦那借金 - > 高等学校中退 - > 離婚バツ4.
プリキュアの変身口上を矢印で結び、それも全員分学習する。
# 学習対象の文字列
$ 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
プリティでキュアキュアなスナックのママの人生を生成する
$ 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')"'/}'
店名: スナック うさぎちゃん
ママ: ウツキ
人生: 英知の光! キュアダイヤモンド! -> 旦那借金 -> 旦那暴力 -> とっととお家に帰りなさい!.
世界に広がるビッグな愛(意味深)
どっかの人物の画像を表示する
下記のコマンドを実行すると、自動的にブラウザが開いて、人物の画像が表示されます。
$ faker-cli -I avatar | xargs open
なにかの背景画像を表示する
下記のコマンドを実行すると、自動的にブラウザが開いて、いかにも何かの背景にできそうな無難な画像が表示されます。
$ unsplash link -r | tail -n 1 | xargs -I@ open @
なにかの背景画像にどっかの人物の画像を重ねる。
下記のコマンドを実行すると、合成された画像が出現します。実行したディレクトリにresult.jpgという画像が生成されます。
$ 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
題:チューリップの精霊
文字列を含んだ画像を作る
下記のコマンドを実行すると「たのしいな」という文字の画像が既存の画像ビューワーで表示されます11。
$ convert -background white \
-fill black \
-font "/Library/Fonts/Hiragino Sans GB W6.otf" \
-pointsize 32 label:たのしいな text.png && \
open text.png
ランダムに取得した背景にプリパラのアニメの各話のタイトルをランダムにくっつける。
下記のコマンドを実行すると、カレントディレクトリに「result_title.jpg」という画像が作成され、画像ビューワーで自動的に開かれます。
# 事前に話数を変数に入れる
$ 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
お茶農家始めちゃいました!
奇跡的にキャプションと画像が合った例
羽ばたくな
無限に出現するスナックのママの自己紹介スライドショー
下記のコマンドを実行すると、ブラウザが開き、スナックのママの自己紹介用プレゼン資料が延々と流れ始める。
# 開始
$ 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
@tos movie pic.twitter.com/6pQbrQvD3Y
— ぐれさん (@grethlen) 2016年12月23日
パワポカラオケにお使い下さい。
ランダムに葬儀用の画像素材を用意する
下記のコマンドを実行すると、どっかの人物の画像を葬儀用写真風に加工し、結果をresult_sougi.jpg
に保存し、開きます。不謹慎でごめんなさいごめんなさい。
$ 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
突然の死ということにする
$ 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
突然死なりに適当な遺影である。
「「え!?俺達がプリキュア!?」」
下記のコマンドを実行すると、2種類の人物画像を適当に取得し、合体させて台詞をつけて表示します。
# 台詞を変数に入れる
$ M=$(cure echo -qp cure_black | tail -n 3);
# 出力
$ 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
「「「「「え!?俺達がプリキュア!?」」」」」
下記のコマンドを実行すると、5種類の画像を取得し、合体させ、色付きのキャプションを入れ、即興で「Yes!プリキュア5」を作ります。
$ 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
$\large{「「「「「Yes!プリキュア5!」」」」」}$
むすび
いかがでしたでしょうか。昨年好評だったので、今年もこのような記事を書きました。今年は特に、なかなか長めのコマンドも多く、一回読んだだけでは、一体何をしているのかまったくわからなかったシェル芸も多かったと思います。
この記事の内容がちんぷんかんぷんだという初学者の方に一つアドバイスですが、そういう時は、一旦気になるシェル芸をコピーして、手元で実行してみて下さい。そのあと、コマンドの後ろから、パイプ(|
) を一つ一つ外して、出力結果を確認してみると理解が深まります。
例えば、下記のようなシェル芸があったとしたら
$ commandA | commandB | commandC | commandD ...
こんな感じで結果を確認します。
# まずcommandDをはずして結果を確認
$ commandA | commandB | commandC
# それでも理解できなかったら、commandCもはずして確認
$ commandA | commandB
# 以下同様
...
このようにして、まずは写経して、実行。そして自分なりにちょっと削って実行、を繰り返すのは、人のテクニックを盗むのにも良い方法だと思います。
また、この記事にあるようなコマンドを使って「もっと面白いことしてみたよ!」という方は、ぜひコメントでシェアしてみてください。
-
マウスも使わず、ソースコードも残さず、GUIツールを立ち上げる間もなく、あらゆる調査・計算・テキスト処理をCLI端末へのコマンド入力一撃で終わらすこと。あるいはそのときのコマンド入力のこと。 https://blog.ueda.asia/?page_id=1434 ↩
-
これが今流行のマイクロサービスというやつですね。 ↩
-
ブーム君のこと http://dic.nicovideo.jp/a/%E7%A7%81%E3%81%A7%E3%81%99%E3%80%82 ↩
-
こういうのです http://www.dualshockers.com/2010/07/12/hyperkin-gives-dance-dance-revolution-fans-a-new-reason-to-well-dance/ ↩
-
三大奇書の一つに数えられる探偵小説家の夢野久作の代表作。読了したことがあるが、ひどく疲れる。 ↩
-
「夢」とか「正義」などの単語を経由して、メロス本文とプリキュアの変身口上が単語のネットワークでつながるらしい。 ↩
-
生成される結果が、ある程度面白くなるように
->
という文字列が2単語扱いになるように- >
に置換している。marky_markovが提供するのは、デフォルトでは深度2のマルコフ連鎖であるため、この置換をすることで、人生のイベント間の結合度をゆるくしている。例えば "A -> B" では"A"と"B"の間には1単語しか入らないが、"A - > B" であればAとBの間は2単語となる。これにより、AからBに遷移する確率を下げ、他の人生イベントに遷移する確率を高めている。 ↩ -
"/Library/Fonts/Hiragino Sans GB W6.otf" というフォントが必要です。このフォントはOSX: Mavericks以降に含まれているはずです( https://support.apple.com/ja-jp/HT201375 ) 無い方はttfあるいはotfという拡張子を持ったお好きなフォントをお使い下さい。 ↩