Cureutilsを使ったプリティでキュアキュアなターミナルライフの実現

ADVENTERの[プリキュア Advent Calendar 2016](http://www.adventar.org/calendars/1359)の13日目の記事です。

# 日々の作業を便利にする *utils を活用しよう

端末上の対話シェルで作業をすることが多い方は、最初からインストールされているコマンドだけでなく、新たにコマンドをインストールして使う方が多いと思います。

例えば、OSXをお使いの方で、[coreutils](https://ja.wikipedia.org/wiki/GNU_Core_Utilities)という、GNUの標準コマンドが含まれたツール集をインストールする方をよく見ます。便利なので、よく私もお世話になっています[^useful_coreutils]。

他にも、似た名前の [moreutils ](https://joeyh.name/code/moreutils/)というツール集もあります。coreutilsと違い、少し複雑な動作や機能を提供してくれるようなものが含まれます[^about_moreutils]。これも、使いこなすと日々の仕事を楽にできそうです。ちなみに私は、よく`sponge`コマンドにお世話になることが多いです。

また最近では、[dateutils](http://www.fresse.org/dateutils/) というツール集を使う方も見かけるようになりました。特に私はシェル芸[^shellgei]を生業にしている方と交流する機会が多く、シェル芸人[^shellge-nin]の方がこれをたまに使っています[^dateutils_people]。連続した日付を作れたり、日付のリストをソートできたりと、これもなかなか便利そうです。

世の中にはこのような「ほにゃららutils」だけでなく、他にもいろいろな便利なツール集が存在します。例えば、大きなデータの集計作業をよくする方は、数値の統計用のツール集をインストールすると楽ができるかもしれません[^mcmd]し、ファイルを簡単なDBみたいに使うことが多い方は、それ用のツール集は探せばいくつかあるので、試してみると良いかもしれませんね[^tukubai]。

[^useful_coreutils]: coreutilsに含まれるGNU版の`grep`は、Perlの柔軟な正規表現でマッチができるので私はビルドインの`grep`ではなくこちらの`grep`を使っています。
[^about_moreutils]: こちらは、Qiitaによくまとめられている方がいました。 http://qiita.com/cuzic/items/1837cfe6572cbd3f09c2
[^shellgei]: マウスも使わず、ソースコードも残さず、GUIツールを立ち上げる間もなく、あらゆる調査・計算・テキスト処理をCLI端末へのコマンド入力一撃で終わらすこと。あるいはそのときのコマンド入力のこと。 https://blog.ueda.asia/?page_id=1434
[^shellge-nin]: シェル芸を使いこなす人
[^dateutils_people]: `dateutils`で戯れる微笑ましいシェル芸人のツイート https://twitter.com/eban/status/794185079782150145 https://twitter.com/kunst1080/status/792248369053708288
[^mcmd]: たとえば、[MCMD](http://www.nysol.sakura.ne.jp/mcmd/jp/index.html) などは便利なツール例です。
[^tukubai]: たとえば、[Open USP Tukubai](https://uec.usp-lab.com/TUKUBAI/CGI/TUKUBAI.CGI?POMPA=ABOUT)など、便利な例です。


# Cureutilsとは？


端末にいろいろなツールを入れて、多くの作業を楽にしている方であってもやはり「なかなか痒い所に手が届かないなあ」という感覚は無くなりません。というのも、プリキュア[^about_precure]のような、特定のジャンルに関する情報資源の扱いには、汎用的なコマンドだけでは対処が面倒だからです。

例えば
**「grepでプリキュアだけをマッチさせたいな。」**
と思ったり
**「顧客情報にキュアピンクなんて名前があるけど、そんなプリキュアいたっけ？これは偽物では？」**
と思ったり
**「個人情報のテストデータに適当な名前を入れたい！そうだ、プリキュアの名前を入れよう！あ、でも変身前の名前わからない。」**
と思ったり
**「あれ？今ってプリキュア全員で何人だっけ？」**
と思ったり
**「キュアホワイトの声優ってなんて名前だっけ？」**
と思ったり
**「娘と思い出話をしたいなあ……。あれ、娘が3歳の時やってたプリキュアって何だっけ？」**
と思ったり
**「あーあ、ぴかりんジャンケンがしたいなあ。」**
と思うなど、

フラストレーションの溜まっている方も多いのではないでしょうか？エンジニアの方々、その中でも特にキュアエンジニア[^cureengineer]の方々は、何かとプリキュアの関連情報の取扱いが必要になる場面があると思います。事実、そのようなニーズに応えるためにRubyのプリキュア実装であるRubicure[^rubicure]をはじめ、PerlやPython、JSなど、主要な言語の多くにプリキュアの実装が存在します[^cure_libs]。しかしながら、一旦保守性を考えずにサクッと作業を終わらせたい状況であれば、特定の言語に依存した実装ではなく、シェル上で実行できるコマンドが機能を提供するのが一番だと私は考えています。

そこで私は、シェル上でフレキシブルかつカジュアルかつプリティにプリキュア関連情報を扱うことができるツールであるCureutils 【きゅあゆーてぃるず】(※ coreutils ではない) を2016年6月[^motivation]にリリースしました。

**Github:** https://github.com/greymd/cureutils
![cureutils_logo.png](https://raw.githubusercontent.com/wiki/greymd/cureutils/logo/cureutils_logo.png)


それまでは、対話シェル上でのプリキュア関連情報の取り扱いは、あまり手軽ではありませんでしたが、このツールの登場により、一層手軽になったため、多くの反響を頂いています[^cure_down]。

[^about_precure]: 日本が世界に誇る国民的アニメ。2016年12月現在「魔法つかいプリキュア」絶賛放映中！
[^rubicure]: https://github.com/sue445/rubicure
[^cure_libs]: http://qiita.com/sue445/items/b41a4f5bdca46f1736c3
[^cureengineer]: プリキュアが好きなエンジニアのこと。
[^cure_down]: Cureutilsは、2016年6月に最初のバージョンがリリースされ、半年で2000件近くダウンロードされています https://rubygems.org/gems/cureutils/versions/0.1.5 。
[^motivation]: リリース時はこちらのスライドを使ってシェル芸勉強会で紹介しました https://speakerdeck.com/greymd/ru-men-cureutils


# 環境


Linux Mint 17 Qiana (おおよそ Ubuntu 14.04)
zshで試してますが、多分bashでも動きます。

```bash:Terminal
$ cat /etc/issue.net
Linux Mint 17 Qiana

$ zsh --version
zsh 5.0.2 (x86_64-pc-linux-gnu)
```

# インストール方法

```bash:Terminal
$ sudo gem install cureutils
```

インストールにはRuby 2.0.0以上とそのRubyに対応した`gem`コマンドが必要です(Ruby2.2.0以下の方は違うgemも必要です[^backport_dig])。インストールすると`cure`コマンドが使えるようになります。まずは`cure help` で使い方を表示してみましょう。なお、今回の記事では、つい最近リリースされたCureutils v0.2.0を利用します。そのため、過去のCureutilsを入れたままの方も、再度上記のコマンドでアップデートしてみて下さい。

[^backport_dig]: Ruby2.2.0以下の方は `$ sudo gem install backport_dig` をしてHash#digが使えるようにしないと、一部の機能が動作しません。

```bash:Terminal
$ cure help
Commands:
  cure date [OPTIONS] [+FORMAT]  # Display date, time and Precure related events.
  cure echo [OPTIONS] PATTERN    # Print messages of Precure.
  cure girls [OPTIONS]           # Print girls' name.
  cure grep [OPTIONS] PATTERN    # Print lines matching a pattern.
  cure help [COMMAND]            # Describe available commands or one specific command
  cure humanize                  # Change precure_name to human_name.
  cure janken                    # Let's play "Pikarin Janken" !
  cure precures [OPTIONS]        # Print Precure names.
  cure tr PATTERN REPLACE        # Translate Precure related parameters.
  cure transform                 # Change human_name to precure_name.
  cure version                   # Output the version number.
```

同様に、`cure`コマンドにスペースを挟んでサブコマンドを入力することで、プリキュア関連情報の取り扱いを便利にするコマンドが使えます。

```bash:Terminal
$ cure version
Cureutils 0.2.0
```

# インストール方法(コマンド補完)

`cure`コマンドには多くのサブコマンドとコマンドラインオプションがあります。Cureutilsを使う上で、必須というわけではありませんが、Zshを使っている方にはコマンドの入力補完スクリプトのインストールをおすすめします。[zplug](https://github.com/zplug/zplug)をお使いの方は、下記の一行で導入ができます[^manual_completion]。

```bash:~/.zshrcの一部
zplug "greymd/cureutils", use:cureutils.plugin.zsh
```
[^manual_completion]: お使いでない方は、下記に、Zsh用の補完スクリプトがあるので、手動で導入されると良いと思います。https://github.com/greymd/cureutils/blob/master/zsh-completion/_cure


# `cure precures`
さて、ではここからサブコマンドの説明をしていきます。まず最初に`cure precures`というコマンドがあります。このコマンドを使うことで、プリキュアの名前を全員[^definition_of_alprecure]標準出力に出力します。

```bash:Terminal
$ cure precures
キュアブラック
キュアホワイト
シャイニールミナス
キュアブルーム
キュアイーグレット
キュアブライト
キュアウィンディ
キュアドリーム
キュアルージュ
キュアレモネード
(中略)
```

Cureutils v0.2.0ではTV版のメインヒロイン合計44人を表示します。ただし、劇場版のプリキュアであるキュアエコーも表示したい方は、`-m`(あるいは`--movie`)オプションを使うことで、表示することができます。

```
$ cure precures -m
キュアブラック
キュアホワイト
シャイニールミナス
(中略)
キュアミラクル
キュアマジカル
キュアフェリーチェ
キュアエコー
```

# `cure girls`

`cure girls`コマンドを使うことで、プリキュアに変身する女の子の名前を全員[^definition_of_alprecure]出力します。

```bash:Terminal
$ cure girls
美墨なぎさ
雪城ほのか
九条ひかり
日向咲
美翔舞
夢原のぞみ
夏木りん
(中略)
```

こちらも同様に、`-m`オプションでキュアエコー(坂上あゆみ)の表示ができます。また、キュアプリンセスこと「白雪ひめ」は、御存知の通り正式名称は「ヒメルダ・ウインドウ・キュアクイーン・オブ・ザ・ブルースカイ」と呼びます。`-v`(あるいは`--verbose`)オプションを付けることでそれも表示することもできます。

```bash:Terminal
$ cure girls -v
(中略)
愛乃めぐみ
白雪ひめ(ヒメルダ・ウインドウ・キュアクイーン・オブ・ザ・ブルースカイ)
大森ゆうこ
(中略)
```

これらのプリキュアの情報は、依存するgemの一つであるRubicureから取得しています。そのため、Rubicureが最新である限りは、最新の情報を取得できるはずです。

[^definition_of_alprecure]: 2016年12月時点で、TVシリーズのメインヒロイン44人。厳密には「伝説の戦士プリキュア」ではない「キュア」のつかない戦士に変身する女の子も含みます。残念ながら満と薫、レジーナなどは含まないので悪しからず。



## 活用例

### テスト用ダミーデータ作成に。

個人情報を取り扱うアプリケーションを作っている方は、テスト用のデータとしてダミーデータを用意することがよくあると思います。そのためのコマンドも、世の中にはいくつもあります[^dummy_tools]。しかしながら、プリキュアの名前をダミーデータとして活用することで、後述する`cure grep`や`cure tr`などと連携させ、特定のダミーデータを簡単に検索したり、他の対応するダミーデータへの変換が可能になります。つまり、より保守性の高いダミーデータの作成が可能になります[^tekitou]。

[^dummy_tools]: [faker-cli](https://www.npmjs.com/package/faker-cli)や[chance-cli](https://github.com/chancejs/chance-cli)など。

[^tekitou]: 適当に言ってます。

### 採用面接対策に

IT系の採用面接では、簡単なプログラムを書かせて、採用する技術者のレベルをざっくり推し量ることがよくされます。採用担当の人事の方から、下記のような質問を受け、ホワイトボードでコードを書かされたという方もいるのではないでしょうか？

1. 「ちょっと100までのFizzBuzzだしてみて？」
2. 「ちょっと100までの素数だしてみて？」
3. 「ちょっとプリキュア全員の名前列挙してみて？」

しかし、これからは心配ありません。特にシェル芸を極めた方ならば、例えば1のFizzBuzzは下記のコマンド[^fizzbuzz]で30秒で瞬殺できますし、

```bash:Terminal
$ seq 100 | sed '5~5s/.*/Buzz/' | sed '3~3s/[0-9]*/Fizz/'
```

2の素数の問題も瞬殺できます。

```bash:Terminal
$ seq 2 100 | factor | awk '$0*=!$3'
```

3の問題は、今まで定型化が難しく、採用面接では好まれて使われていたようで[^youshutten]、私も過去にQiitaで[この問題に対する解答をWebスクレイピングでまとめたことがありました](http://qiita.com/greymd/items/368faf898c161165fee7)。しかし、もはやこれは難問ではありません。これからの時代、たったこの十数文字だけで良いのです！[^naitei]

[^fizzbuzz]: こちらの解答は第14回のシェル芸勉強会の問題の解答になります。 https://blog.ueda.asia/?p=4413
[^naitei]: 注:この回答を使ったからといって、人事からの高評価を得られるとは限りません。

```bash:Terminal
$ cure precures
```


# `cure transform`

プリキュアを変身させるコマンドです。プリキュア変身前の女の子の名前にマッチし、標準入力の内容を全て対応するプリキュアに置換します。

```bash:Terminal
$ echo '私の名前は十六夜リコです。' | cure transform
私の名前はキュアマジカルです。
```

# `cure humanize`

`cure transform`とは逆の動作をするコマンドです。プリキュアの変身を解除します。

```bash:Terminal
$ echo "キュアマジカル & キュアミラクル" | cure humanize
十六夜リコ & 朝日奈みらい
```

## 活用例

### 整合性のあるドキュメント作成に

それなりにドキュメントを読む機会が多い方は、同じ単語が別の概念を指して使われている場面に出くわし、少なからず混乱したことがあるはずです[^messy_sentence]。プリキュア関連の文章でも、「剣崎真琴」を指しているのに、ある箇所ではなぜか「キュアソード」と言っているなど、変身前後の名称を混同して「一物一名の原則」[^ichibutsu]が崩壊している文章を見かけることがあります。

しかしながら、この`cure transform`と`cure humanize`コマンドがあればもう大丈夫です。異なった表現がされているプリキュアの名前を一旦全て正規化して、読みやすい文章の作文を支援します。Cureutilsを導入して、チーム全体のドキュメントの質の向上が可能になります[^youshutten]。

[^messy_sentence]: 例えば、「HTTPS通信」と言いたいだけなのに、ある箇所では「TLSを使って〜」と表現し、また別の箇所では「SSL通信で〜」と言っているような文章です。もしかしたら何か意図があって表記を別にしているのかどうかわからないので、一々考察が必要で、このような文章は読んでいて疲れます。後述の「一物一名の原則」を守って欲しいものです。
[^ichibutsu]: 「一つの文章の中で，一つの実体・概念にただ一つの名前をつけること」を表した原則。情報処理学会会誌2016年1月号で同会のフェローである速水氏が提唱した。 https://twitter.com/hrhym/status/678768952399368192
[^youshutten]: 要出典


```bash:Terminal
$ cat makopi.txt
剣崎真琴はアイドルでかわいい。
かわいいのはキュアソード。
キュアソードは世間知らず。

$ cat makopi.txt | cure humanize
剣崎真琴はアイドルでかわいい。
かわいいのは剣崎真琴。
剣崎真琴は世間知らず。
```

# `cure tr`

`cure tr`コマンドは`cure transform`と`cure humanize`の上位互換となるコマンドです。任意のプリキュアの情報を、別のプリキュアの情報に置換することができます。このコマンドの名称はUNIXの`tr`コマンドからきています。例えば下記は「ハートキャッチプリキュア」に登場する「花咲つぼみ」の声優を出力する実行例です。

```bash:Terminal
$ echo 花咲つぼみ | cure tr '[:human_name:]' '[:cast_name:]'
水樹奈々
```

ご存知「水樹奈々」が出てきましたね。上記のコマンドの`[:〜:]` というフォーマットは、**Bracket Expression**[^br]と呼ばれ、UNIXの`tr`や`sed`コマンドなどでよく使われるメタ表現です。例えば、下記のコマンドは小文字の英字を大文字の英字に置換するコマンドです。

```bash:Terminal
$ echo precure | tr '[:lower:]' '[:upper:]'
PRECURE
```

[^br]: Bracket ExpressionについてはGNUのサイトにまとまっています。 https://www.gnu.org/software/grep/manual/html_node/Character-Classes-and-Bracket-Expressions.html


同様に、`cure tr`コマンドでは、下記のプリキュアの情報にマッチする専用のBracket Expressionを使うことができます。作者である私は下記の表現を**Precure Bracket Expression**と呼んでいます。以降は略して**PBE**と呼びます。

| PBE                | 内容                                    |
| ---                | ----                                    |
| `[:cast_name:]`    | 声優名                                  |
| `[:color:]`        | プリキュアの色名                        |
| `[:girl_name:]`    | プリキュアを一意に割り当てるID(英名)    |
| `[:human_name:]`   | 変身前の人名                            |
| `[:precure_name:]` | 変身後のプリキュアの名前                |



`[:girl_name:]`は変身後のプリキュアの名前を英名で表したものです。また、プリキュアに一意に割り当てられるIDとしての役割を持っています。

```bash:Terminal
$ echo キュアピース | cure tr '[:precure_name:]' '[:girl_name:]'
cure_peace
```

下記のようなコマンドで、お気に入りの声優がプリキュアをやったことがあるかどうか確認してみましょう。

```bash:Terminal
$ echo '本名陽子 ゆかな 田中理恵' | cure tr '[:cast_name:]' '[:precure_name:]'
キュアブラック キュアホワイト シャイニールミナス
```

下記のように他のCureutilsのコマンドと組み合わせて、プリキュアの色一覧を表示することもできます。

```bash:Terminal
$ cure precures | cure tr '[:precure_name:]' '[:color:]'
black
white
yellow
(中略)
blue
green
white
```

## 活用例

### いろいろな「コードネーム」に好きなプリキュアの名前をつけよう

Androidの開発コードネームには、お菓子の名前が使われることは有名です[^android_dev]。同様に、プリキュアの名前をコードネームに使うのは良い活用例です。なぜなら、プリキュアの名前は、(おそらく)衝突しないように考えられているからです。また`[:girl_name]`で得られる英名は、スペース・記号を含んでいないので、このような用途にぴったりなのです。
加えて、プリキュアの名前には「作品に登場した順番」というソートできる概念があります。Androidの開発コードネームのように「あれれ？KitKatとJelly Beanどっちが先だっけ？」などと迷うことはありません。キュアエンジニアの方であれば`cure_black`と`cure_bloom`では、誰でも`cure_black`の方が古いバージョンだと直感的に分かるはずです。

#### スクラムのSprint名にする

これは実際に某開発チームで存在する[^youshutten]事例です。アジャイル開発をされている方は、開発を「スプリント」と呼ばれる特定の期間に区切っていると思います。その際に各スプリントに名前を付けるチームも多いようです。安直に「スプリント1」「スプリント2」……という名前でも良いように思えますが、チームのモチベーションを保つためにスプリント名に目標を設定する例[^sprint_name]や、愛着が持てるような名前にする例があります。実際に、名前をどうするかでスクラムマスター[^scrum_master]達は日々悩んでいるようで、スプリント名のジェネレーターがあるくらい[^spring_gen]です。

しかし、そんなスクラムマスター達の悩みも、もはや不要になりました。なにせプリキュアは2016年12月現在で少なくとも44人もいます。1スプリント2週間だとしても、一年は余裕でもちます[^num_of_sprint]。また、チームメンバー全員がCureutilsを入れておけば、チケット上のスプリント名を見つつ`$ cure precures`と打つだけで、今までいくつのスプリントを乗り越えたのかすぐさまわかります。また、チームにキュアエンジニアがいれば「あ、今週はスプリント cure_sword だし、がんばっちゃおうかな」みたいになります。メンバーの生産性を底上げできることでしょう。

[^scrum_master]: アジャイル開発においてチームを率いる役割の一つ。プロジェクトを円滑に進めるために頑張る人。
[^sprint_name]: http://www.atmarkit.co.jp/ait/articles/1203/28/news127_2.html
[^aichaku]: http://www.lysender.com/extra/sprint
[^spring_gen]: http://www.lysender.com/extra/sprint
[^num_of_sprint]: 1スプリント1週間のチームは、半年ごとにスプリント名をリセットする、あるいは薫、満、キュアタルト、ダークプリキュア、キュアフラワー、キュアアンジェ、キュアキャンディ、キュアゴリラ、キュアモフルンなどを入れて、52週間分作って下さい。また、2017年の「キラキラ☆プリキュアアラモード」で新登場するプリキュアを待つのも良い戦略でしょう。

#### 自動生成されるDockerのコンテナ名をプリキュア名にする

Dockerをよく使う方の中には、コンテナ作成時にデフォルトで割り当てられる変なコンテナ名にイライラしている方も居るんじゃないかと思います。例えば、Dockerでコンテナを作ると、こんな感じの名前が割り当てられると思います。

```bash:Terminal
$ docker ps -a | awk '{print $NF}'
NAMES
sick_dijkstra
compassionate_bardeen
elegant_roentgen
awesome_swartz
furious_euclid
nauseous_shannon
mad_austin
(中略)
```

**病気のダイクストラ(sick_dijkstra)ってなんでしょうね？全くもって訳がわかりません。**センスの悪い名前を生成しないよう、DockerとCureutilsを組み合わせた関数を作って`docker`コマンドを再開発してみましょう。まず、下記の関数を`~/.zshrc`(bashの方は`~/.bashrc`)に追加しましょう。

```bash:.zshrcの一部
docker () {
    local _cmd="$1"
    if [ "$_cmd" = "run" ]; then
        shift
        /usr/local/bin/docker $_cmd --name=$(cure girls | shuf | head -n 1 | cure tr "[:human_name:]" "[:girl_name:]") "$@"
    else
        /usr/local/bin/docker "$@"
    fi
}
```

そして、再読込をします。

```bash:Terminal
$ source ~/.zshrc
```

`docker`コマンドの挙動は基本的に変わりません。例えば、下記のようにUbuntuのコンテナも作れますし、他のコマンドも使えます[^docker_name]。ただし、`docker run`をする際は、コンテナ名をCureutilsから取得するようになります。

```bash:Terminal
$ docker-run -it ubuntu /bin/bash
```

これでいくつかコンテナを作成すると、コンテナ名がプリキュア名になっていることに気付くと思います。

```bash:Terminal
$ docker ps -a | awk '{print $NF}'
NAMES
cure_honey
cure_beat
cure_flora
cure_heart
```

こうすると、思わぬメリットがあります。例えば、共有のユーザアカウントでDockerの入ったマシンを使う場合、誰かがコンテナを作りすぎるとコンテナ一覧の参照時に使い勝手が悪いですし、ディスク容量を多く逼迫する原因にもなります。しかしこのやり方をすれば、コンテナ数が増える度にコンテナ名が衝突しやすくなり、作成するコンテナ数に制限が設けられます。

```bash:Terminal
$ docker run -it ubuntu /bin/bash
/usr/local/bin/docker: Error response from daemon: Conflict. The name "/cure_happy" is already in use by container
(中略)
```

すると作業者が「あ、そろそろ無駄なコンテナ消さないとな」となり、リソースの節約になります。巷のDevOps本ではこのようなプリキュアの名前空間の衝突を利用したリソース制限の手法を、キュアリソースリストリクションと呼びます[^usocure]。

[^docker_name]: 手元で試した限りは、`docker`の`--name`オプションも正しく動きました。複数の`--name`オプションが指定された場合は、後半のものが優先されるようです。
[^usocure]: 呼びません。
[^android_dev]: https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%89%E3%83%8D%E3%83%BC%E3%83%A0#Android


# `cure grep`

`cure grep`コマンドは標準入力から与えられた文字列の中から、プリキュアの情報を抽出できる、いわばプリキュアの情報に特化した`grep`コマンドです。例えば、下記のようなファイルがあったとします。この中に、実際には存在しないプリキュアがいます、さてどれでしょう？

```bash:Terminal
$ cat cure_tramp.txt
私はキュアハートよ!
私はキュアダイヤよ!
私はキュアエースよ!
私はキュアスペードよ!
```

こんな時も`cure grep`を使えば簡単に抽出することができます。

```bash:Terminal
$ cat cure_tramp.txt | cure grep
私はキュアハートよ!
私はキュアエースよ!
```

### 正規表現とPBEの活用

`cure grep`の第一引数に、正規表現を与えると、任意の文字列にマッチさせることができます。すなわち、通常の`grep`コマンドのように活用することが可能です。

```bash:Terminal
$ seq 15 | cure grep '..$'
10
11
12
13
14
15
```

「じゃあ通常の`grep`使えばいいじゃないか」と思う方もいるかもしれませんが、`cure grep`では、正規表現中に前述した**PBE**を使うことができます。

```bash:Terminal
$ cat cure_grep_test.txt
キュアブラックだよ！
キュアパッションよ。
キュアイーグレットです。
キュアムーンライトよ。
キュアパインです。

$ cat cure_grep_test.txt | cure grep '[:precure_name:]よ'
キュアパッションよ。
キュアムーンライトよ。
```

当然のことながら`[:precure_name:]`以外の**PBE**の表現である声優名や変身前のプリキュア名などにもマッチさせることもできます。

### `-o` オプション

通常の`grep`と同様、`-o`オプションを使うことができます。通常の動作では、特定のパターンを含んだ行全体を表示していましたが、このオプションを付けると、マッチしたパターンのみを抽出することができます。

```bash:Terminal
$ cat cure_grep_test.txt
キュアブラックだよ！
キュアパッションよ。
キュアイーグレットです。
キュアムーンライトよ。
キュアパインです。

$ cat cure_grep_test.txt | cure grep -o '[:precure_name:]'
キュアブラック
キュアパッション
キュアイーグレット
キュアムーンライト
キュアパイン
```

### `-E` オプション

あえて、PBEを使いたくないという方は、`-E`オプションを使ってみて下さい。すると、PBEを無効化し、Rubyで使われる普通の拡張正規表現を使うことができます[^eoption]。

```bash:Terminal
$ cat cure_grep_test.txt | cure grep -E '[:precure_name:]'
(何も表示されない)
```

[^eoption]: 一つアドバイスですが、こんな意味のないオプションを使うくらいであれば普通の`grep`コマンドを使った方が良いです。


## 活用例

### データ抽出

`grep`同様、あらゆるデータ抽出に活用できます。特にマッチさせる情報をプリキュアに特化させることができるのが特徴です。Cureutilsがない方は今まで下記のように、正規表現を使ってOR条件を指定しなければいけませんでした、しかし、`cure grep`を使えば、今後はそんなことをする必要はありません。これで、かなり日々の作業が楽になる方も居るんじゃないかと思います。

```bash:grep実行例
grep -E '(キュアブラック|キュアホワイト|シャイニールミナス|...(中略))'
```

### 正規表現エンジン「鬼雲」が確実に使えるgrepとして

Ruby2.0以降は[鬼雲(Onigmo)](https://github.com/k-takata/Onigmo)と呼ばれる正規表現エンジンが使われています。GNUの`grep`でもバージョンによっては鬼雲相当の正規表現が使えるようなのですが、残念ながら手元のgrep(2.14)では使えませんでした。しかしながら、Ruby製であるCureutilsが入っている環境ならそんな心配をする必要はありません。`cure grep`は確実に鬼雲の拡張正規表現が使えます。

例えば、下記は鬼雲がサポートしている漢字にのみマッチする正規表現`\p{Han}`を使って、初代プリキュアの名字のみを抜き出すシェル芸です[^onigumo]。

```bash:Terminal
!! 初代プリキュア3人
$ cure girls | head -n 3
美墨なぎさ
雪城ほのか
九条ひかり


!! 名字のみを抜き出す！
$ cure girls | head -n 3 | cure grep -o '\p{Han}{2}'
美墨
雪城
九条
```

もちろん「部分式呼び出し[^bubun]」も使えます。下記は、回文のみを抽出する例です。

```bash:Terminal
$ cat kaibun.txt
たけやぶやけた
たけやぶやけない
キュアップ・ラパパ
トマト
トメィトゥ

$ cat kaibun.txt| cure grep '^((.)(?:\g<1>|.?)\k<2+0>)$'
たけやぶやけた
トマト
```

[^bubun]: http://d.hatena.ne.jp/atzy/20080910/p1
[^onigumo]: 鬼雲の正規表現に関しては http://qiita.com/scivola/items/358b6b81d893c045129b を参考にさせていただきました。


# `cure echo`

`cure echo`コマンドを使うと、標準出力に「キュアエコー[^cure_echo]」の変身の口上を出力することができます。表示される時は、一行表示されるごとにsleepがかかり、少しずつ表示されます。

```bash:Terminal
$ cure echo
みんなの思いを守るために
心をひとつに！
思いよ届け！キュアエコー！
```

このコマンドには、他にも下記のようなコマンドラインオプションがあります。

| オプション         | 説明                                                                            |
| ----------         | ----                                                                            |
| `-a`               | 攻撃時の口上も表示。                                                            |
| `-q`               | メッセージをsleepなしで即座に表示する。                                         |
| `-p` `<girl_name>` | キュアエコーの代わりに、与えられたgirl_nameのプリキュアのメッセージを表示する。 |


例えば、下記のコマンドで、キュアメロディーの攻撃時の口上をsleepをかけずにすぐさま表示できます。

```bash:Terminal
$ cure echo -a -q -p cure_melody
レッツプレイ！プリキュアモジュレーション！！
爪弾くは荒ぶる調べ！ キュアメロディ！
届け4人の組曲！スイートプリキュア！
おいで、ミリー！
翔けめぐれ、トーンのリング！
プリキュア！ミュージックロンド！
三拍子！１、２、３
フィナーレ！
```

`girl_name`一覧を覚えるのが面倒くさい方は、zshの補完機能で`-p`オプションを補完できるので、おすすめです。

[^cure_echo]: 映画『プリキュアオールスターズNewStage』で初登場したプリキュア。坂上あゆみという女の子が変身するプリキュア。かわいい。

## 活用例

### テストデータの作成

個人情報だけでなく、適当な短文をテストデータとして活用したいという方もよくいると思います。プリキュアの変身の口上は、おおよそ100文字以内に収まります。大変ちょうどよい長さであり、気軽に使えます。また、短すぎると感じるならば`-a`オプションで攻撃時の口上も追加でき、要求されるデータの長さに対応する柔軟さがあります。

### 一般ユーザからrootユーザに昇格したときに気を引き締めてオペミス予防

下記のように「rootユーザに昇格できるユーザ」のログイン時に実行されるシェルスクリプトのファイル、例えば`~/.zshrc`や`~/.bashrc`などを、下記のように編集して`cure echo`コマンドを記載してみましょう。[^forroot]

```bash:Terminal
$ echo '[ "$USER" = "root" ] && cure echo >&2' >> /home/user/.zshrc
```

すると、そのユーザがrootユーザに昇格した瞬間、少しずつキュアエコーの変身の口上が流れ始めます。ごらんください、**普通の女の子がプリキュアになるかのように、一般ユーザが大きな力を持ったrootにミラクルマジカルジュエリーレする瞬間です。**

```bash:Terminal
user@remote ~ $ sudo -s
[sudo] password for user:
みんなの思いを守るために
心をひとつに！
思いよ届け！キュアエコー！
```

皆さんは、どのような状況でrootになりますか？特に仕事関係の場合は発汗するくらい緊張する場面も多いと思います。手を動かしたい気持ちを一旦なだめて、プリキュアの変身の口上を眺めながら落ち着いて深呼吸をしましょう。冷静になることが、オペミス予防ではとても大切です。

なお、`.zshrc`ファイルに追加した内容は、下記の一行です。一般ユーザからrootに昇格する際はそのユーザの`.zshrc`が再度読まれるようです。そこで、`$USER`変数が`root`になった時のみ、特定のコマンドを実行するようにしています。そして標準エラー出力にメッセージを出します[^scperror]。

```bash:変更内容
[ "$USER" = "root" ] && cure echo >&2
```

ここの箇所は、`-p`オプションを使ってお好みのプリキュアにすると良いと思います。あるいは、ランダムにしても楽しいかもしれませんね。

[^forroot]: なお、rootでそのままログインするというワイルドな方は`/root/.bashrc`などに直接変更を加えて下さい。
[^scperror]: ちなみに、出力を `>&2` で標準エラー出力に出しているのは、`.bashrc`で標準出力をするとscpでエラーが発生するからです。 http://d.hatena.ne.jp/kanonji/20120625/1340602002

# `cure date`

`date`コマンドというUNIXのコマンドがあると思いますが、Cureutilsにも`cure date`コマンドがあります。`date`コマンドと同じような動作をするコマンドですが、年月日だけでなく、下記のようなプリキュア関連の情報も表示できる特徴があります。

  * 特定の期間に放映中のプリキュア
  * 初回・最終回放映日
  * プリキュアの誕生日
  * 映画の公開日など

そのまま実行すると、現在時刻の情報を表示してくれます。

```bash:Terminal
$ cure date
2016-12-11 19:47:16 魔法つかいプリキュア！放映期間
```

`cure date`は`date`コマンド同様に、下記のようなフォーマットで実行できます。

```bash:Terminal
$ cure date [OPTIONS] [+FORMAT]
```

### 日付の指定
`-d` オプションが用意されており、特定の日付の情報を表示できます。

```bash:Terminal
$ cure date -d '1 years ago'
2015-12-11 21:26:56 Go!プリンセスプリキュア放映期間
```

`YYYY-MM-DD`の日付のフォーマットを与える事もできます。

```bash:Terminal
$ cure date -d '2015-02-22'
2015-02-22 00:00:00 映画公開日/Go!プリンセスプリキュア放映期間
```

### 出力フォーマットの指定

`+`に続いて下記のようなメタ文字を記載することで、出力する日付のフォーマットを指定することも可能です。代表的なのものは以下のフォーマットですが、`date`コマンドとほぼ同じ他のメタ文字も使えます[^date_meta]。ただし、`@P`という文字列を与えると、その箇所が「プリキュア関連のイベント」となります。

[^date_meta]: 使えるメタ文字についてはこちらのページを御覧ください。 http://www.rubylife.jp/ini/date_class/index5.html

| Format specifier | Description              |
| ---------------- | -----------              |
| %Y               | 年(例: 2016)             |
| %m               | 月(例: 12)               |
| %d               | 日(例: 31)               |
| @P               | プリキュア関連のイベント |

下記は、日付指定 & 出力フォーマットの例です。

```bash:Terminal
$ cure date -d '2016-11-12' +'%Y年%m月%d日は @P の日！'
2016年11月12日は 十六夜リコ(キュアマジカル)誕生日/魔法つかいプリキュア！放映期間 の日！
```

これは直近のプリキュア関連のイベントを調べる例です。

```bash:Terminal
$ seq 365 | xargs -I{} cure date -d '{} days later' +'%F @P'
2016-12-12
2016-12-13
2016-12-14
2016-12-15 紅城トワ(キュアスカーレット)誕生日
2016-12-16
2016-12-17
2016-12-18
2016-12-19
```

## 活用例

### `date` コマンドの補助として

通常の`date`コマンドと違って`YYYY-mm-dd HH:MM:SS`形式でデフォルトで出力してくれるのが地味にありがたいです。また、当然のことながら通常の`date`コマンドにはプリキュア関連のイベントを出力する機能がありません。プリキュア関連の情報と日付を紐付けたいというとき、今までは「日付 + プリキュア」で検索をしていた方も多かったと思いますが、このコマンドさえあればその必要もありません。

### カレンダーとして使える

仕事の始まりに端末を開いて毎日カレンダーとして実行しましょう。もしも自分が推しているプリキュアの誕生日だったらどうでしょう？「お、今日はなぎさちゃんの誕生日か……効率的に働いて早く帰るか……」となることでしょう。

# `cure janken` [^janken]

端末を開いていると、唐突に息抜きをしたくなりませんか？そんな時にオススメなのが`cure janken`コマンドです。このコマンドを実行すると、「ぴかりんジャンケン[^about_janken]」が始まります。

```bash:Terminal
$ cure janken
ピカピカピカリン
ジャンケンポン！
1...グー, 2...チョキ, 3...パー : 2

あなた: チョキ
キュアピース: パー

[結果]
あなたのかち
```

実行語、標準入力を受け付けるので、1から3までの数字を入力して下さい。すると、ジャンケンの結果が出ます。なお、ジャンケンの結果によって、コマンドの終了ステータスが下記のように変化します。

| 結果         | 終了ステータス |
| -------      | -----------    |
| あなたの勝ち | 0              |
| あなたの負け | 1              |
| 引き分け     | 2              |

なお、相手（キュアピース）は確率で最強の手である「グッチョッパー」を出してきます。その時は100%あなたの負けです。


## 活用例

### 公平な作業分担に

**「最初にじゃんけんで勝った人がリリース作業しましょうよ。」** と言ってスクリプトを実行してみましょう。Zsh (Bash) の `&&` という演算子で、終了ステータスによってそのあとに来るコマンドの実行を制御できます。

```bash:Terminal
$ cure janken && sh script.sh
```

# 作ってみた所感
Ruby製コマンドラインツール「Cureutils」についてまとめました。この記事を読んでみて「あ、意外に使えるかも！」と思った機能も見つかったのではないでしょうか？このツールの作成にはRubicureの他に、CLIツールの作成を支援するthorというgemも使ったのですが、大変便利で、コードがスッキリと書けて良かったです。機会があれば、そちらの使い方に関しても記事を書いてみたいなと思いました。

ところで、この記事の前半にいくつかの便利ツールを紹介しましたが、このようなツールの中には「自分は一体何をしたいのかな？」あるいは「世の中に同じようなことで困っている人は居ないかな？」という考えを持っていたからこそ発見できたものも少なくないです。自分のやりたいことを検索してみると、意外と自分のニーズに合ったコマンドを誰かが作っているものです。そうやって自分の使える武器を増やしていく活動は楽しいものです。そして、Cureutilsも誰かの武器になるツールの一つになればうれしいなと思います[^tekitou2]。

[^about_janken]: 「スマイルプリキュア」の「キュアピース」が変身時にするじゃんけんのこと。毎週どんな手がでるのかわからないので、楽しみにしていた視聴者も少なくない。数多くの視聴者が、日曜日の朝のキュアピースでじゃんけんし、日曜の夜のサザエさんで再度ジャンケンをする日々を送った。キュアピースかわいい。https://www.youtube.com/watch?v=1Q7Q5P-Gaos

[^janken]: このコマンド、最初は実装するつもりはなかったのですが、依存しているgemであるRubicureにぴかりんジャンケンをする機能があり、せっかくなので使ってみました。当然、Rubicureにあるぴかりんジャンケン用のメソッドを利用しています。

[^tekitou2]: 適当に上手く〆る台詞を考えてみました。