ツナワタリマイライフスマートフォン用の表示で見るツナワタリマイライフ日常ネタから技術ネタ、音楽ネタまで何でも書きます。Filter編Programmingはじめに長らくCapistranoを使ってます。最近バージョンが3.5にあがり、ログフォーマットが激変しました。3.5の勉強がてら、ソースを読んでみます。インストール3.4.1からアップグレードしました。10.4.2)sshkitの内部実装も読まないとな。ソースコードの読み方v3.5を見ていきましょう。github.comまぁgrepしたりするかもしれないので自分のところに落としておいたほうがいいですね。ディレクトリ構造はこんな感じ。supportfeatureとspecはテストなのでとりあえず除外。binはその名の通り実行ファイルっぽいので、読むのはlib配下ですね。capistrano.rbfilterという文字が見えますね。configuration以下のコードを読んでいきましょう。GitHubまずここがfilterの親元です。他のfilterをrequireしてます。呼び出し元がどこかまだ分かってませんが、typeとvalueが与えられて呼ばれるようです。typeはfilterのtypeだと思って間違いないでしょう。valueが空ならEmptyFiltervalueがallのsymbolもしくはstringならNullFiltervalueが:hostならHostFiltervalueが:roleならRoleFilterそれ以外はNullFilterfilterメソッドではここで決められた@strategyに入ってるfilterが実行されることになります。noteに書いてますね。(@theist)元々はsymbolのみだったのがstringを許すようになりました。1つずつFilterを見ていきましょう。endend何のために作ったんかな?これ、どんなserverをいれても空配列を返すんですね。valueがないならraiseして怒ってほしいぐらいなんですが、ここは律儀に空配列を返してあげるのね。endendfilterしないってことなのね。allのときにここに入るようになるからその通りなんだろうけど、その他もっていうところだよね。Filterが不適切でもエラーを返さないのはelseでここに入っているからだったわけか。そのおかげで完全一致が部分一致になったんですけどね。}まず、mapは要素分繰り返して、ブロック内で評価したものを返すメソッド。is_a?でオブジェクトのクラスを判定しています。Stringであるかどうか。Stringに対するパターンマッチです。ここ、めちゃくちゃ難しいですね。マッチすればマッチした位置を整数で返します。call)と呼ぶらしい。filterの,区切り形式かどうかを見ているんですね。HOSTS='server1,server2,server3'という形式であればok。これを,でsplitして分割して返してあげてますね。これ、avに元々正規表現を含んでいると、マッチしないのでvをそのまま返すほうのルートに入ります。nilつまり3.4以前の,区切り表現と、今回新たに採用した正規表現の互換を保とうとしてこういう処理になったんですね。