そういうこともある

エンジニア的な何かの、プログラミングとかイベントレポートとか読書感想文

Vim入門でつまづいたが再入門しました

f:id:sktktk1230:20180126163944p:plain

1. 経緯

今更ながらですが、Vimに入門してみました
vimを使うときは、Gitでコミットメッセージ書く時だったり、サービス運用時、緊急対応でサーバに入って直接ファイル触るとかあったので、Vimは使えるようになりたいな〜と常々思っていました
ただなかなか使いこなせず、結局移動は矢印キー使ってしまったりとなかなか活かしきれていなかった感じです
さすがにそろそろ本格的に使えるようにしないといけないなと思ったので、色々と調べてみて再度入門してみたので、それをまとめてみました

2. 何をしたのか?

  • Vim関連の情報収集
    • 初心者向けにわかりやすくまとめてある記事が多く、最初からこれを読んでおけばよかったと後悔
  • Gitのコミットログ書くときはvimでなど、色々な場面でvimをなるべく使うようにしました
    • 最初はなれなくてかなりストレスでしたが、少しづつ手に馴染んでくるまでなんとか耐えて乗り切りました

3. 使ってみてどうだったか?

  • 1週間ほど使ってますが、以前より書きやすくなってきています。コマンドの数が多いので、チートシートみながらだったりしますが、覚えれば、覚えるほど、作業が楽になっていく実感あります
  • 編集モードとノーマルモードの行き来がめんどうだな〜と思っていましたが、この記事(初心者こそ、お洒落でvimらしい使い方を学ぼう!)を読んで考えが変わりました
  • コマンドは数が多すぎて最初に一気に覚えるのは大変だったので、こちらの記事(知識0から始めるVim講座)を参考にステップ毎に覚えていきました

4. 調べた記事

1. vimって何?というところから

  1. 初心者必見】最強エディタVimの使い方/コマンド30種まとめ
  2. Vim初心者に捧ぐ実践的入門
  3. 知識0から始めるVim講座
  4. 初心者こそ、お洒落でvimらしい使い方を学ぼう!
  5. 『実践Vim』を読んで学んだ、おすすめVimデフォルト機能35個

2.オススメプラグイン

  1. 脱初心者を目指すVimmerにオススメしたいVimプラグインや.vimrcの設定
  2. vimをもっと便利にするおすすめプラグイン

5. まとめ

更にVimを使いこなせるようになれば、サーバー入っての作業とか色々と楽になりそうだな〜という感じです

Railsのソースコード読んでみる | Active Support in?編

f:id:sktktk1230:20171212153754p:plain

普段仕事で使っているRuby on Railsですが、ソースコードを読む機会もなかなかないので、試しにやってみることにしました

読めるようにするまで

以前書いた記事で読めるようにするまでの設定を画像キャプチャ付きで解説しましたので、よろしければこちらをご参照下さい
shitake4.hatenablog.com

読んだ箇所

in? を今日は読んでみようと思います

どんな使い方だっけ?

読んでみる前にまずは使い方を調べてみます
RAILS GUIDESの日本語ドキュメントを見てみると

述語in?は、あるオブジェクトが他のオブジェクトに含まれているかどうかをテストします。渡された引数がinclude?に応答しない場合はArgumentError例外が発生します。

in?の例を示します。

1.in?([1,2])        # => true
"lo".in?("hello")   # => true
25.in?(30..50)      # => false
1.in?(1)            # => ArgumentError  

引用:RAILS GUIDES:in?

ソースコードを読んでみる

1. railsプロジェクトのactivesupportにある機能ですので、activesupportディレクトリのlib配下で def in? を探してみます

f:id:sktktk1230:20180403185950p:plain

2. 該当箇所が1箇所あったので、みてみます

1. activesupport > lib > active_support > core_ext > object > inclusion.rb
class Object
  # Returns true if this object is included in the argument. Argument must be
  # any object which responds to +#include?+. Usage:
  #
  #   characters = ["Konata", "Kagami", "Tsukasa"]
  #   "Konata".in?(characters) # => true
  #
  # This will throw an +ArgumentError+ if the argument doesn't respond
  # to +#include?+.
  def in?(another_object)
    another_object.include?(self)
  rescue NoMethodError
    raise ArgumentError.new("The parameter passed to #in? must respond to #include?")
  end

省略

end

引数(another_object)に対してinclude?を実行しています

include?を調べてみます

array.include?(obj)

include?メソッドは、配列の要素に引数objが含まれていればtrue、なければfalseを返します。要素と引数objが同じかどうかの比較には==メソッドが使われます。

animals = ["dog", "cat", "mouse"]
puts animals.include?("cat")
puts animals.include?("elephant")
true
false

引用:Rubyリファレンス#include?(Array)

str.include?(other_str)

include?メソッドは、文字列の中に引数other_strの文字列が含まれるかどうかを調べます。含まれるときはtrue、含まれないときはfalseを返します。

s = "Supercalifragilisticexpialidocious"
puts s.include?("exp")
true

引用:Rubyリファレンス#include?(String)

mod.include?(other_mod)

include?メソッドは、クラスやモジュールが引数のモジュールother_modをインクルードしているかどうかを調べます。インクルードしていればtrueを、そうでなければfalseを返します。

親クラスがインクルードしているモジュールを指定してもtrueになります。

p String.include?(Comparable)
p String.include?(Enumerable)
p String.include?(Kernel)
true
true  (Ruby 1.9ではfalse)
true

引用:Rubyリファレンス#include?(Module)

rubyのinclude?の実装は3つあるみたいです(String, Array, Module)
another_object.include?(self) は引数のオブジェクトがレシーバに対してinclude?かどうかをチェックしています

そして、メソッドが実装されていない場合には、 ArgumentError を返すという処理になっていました

rescue NoMethodError
  raise ArgumentError.new("The parameter passed to #in? must respond to #include?")
end

読んでみて

include? はよく使用していますが、in?はあまり馴染みがなかったので、挙動を学べたので、うまく使い分けなど出来るといいなと思います

peco使ってみたらすごい便利だった

f:id:sktktk1230:20180126163944p:plain

先日、リモートでRails Developers Meetupのセッション聞いてまして、

railsdm.github.io

ちょっと気になるツールがあったので、調査してみて数日間使ってみました

紹介されていたのは、@itoさんのセッションで

pecoというツールが紹介されていましたので、色々と調べて実際に使ってみました

pecoとは?

  1. pecoの基礎の基礎
  2. Github:peco

とてもシンプルなツールで 「標準入力から受けた行データをインクリメンタルサーチして、選択した行を標準出力に返す」 コマンドです。
シンプルゆえに様々な組み合わせで効果を発揮します。あらゆる場面での選択肢を標準入力に渡して、選択された結果を標準出力から受け取って加工してコマンド実行をする、というのが基本的な流れ。
説明じゃ伝わらないので実例を体験したほうが早いかも。
引用:pecoの基礎の基礎

pecoを利用した設定

  1. pecoる
  2. pecoを使い始めた
  3. 私のpeco活用事例
  4. pecoでエンジニア人生を10倍楽にしよう!
  5. pecoの便利な関数を集約した奴がいたんですよぉ〜

調べてみると、peco単体で使うよりもよく検索に使う処理と組み合わせて、というパターンが多かったです。
なので、実際に私も上の記事を参考にいくつか設定してみました

1. find file (^w)

rspecでテストケースを指定したい場合、前まではzshの補完を使っていたのですが、ディレクトリが深かったりすると指定するのがめんどくさかったりと大変だったのですが、これを設定したことでいっきに楽になりました
参考サイト:私のpeco活用事例#4. peco find file

2. search branch (alias -g B)

ブランチ切り替えする際に、なんとなく名前を覚えているんだけど、どんな名前だっけ?という時にいちいちローカルに落としているブランチ一覧から探していくのが結構めんどくさかったので、非常に助かりました。ちょくちょくマージされたブランチとかは消しているけど、気づくとすごい数増えていたりするのでこれで作業が楽になったのは間違いないです
参考サイト:私のpeco活用事例#2. peco git branch

3. select-history (^r)

引数が微妙に違うコマンドとかをヒストリ検索するのは結構めんどいな〜という感じだったので、これが使えるようになって一気に入力が容易になりました
更には、入力したコマンドが一覧で見れるので、微妙な違いとかも一目瞭然でタイポしたコマンドをヒストリから選択してしまうという凡ミスもなくなりました
参考サイト:pecoを使い始めた#peco-select-history

4. cdr (^@)

こちらも非常にお世話になってます。よく移動するディレクトリで階層深かったりすると移動が面倒でした。この作業の効率化は結構バカにならないな〜と思います
参考サイト:pecoを使い始めた#peco-cdr

pecoファイルの運用方法

前と大体同じ感じでやる。基本的にこういうツールは自分でいろいろ作りたくなってきて、設定が増えてきて破滅するので、ファイルを置くディレクトリを決めておいてそこに置いておくことにする。
- .zshrc : 決めたディレクトリのファイルの全ロードと、キーバインドの設定
- ~/.zsh/peco-sources/ : peco用の設定ファイルを置いておく用
引用:pecoを使い始めた#pecoのファイル運用

shiba_yu36氏と全く同じ運用にしています。複数Macで使いたいので、ファイルはDropboxに置いて、シンボリックリンクを張るという感じで運用しています

数日間使ってみての感想

とにかく便利の一言に尽きます!上記で設定してない場合で使いたいときは | peco で使えるので、どんなパターンでも柔軟に活躍してくれます。何かよく使うパターンがあれば、その時にまたファイルを追加したいな〜と思います