ADVENTERのプリキュア Advent Calendar 2016の13日目の記事です。
日々の作業を便利にする *utils を活用しよう
端末上の対話シェルで作業をすることが多い方は、最初からインストールされているコマンドだけでなく、新たにコマンドをインストールして使う方が多いと思います。
例えば、OSXをお使いの方で、coreutilsという、GNUの標準コマンドが含まれたツール集をインストールする方をよく見ます。便利なので、よく私もお世話になっています1。
他にも、似た名前の moreutils というツール集もあります。coreutilsと違い、少し複雑な動作や機能を提供してくれるようなものが含まれます2。これも、使いこなすと日々の仕事を楽にできそうです。ちなみに私は、よくsponge
コマンドにお世話になることが多いです。
また最近では、dateutils というツール集を使う方も見かけるようになりました。特に私はシェル芸3を生業にしている方と交流する機会が多く、シェル芸人4の方がこれをたまに使っています5。連続した日付を作れたり、日付のリストをソートできたりと、これもなかなか便利そうです。
世の中にはこのような「ほにゃららutils」だけでなく、他にもいろいろな便利なツール集が存在します。例えば、大きなデータの集計作業をよくする方は、数値の統計用のツール集をインストールすると楽ができるかもしれません6し、ファイルを簡単なDBみたいに使うことが多い方は、それ用のツール集は探せばいくつかあるので、試してみると良いかもしれませんね7。
Cureutilsとは?
端末にいろいろなツールを入れて、多くの作業を楽にしている方であってもやはり「なかなか痒い所に手が届かないなあ」という感覚は無くなりません。というのも、プリキュア8のような、特定のジャンルに関する情報資源の扱いには、汎用的なコマンドだけでは対処が面倒だからです。
例えば
「grepでプリキュアだけをマッチさせたいな。」
と思ったり
「顧客情報にキュアピンクなんて名前があるけど、そんなプリキュアいたっけ?これは偽物では?」
と思ったり
「個人情報のテストデータに適当な名前を入れたい!そうだ、プリキュアの名前を入れよう!あ、でも変身前の名前わからない。」
と思ったり
「あれ?今ってプリキュア全員で何人だっけ?」
と思ったり
「キュアホワイトの声優ってなんて名前だっけ?」
と思ったり
「娘と思い出話をしたいなあ……。あれ、娘が3歳の時やってたプリキュアって何だっけ?」
と思ったり
「あーあ、ぴかりんジャンケンがしたいなあ。」
と思うなど、
フラストレーションの溜まっている方も多いのではないでしょうか?エンジニアの方々、その中でも特にキュアエンジニア9の方々は、何かとプリキュアの関連情報の取扱いが必要になる場面があると思います。事実、そのようなニーズに応えるためにRubyのプリキュア実装であるRubicure10をはじめ、PerlやPython、JSなど、主要な言語の多くにプリキュアの実装が存在します11。しかしながら、一旦保守性を考えずにサクッと作業を終わらせたい状況であれば、特定の言語に依存した実装ではなく、シェル上で実行できるコマンドが機能を提供するのが一番だと私は考えています。
そこで私は、シェル上でフレキシブルかつカジュアルかつプリティにプリキュア関連情報を扱うことができるツールであるCureutils 【きゅあゆーてぃるず】(※ coreutils ではない) を2016年6月12にリリースしました。
Github: https://github.com/greymd/cureutils
それまでは、対話シェル上でのプリキュア関連情報の取り扱いは、あまり手軽ではありませんでしたが、このツールの登場により、一層手軽になったため、多くの反響を頂いています13。
環境
Linux Mint 17 Qiana (おおよそ Ubuntu 14.04)
zshで試してますが、多分bashでも動きます。
$ cat /etc/issue.net
Linux Mint 17 Qiana
$ zsh --version
zsh 5.0.2 (x86_64-pc-linux-gnu)
インストール方法
$ sudo gem install cureutils
インストールにはRuby 2.0.0以上とそのRubyに対応したgem
コマンドが必要です(Ruby2.2.0以下の方は違うgemも必要です14)。インストールするとcure
コマンドが使えるようになります。まずはcure help
で使い方を表示してみましょう。なお、今回の記事では、つい最近リリースされたCureutils v0.2.0を利用します。そのため、過去のCureutilsを入れたままの方も、再度上記のコマンドでアップデートしてみて下さい。
$ 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
コマンドにスペースを挟んでサブコマンドを入力することで、プリキュア関連情報の取り扱いを便利にするコマンドが使えます。
$ cure version
Cureutils 0.2.0
インストール方法(コマンド補完)
cure
コマンドには多くのサブコマンドとコマンドラインオプションがあります。Cureutilsを使う上で、必須というわけではありませんが、Zshを使っている方にはコマンドの入力補完スクリプトのインストールをおすすめします。zplugをお使いの方は、下記の一行で導入ができます15。
zplug "greymd/cureutils", use:cureutils.plugin.zsh
cure precures
さて、ではここからサブコマンドの説明をしていきます。まず最初にcure precures
というコマンドがあります。このコマンドを使うことで、プリキュアの名前を全員16標準出力に出力します。
$ cure precures
キュアブラック
キュアホワイト
シャイニールミナス
キュアブルーム
キュアイーグレット
キュアブライト
キュアウィンディ
キュアドリーム
キュアルージュ
キュアレモネード
(中略)
Cureutils v0.2.0ではTV版のメインヒロイン合計44人を表示します。ただし、劇場版のプリキュアであるキュアエコーも表示したい方は、-m
(あるいは--movie
)オプションを使うことで、表示することができます。
$ cure precures -m
キュアブラック
キュアホワイト
シャイニールミナス
(中略)
キュアミラクル
キュアマジカル
キュアフェリーチェ
キュアエコー
cure girls
cure girls
コマンドを使うことで、プリキュアに変身する女の子の名前を全員16出力します。
$ cure girls
美墨なぎさ
雪城ほのか
九条ひかり
日向咲
美翔舞
夢原のぞみ
夏木りん
(中略)
こちらも同様に、-m
オプションでキュアエコー(坂上あゆみ)の表示ができます。また、キュアプリンセスこと「白雪ひめ」は、御存知の通り正式名称は「ヒメルダ・ウインドウ・キュアクイーン・オブ・ザ・ブルースカイ」と呼びます。-v
(あるいは--verbose
)オプションを付けることでそれも表示することもできます。
$ cure girls -v
(中略)
愛乃めぐみ
白雪ひめ(ヒメルダ・ウインドウ・キュアクイーン・オブ・ザ・ブルースカイ)
大森ゆうこ
(中略)
これらのプリキュアの情報は、依存するgemの一つであるRubicureから取得しています。そのため、Rubicureが最新である限りは、最新の情報を取得できるはずです。
活用例
テスト用ダミーデータ作成に。
個人情報を取り扱うアプリケーションを作っている方は、テスト用のデータとしてダミーデータを用意することがよくあると思います。そのためのコマンドも、世の中にはいくつもあります17。しかしながら、プリキュアの名前をダミーデータとして活用することで、後述するcure grep
やcure tr
などと連携させ、特定のダミーデータを簡単に検索したり、他の対応するダミーデータへの変換が可能になります。つまり、より保守性の高いダミーデータの作成が可能になります18。
採用面接対策に
IT系の採用面接では、簡単なプログラムを書かせて、採用する技術者のレベルをざっくり推し量ることがよくされます。採用担当の人事の方から、下記のような質問を受け、ホワイトボードでコードを書かされたという方もいるのではないでしょうか?
- 「ちょっと100までのFizzBuzzだしてみて?」
- 「ちょっと100までの素数だしてみて?」
- 「ちょっとプリキュア全員の名前列挙してみて?」
しかし、これからは心配ありません。特にシェル芸を極めた方ならば、例えば1のFizzBuzzは下記のコマンド19で30秒で瞬殺できますし、
$ seq 100 | sed '5~5s/.*/Buzz/' | sed '3~3s/[0-9]*/Fizz/'
2の素数の問題も瞬殺できます。
$ seq 2 100 | factor | awk '$0*=!$3'
3の問題は、今まで定型化が難しく、採用面接では好まれて使われていたようで20、私も過去にQiitaでこの問題に対する解答をWebスクレイピングでまとめたことがありました。しかし、もはやこれは難問ではありません。これからの時代、たったこの十数文字だけで良いのです!21
$ cure precures
cure transform
プリキュアを変身させるコマンドです。プリキュア変身前の女の子の名前にマッチし、標準入力の内容を全て対応するプリキュアに置換します。
$ echo '私の名前は十六夜リコです。' | cure transform
私の名前はキュアマジカルです。
cure humanize
cure transform
とは逆の動作をするコマンドです。プリキュアの変身を解除します。
$ echo "キュアマジカル & キュアミラクル" | cure humanize
十六夜リコ & 朝日奈みらい
活用例
整合性のあるドキュメント作成に
それなりにドキュメントを読む機会が多い方は、同じ単語が別の概念を指して使われている場面に出くわし、少なからず混乱したことがあるはずです22。プリキュア関連の文章でも、「剣崎真琴」を指しているのに、ある箇所ではなぜか「キュアソード」と言っているなど、変身前後の名称を混同して「一物一名の原則」23が崩壊している文章を見かけることがあります。
しかしながら、このcure transform
とcure humanize
コマンドがあればもう大丈夫です。異なった表現がされているプリキュアの名前を一旦全て正規化して、読みやすい文章の作文を支援します。Cureutilsを導入して、チーム全体のドキュメントの質の向上が可能になります20。
$ cat makopi.txt
剣崎真琴はアイドルでかわいい。
かわいいのはキュアソード。
キュアソードは世間知らず。
$ cat makopi.txt | cure humanize
剣崎真琴はアイドルでかわいい。
かわいいのは剣崎真琴。
剣崎真琴は世間知らず。
cure tr
cure tr
コマンドはcure transform
とcure humanize
の上位互換となるコマンドです。任意のプリキュアの情報を、別のプリキュアの情報に置換することができます。このコマンドの名称はUNIXのtr
コマンドからきています。例えば下記は「ハートキャッチプリキュア」に登場する「花咲つぼみ」の声優を出力する実行例です。
$ echo 花咲つぼみ | cure tr '[:human_name:]' '[:cast_name:]'
水樹奈々
ご存知「水樹奈々」が出てきましたね。上記のコマンドの[:〜:]
というフォーマットは、Bracket Expression24と呼ばれ、UNIXのtr
やsed
コマンドなどでよく使われるメタ表現です。例えば、下記のコマンドは小文字の英字を大文字の英字に置換するコマンドです。
$ echo precure | tr '[:lower:]' '[:upper:]'
PRECURE
同様に、cure tr
コマンドでは、下記のプリキュアの情報にマッチする専用のBracket Expressionを使うことができます。作者である私は下記の表現をPrecure Bracket Expressionと呼んでいます。以降は略してPBEと呼びます。
PBE | 内容 |
---|---|
[:cast_name:] |
声優名 |
[:color:] |
プリキュアの色名 |
[:girl_name:] |
プリキュアを一意に割り当てるID(英名) |
[:human_name:] |
変身前の人名 |
[:precure_name:] |
変身後のプリキュアの名前 |
[:girl_name:]
は変身後のプリキュアの名前を英名で表したものです。また、プリキュアに一意に割り当てられるIDとしての役割を持っています。
$ echo キュアピース | cure tr '[:precure_name:]' '[:girl_name:]'
cure_peace
下記のようなコマンドで、お気に入りの声優がプリキュアをやったことがあるかどうか確認してみましょう。
$ echo '本名陽子 ゆかな 田中理恵' | cure tr '[:cast_name:]' '[:precure_name:]'
キュアブラック キュアホワイト シャイニールミナス
下記のように他のCureutilsのコマンドと組み合わせて、プリキュアの色一覧を表示することもできます。
$ cure precures | cure tr '[:precure_name:]' '[:color:]'
black
white
yellow
(中略)
blue
green
white
活用例
いろいろな「コードネーム」に好きなプリキュアの名前をつけよう
Androidの開発コードネームには、お菓子の名前が使われることは有名です25。同様に、プリキュアの名前をコードネームに使うのは良い活用例です。なぜなら、プリキュアの名前は、(おそらく)衝突しないように考えられているからです。また[:girl_name]
で得られる英名は、スペース・記号を含んでいないので、このような用途にぴったりなのです。
加えて、プリキュアの名前には「作品に登場した順番」というソートできる概念があります。Androidの開発コードネームのように「あれれ?KitKatとJelly Beanどっちが先だっけ?」などと迷うことはありません。キュアエンジニアの方であればcure_black
とcure_bloom
では、誰でもcure_black
の方が古いバージョンだと直感的に分かるはずです。
スクラムのSprint名にする
これは実際に某開発チームで存在する20事例です。アジャイル開発をされている方は、開発を「スプリント」と呼ばれる特定の期間に区切っていると思います。その際に各スプリントに名前を付けるチームも多いようです。安直に「スプリント1」「スプリント2」……という名前でも良いように思えますが、チームのモチベーションを保つためにスプリント名に目標を設定する例26や、愛着が持てるような名前にする例があります。実際に、名前をどうするかでスクラムマスター27達は日々悩んでいるようで、スプリント名のジェネレーターがあるくらい28です。
しかし、そんなスクラムマスター達の悩みも、もはや不要になりました。なにせプリキュアは2016年12月現在で少なくとも44人もいます。1スプリント2週間だとしても、一年は余裕でもちます29。また、チームメンバー全員がCureutilsを入れておけば、チケット上のスプリント名を見つつ$ cure precures
と打つだけで、今までいくつのスプリントを乗り越えたのかすぐさまわかります。また、チームにキュアエンジニアがいれば「あ、今週はスプリント cure_sword だし、がんばっちゃおうかな」みたいになります。メンバーの生産性を底上げできることでしょう。
自動生成されるDockerのコンテナ名をプリキュア名にする
Dockerをよく使う方の中には、コンテナ作成時にデフォルトで割り当てられる変なコンテナ名にイライラしている方も居るんじゃないかと思います。例えば、Dockerでコンテナを作ると、こんな感じの名前が割り当てられると思います。
$ 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
)に追加しましょう。
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
}
そして、再読込をします。
$ source ~/.zshrc
docker
コマンドの挙動は基本的に変わりません。例えば、下記のようにUbuntuのコンテナも作れますし、他のコマンドも使えます30。ただし、docker run
をする際は、コンテナ名をCureutilsから取得するようになります。
$ docker-run -it ubuntu /bin/bash
これでいくつかコンテナを作成すると、コンテナ名がプリキュア名になっていることに気付くと思います。
$ docker ps -a | awk '{print $NF}'
NAMES
cure_honey
cure_beat
cure_flora
cure_heart
こうすると、思わぬメリットがあります。例えば、共有のユーザアカウントでDockerの入ったマシンを使う場合、誰かがコンテナを作りすぎるとコンテナ一覧の参照時に使い勝手が悪いですし、ディスク容量を多く逼迫する原因にもなります。しかしこのやり方をすれば、コンテナ数が増える度にコンテナ名が衝突しやすくなり、作成するコンテナ数に制限が設けられます。
$ 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本ではこのようなプリキュアの名前空間の衝突を利用したリソース制限の手法を、キュアリソースリストリクションと呼びます31。
cure grep
cure grep
コマンドは標準入力から与えられた文字列の中から、プリキュアの情報を抽出できる、いわばプリキュアの情報に特化したgrep
コマンドです。例えば、下記のようなファイルがあったとします。この中に、実際には存在しないプリキュアがいます、さてどれでしょう?
$ cat cure_tramp.txt
私はキュアハートよ!
私はキュアダイヤよ!
私はキュアエースよ!
私はキュアスペードよ!
こんな時もcure grep
を使えば簡単に抽出することができます。
$ cat cure_tramp.txt | cure grep
私はキュアハートよ!
私はキュアエースよ!
正規表現とPBEの活用
cure grep
の第一引数に、正規表現を与えると、任意の文字列にマッチさせることができます。すなわち、通常のgrep
コマンドのように活用することが可能です。
$ seq 15 | cure grep '..$'
10
11
12
13
14
15
「じゃあ通常のgrep
使えばいいじゃないか」と思う方もいるかもしれませんが、cure grep
では、正規表現中に前述したPBEを使うことができます。
$ cat cure_grep_test.txt
キュアブラックだよ!
キュアパッションよ。
キュアイーグレットです。
キュアムーンライトよ。
キュアパインです。
$ cat cure_grep_test.txt | cure grep '[:precure_name:]よ'
キュアパッションよ。
キュアムーンライトよ。
当然のことながら[:precure_name:]
以外のPBEの表現である声優名や変身前のプリキュア名などにもマッチさせることもできます。
-o
オプション
通常のgrep
と同様、-o
オプションを使うことができます。通常の動作では、特定のパターンを含んだ行全体を表示していましたが、このオプションを付けると、マッチしたパターンのみを抽出することができます。
$ cat cure_grep_test.txt
キュアブラックだよ!
キュアパッションよ。
キュアイーグレットです。
キュアムーンライトよ。
キュアパインです。
$ cat cure_grep_test.txt | cure grep -o '[:precure_name:]'
キュアブラック
キュアパッション
キュアイーグレット
キュアムーンライト
キュアパイン
-E
オプション
あえて、PBEを使いたくないという方は、-E
オプションを使ってみて下さい。すると、PBEを無効化し、Rubyで使われる普通の拡張正規表現を使うことができます32。
$ cat cure_grep_test.txt | cure grep -E '[:precure_name:]'
(何も表示されない)
活用例
データ抽出
grep
同様、あらゆるデータ抽出に活用できます。特にマッチさせる情報をプリキュアに特化させることができるのが特徴です。Cureutilsがない方は今まで下記のように、正規表現を使ってOR条件を指定しなければいけませんでした、しかし、cure grep
を使えば、今後はそんなことをする必要はありません。これで、かなり日々の作業が楽になる方も居るんじゃないかと思います。
grep -E '(キュアブラック|キュアホワイト|シャイニールミナス|...(中略))'
正規表現エンジン「鬼雲」が確実に使えるgrepとして
Ruby2.0以降は鬼雲(Onigmo)と呼ばれる正規表現エンジンが使われています。GNUのgrep
でもバージョンによっては鬼雲相当の正規表現が使えるようなのですが、残念ながら手元のgrep(2.14)では使えませんでした。しかしながら、Ruby製であるCureutilsが入っている環境ならそんな心配をする必要はありません。cure grep
は確実に鬼雲の拡張正規表現が使えます。
例えば、下記は鬼雲がサポートしている漢字にのみマッチする正規表現\p{Han}
を使って、初代プリキュアの名字のみを抜き出すシェル芸です33。
!! 初代プリキュア3人
$ cure girls | head -n 3
美墨なぎさ
雪城ほのか
九条ひかり
!! 名字のみを抜き出す!
$ cure girls | head -n 3 | cure grep -o '\p{Han}{2}'
美墨
雪城
九条
もちろん「部分式呼び出し34」も使えます。下記は、回文のみを抽出する例です。
$ cat kaibun.txt
たけやぶやけた
たけやぶやけない
キュアップ・ラパパ
トマト
トメィトゥ
$ cat kaibun.txt| cure grep '^((.)(?:\g<1>|.?)\k<2+0>)$'
たけやぶやけた
トマト
cure echo
cure echo
コマンドを使うと、標準出力に「キュアエコー35」の変身の口上を出力することができます。表示される時は、一行表示されるごとにsleepがかかり、少しずつ表示されます。
$ cure echo
みんなの思いを守るために
心をひとつに!
思いよ届け!キュアエコー!
このコマンドには、他にも下記のようなコマンドラインオプションがあります。
オプション | 説明 |
---|---|
-a |
攻撃時の口上も表示。 |
-q |
メッセージをsleepなしで即座に表示する。 |
-p <girl_name>
|
キュアエコーの代わりに、与えられたgirl_nameのプリキュアのメッセージを表示する。 |
例えば、下記のコマンドで、キュアメロディーの攻撃時の口上をsleepをかけずにすぐさま表示できます。
$ cure echo -a -q -p cure_melody
レッツプレイ!プリキュアモジュレーション!!
爪弾くは荒ぶる調べ! キュアメロディ!
届け4人の組曲!スイートプリキュア!
おいで、ミリー!
翔けめぐれ、トーンのリング!
プリキュア!ミュージックロンド!
三拍子!1、2、3
フィナーレ!
girl_name
一覧を覚えるのが面倒くさい方は、zshの補完機能で-p
オプションを補完できるので、おすすめです。
活用例
テストデータの作成
個人情報だけでなく、適当な短文をテストデータとして活用したいという方もよくいると思います。プリキュアの変身の口上は、おおよそ100文字以内に収まります。大変ちょうどよい長さであり、気軽に使えます。また、短すぎると感じるならば-a
オプションで攻撃時の口上も追加でき、要求されるデータの長さに対応する柔軟さがあります。
一般ユーザからrootユーザに昇格したときに気を引き締めてオペミス予防
下記のように「rootユーザに昇格できるユーザ」のログイン時に実行されるシェルスクリプトのファイル、例えば~/.zshrc
や~/.bashrc
などを、下記のように編集してcure echo
コマンドを記載してみましょう。36
$ echo '[ "$USER" = "root" ] && cure echo >&2' >> /home/user/.zshrc
すると、そのユーザがrootユーザに昇格した瞬間、少しずつキュアエコーの変身の口上が流れ始めます。ごらんください、普通の女の子がプリキュアになるかのように、一般ユーザが大きな力を持ったrootにミラクルマジカルジュエリーレする瞬間です。
user@remote ~ $ sudo -s
[sudo] password for user:
みんなの思いを守るために
心をひとつに!
思いよ届け!キュアエコー!
皆さんは、どのような状況でrootになりますか?特に仕事関係の場合は発汗するくらい緊張する場面も多いと思います。手を動かしたい気持ちを一旦なだめて、プリキュアの変身の口上を眺めながら落ち着いて深呼吸をしましょう。冷静になることが、オペミス予防ではとても大切です。
なお、.zshrc
ファイルに追加した内容は、下記の一行です。一般ユーザからrootに昇格する際はそのユーザの.zshrc
が再度読まれるようです。そこで、$USER
変数がroot
になった時のみ、特定のコマンドを実行するようにしています。そして標準エラー出力にメッセージを出します37。
[ "$USER" = "root" ] && cure echo >&2
ここの箇所は、-p
オプションを使ってお好みのプリキュアにすると良いと思います。あるいは、ランダムにしても楽しいかもしれませんね。
cure date
date
コマンドというUNIXのコマンドがあると思いますが、Cureutilsにもcure date
コマンドがあります。date
コマンドと同じような動作をするコマンドですが、年月日だけでなく、下記のようなプリキュア関連の情報も表示できる特徴があります。
- 特定の期間に放映中のプリキュア
- 初回・最終回放映日
- プリキュアの誕生日
- 映画の公開日など
そのまま実行すると、現在時刻の情報を表示してくれます。
$ cure date
2016-12-11 19:47:16 魔法つかいプリキュア!放映期間
cure date
はdate
コマンド同様に、下記のようなフォーマットで実行できます。
$ cure date [OPTIONS] [+FORMAT]
日付の指定
-d
オプションが用意されており、特定の日付の情報を表示できます。
$ cure date -d '1 years ago'
2015-12-11 21:26:56 Go!プリンセスプリキュア放映期間
YYYY-MM-DD
の日付のフォーマットを与える事もできます。
$ cure date -d '2015-02-22'
2015-02-22 00:00:00 映画公開日/Go!プリンセスプリキュア放映期間
出力フォーマットの指定
+
に続いて下記のようなメタ文字を記載することで、出力する日付のフォーマットを指定することも可能です。代表的なのものは以下のフォーマットですが、date
コマンドとほぼ同じ他のメタ文字も使えます38。ただし、@P
という文字列を与えると、その箇所が「プリキュア関連のイベント」となります。
Format specifier | Description |
---|---|
%Y | 年(例: 2016) |
%m | 月(例: 12) |
%d | 日(例: 31) |
@P | プリキュア関連のイベント |
下記は、日付指定 & 出力フォーマットの例です。
$ cure date -d '2016-11-12' +'%Y年%m月%d日は @P の日!'
2016年11月12日は 十六夜リコ(キュアマジカル)誕生日/魔法つかいプリキュア!放映期間 の日!
これは直近のプリキュア関連のイベントを調べる例です。
$ 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
39
端末を開いていると、唐突に息抜きをしたくなりませんか?そんな時にオススメなのがcure janken
コマンドです。このコマンドを実行すると、「ぴかりんジャンケン40」が始まります。
$ cure janken
ピカピカピカリン
ジャンケンポン!
1...グー, 2...チョキ, 3...パー : 2
あなた: チョキ
キュアピース: パー
[結果]
あなたのかち
実行語、標準入力を受け付けるので、1から3までの数字を入力して下さい。すると、ジャンケンの結果が出ます。なお、ジャンケンの結果によって、コマンドの終了ステータスが下記のように変化します。
結果 | 終了ステータス |
---|---|
あなたの勝ち | 0 |
あなたの負け | 1 |
引き分け | 2 |
なお、相手(キュアピース)は確率で最強の手である「グッチョッパー」を出してきます。その時は100%あなたの負けです。
活用例
公平な作業分担に
「最初にじゃんけんで勝った人がリリース作業しましょうよ。」 と言ってスクリプトを実行してみましょう。Zsh (Bash) の &&
という演算子で、終了ステータスによってそのあとに来るコマンドの実行を制御できます。
$ cure janken && sh script.sh
作ってみた所感
Ruby製コマンドラインツール「Cureutils」についてまとめました。この記事を読んでみて「あ、意外に使えるかも!」と思った機能も見つかったのではないでしょうか?このツールの作成にはRubicureの他に、CLIツールの作成を支援するthorというgemも使ったのですが、大変便利で、コードがスッキリと書けて良かったです。機会があれば、そちらの使い方に関しても記事を書いてみたいなと思いました。
ところで、この記事の前半にいくつかの便利ツールを紹介しましたが、このようなツールの中には「自分は一体何をしたいのかな?」あるいは「世の中に同じようなことで困っている人は居ないかな?」という考えを持っていたからこそ発見できたものも少なくないです。自分のやりたいことを検索してみると、意外と自分のニーズに合ったコマンドを誰かが作っているものです。そうやって自分の使える武器を増やしていく活動は楽しいものです。そして、Cureutilsも誰かの武器になるツールの一つになればうれしいなと思います41。
-
coreutilsに含まれるGNU版の
grep
は、Perlの柔軟な正規表現でマッチができるので私はビルドインのgrep
ではなくこちらのgrep
を使っています。 ↩ -
こちらは、Qiitaによくまとめられている方がいました。 http://qiita.com/cuzic/items/1837cfe6572cbd3f09c2 ↩
-
マウスも使わず、ソースコードも残さず、GUIツールを立ち上げる間もなく、あらゆる調査・計算・テキスト処理をCLI端末へのコマンド入力一撃で終わらすこと。あるいはそのときのコマンド入力のこと。 https://blog.ueda.asia/?page_id=1434 ↩
-
シェル芸を使いこなす人 ↩
-
dateutils
で戯れる微笑ましいシェル芸人のツイート https://twitter.com/eban/status/794185079782150145 https://twitter.com/kunst1080/status/792248369053708288 ↩ -
たとえば、Open USP Tukubaiなど、便利な例です。 ↩
-
日本が世界に誇る国民的アニメ。2016年12月現在「魔法つかいプリキュア」絶賛放映中! ↩
-
プリキュアが好きなエンジニアのこと。 ↩
-
リリース時はこちらのスライドを使ってシェル芸勉強会で紹介しました https://speakerdeck.com/greymd/ru-men-cureutils ↩
-
Cureutilsは、2016年6月に最初のバージョンがリリースされ、半年で2000件近くダウンロードされています https://rubygems.org/gems/cureutils/versions/0.1.5 。 ↩
-
Ruby2.2.0以下の方は
$ sudo gem install backport_dig
をしてHash#digが使えるようにしないと、一部の機能が動作しません。 ↩ -
お使いでない方は、下記に、Zsh用の補完スクリプトがあるので、手動で導入されると良いと思います。https://github.com/greymd/cureutils/blob/master/zsh-completion/_cure ↩
-
2016年12月時点で、TVシリーズのメインヒロイン44人。厳密には「伝説の戦士プリキュア」ではない「キュア」のつかない戦士に変身する女の子も含みます。残念ながら満と薫、レジーナなどは含まないので悪しからず。 ↩ ↩2
-
faker-cliやchance-cliなど。 ↩
-
適当に言ってます。 ↩
-
こちらの解答は第14回のシェル芸勉強会の問題の解答になります。 https://blog.ueda.asia/?p=4413 ↩
-
注:この回答を使ったからといって、人事からの高評価を得られるとは限りません。 ↩
-
例えば、「HTTPS通信」と言いたいだけなのに、ある箇所では「TLSを使って〜」と表現し、また別の箇所では「SSL通信で〜」と言っているような文章です。もしかしたら何か意図があって表記を別にしているのかどうかわからないので、一々考察が必要で、このような文章は読んでいて疲れます。後述の「一物一名の原則」を守って欲しいものです。 ↩
-
「一つの文章の中で,一つの実体・概念にただ一つの名前をつけること」を表した原則。情報処理学会会誌2016年1月号で同会のフェローである速水氏が提唱した。 https://twitter.com/hrhym/status/678768952399368192 ↩
-
Bracket ExpressionについてはGNUのサイトにまとまっています。 https://www.gnu.org/software/grep/manual/html_node/Character-Classes-and-Bracket-Expressions.html ↩
-
https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%89%E3%83%8D%E3%83%BC%E3%83%A0#Android ↩
-
http://www.atmarkit.co.jp/ait/articles/1203/28/news127_2.html ↩
-
アジャイル開発においてチームを率いる役割の一つ。プロジェクトを円滑に進めるために頑張る人。 ↩
-
1スプリント1週間のチームは、半年ごとにスプリント名をリセットする、あるいは薫、満、キュアタルト、ダークプリキュア、キュアフラワー、キュアアンジェ、キュアキャンディ、キュアゴリラ、キュアモフルンなどを入れて、52週間分作って下さい。また、2017年の「キラキラ☆プリキュアアラモード」で新登場するプリキュアを待つのも良い戦略でしょう。 ↩
-
手元で試した限りは、
docker
の--name
オプションも正しく動きました。複数の--name
オプションが指定された場合は、後半のものが優先されるようです。 ↩ -
呼びません。 ↩
-
一つアドバイスですが、こんな意味のないオプションを使うくらいであれば普通の
grep
コマンドを使った方が良いです。 ↩ -
鬼雲の正規表現に関しては http://qiita.com/scivola/items/358b6b81d893c045129b を参考にさせていただきました。 ↩
-
映画『プリキュアオールスターズNewStage』で初登場したプリキュア。坂上あゆみという女の子が変身するプリキュア。かわいい。 ↩
-
なお、rootでそのままログインするというワイルドな方は
/root/.bashrc
などに直接変更を加えて下さい。 ↩ -
ちなみに、出力を
>&2
で標準エラー出力に出しているのは、.bashrc
で標準出力をするとscpでエラーが発生するからです。 http://d.hatena.ne.jp/kanonji/20120625/1340602002 ↩ -
使えるメタ文字についてはこちらのページを御覧ください。 http://www.rubylife.jp/ini/date_class/index5.html ↩
-
このコマンド、最初は実装するつもりはなかったのですが、依存しているgemであるRubicureにぴかりんジャンケンをする機能があり、せっかくなので使ってみました。当然、Rubicureにあるぴかりんジャンケン用のメソッドを利用しています。 ↩
-
「スマイルプリキュア」の「キュアピース」が変身時にするじゃんけんのこと。毎週どんな手がでるのかわからないので、楽しみにしていた視聴者も少なくない。数多くの視聴者が、日曜日の朝のキュアピースでじゃんけんし、日曜の夜のサザエさんで再度ジャンケンをする日々を送った。キュアピースかわいい。https://www.youtube.com/watch?v=1Q7Q5P-Gaos ↩
-
適当に上手く〆る台詞を考えてみました。 ↩