こころがホッコリー

ただイカしたRubyistになりたい人生だった。

Mac OS X のターミナルで、矩形選択をする

割と有名な話なのかもしれませんが、Mac OS X のターミナルでは、デフォルトで矩形選択がサポートされています。(筆者の環境、yosemiteで確認)

矩形選択を行うには、commandoption を押しっぱなしにします。
すると、カーソルが長方形選択ツールの形状に変化するので、矩形選択したい部分を指定します。
後は、クリップボードにコピーして、よしなに。

f:id:muramurasan:20160131202230p:plain

SQLのselect文実行結果等で、地味に重宝するので、知っておいて損はないはず。

yieldをミニマムな例で理解しようとしてみた

Rubyを始めて間もない頃、 「yieldが全然わからん……」 という壁にぶち当たることがありました。

当時、親切な同僚から懇切丁寧な説明をいただいたんですが、
いかんせん自分の基礎能力が低すぎて理解が追いつかず、申し訳なさすぎる……。

同僚曰く、 「自分で実装して理解するのが一番早いですよ」
ということで、当時、お題をいただき、見よう見真似で実装してみたものを晒します。

お題

def foo
  # 処理A
  # 処理B
  # 処理C
end

def bar
  # 処理A
  # 処理D
  # 処理C
end  

自分の実装

class YieldSample
  def foo
    common { puts "Label B" }
  end

  def bar
    common { puts "Label D" }
  end

  private
  def common
    puts "Label A"
    yield
    puts "Label C"
  end
end

obj = YieldSample.new
obj.foo
obj.bar

出力結果

Label A
Label B
Label C
Label A
Label D
Label C

考察

上記例は、yield の動きがわかるよう、わざとらしい実装にしています。
コードと出力結果から読み取れるよう、yieldは、
「呼び出し元から渡されたブロックを実行する」
という振る舞いをします。
何を期待するかは、呼び出し元にすべて委ねるんですね。

もっとちゃんと解説している方がいるので、yieldとしっかり向き合いたい方には下記の記事をオススメします。

d.hatena.ne.jp

で、yield使って何が嬉しいの?

「実践的な事例がないとわからないよ!」
「結局、yieldを使って嬉しいことって何があるの?」

という方は、リファクタリングRubyという本の中に登場する、
「6.12 サンドイッチメソッドの抽出」という実例にあたってみて欲しいです。
設計の負債(クローンコード)を、yieldを使って華麗に解決しており、大変勉強になります。

www.amazon.co.jp

本を買うのはちょっと……という方は、下記の記事でも「サンドイッチメソッドの抽出」について触れられているので、どうぞ。

d.hatena.ne.jp

paizaで破壊的メソッドの返り値を期待するコードを書いてはいけない?

2016/05/22 追記:直っていました!!!!!!! muramurasan.hatenablog.jp


...
...
paizaというサービスがあります。
難易度別・言語別のコーディングテストを受けながら、その成績に応じて求人に応募できるというものです。

paiza.jp

転職活動のみならず、単純にスキルアップ目的にも使えるサービスです。
Ruby On Railsでレールに乗った開発をしていると、フレームワークをどう使うか?のウェイトが大きく、
「ロジックをひたすらゴリゴリコーディングする」という機会が少なくなりがちです。
そこで、手を動かすのを兼ねて、ちょこちょこ利用させていただいています。

さて、このpaizaですが、書き方によってはテストケースが通らないものがあったので、自分への備忘録を込めてブログに残しておきます。

どんな時にテストケースが通らないのか?

paizaの中で以下のような問題がありました。

標準入力で与えられた文字列に対し、末尾4文字を除いたものを標準出力せよ。
(正確な問題文を掲載すると、paizaの利用規約に引っかかると思うので、ぼかしておきます)

私は最初、以下のように回答をしました。

input = gets.to_s
puts input.chomp![0..-5]

破壊的メソッドの返り値を期待していて、ちょっと気持ち悪いですが、
ローカル環境で確認する限りは、所望の結果を得られるようになっています。

このコード、paizaで提出前に行える動作確認では「成功!」と出るのですが、
いざ提出してみると、「失敗(ランタイムエラーです)」となり、全テストケースに不合格となるのです。
(つまり、0点扱い……)

どう書けばよかった?

そもそも、破壊的メソッドを使う必要が無いコードなので、普通に以下のように書きます。

input = gets.to_s
puts input.chomp[0..-5]

これで、提出時のテストケースも通るようになります。うーむ。

まとめ

そもそも、破壊的メソッドで返り値を期待した書き方をしてはダメなのかもしれませんね。(なんでだろう?)
paizaは初回提出時の点数が保存されてしまいます。
大事な局面で同じミスをしないよう……Rubyでpaizaを受験する方は注意してください。

今回、ちょっとしたクレーム的な記事になってしまっていますが、paiza自体はとてもよくできたサービスです。
まだ、paizaを利用したことが無く、「腕試ししてみようかな」という方は是非どうぞ!
Rubyで言えば、Hash操作や、Arrayの操作、文字列操作に強くなりますよ!ほんすこ!

MacOS yosemiteで、Atomの矩形選択を利用する際にハマったこと

※ 本記事は、10月中旬に下書きをしていたもので、一部内容が古い可能性があります。ご了承ください

Mac & Atom で開発する前は、Windows & 秀丸だったので、
秀丸にデフォルトで入っている(?)、矩形選択機能が何かと恋しくなる機会に遭遇します。

ちょっと調べてみると、最新のAtom(1.0.2)では
矩形選択機能(※)がデフォルトで入っていると知ったので、
早速、自分の環境(MacOS yosemite)で試してみました。
(※ 乱暴な説明をすると、複数行の行頭に一括して同じものを入力・削除できるもの)

ところが、
Shift+Ctrl+UP
Shift+Ctrl+Down
どちらを操作しても、MacのMisson Controlがモゾモゾとうごめくだけ……。
自分はMission Controlを頻繁に使っている人間ではない。
(というよりMacを開発で使い始めて2週間……)
なので、Mission Control の機能を切ることにしました。

support.apple.com

Mission Controlの設定方法は、上記の公式サポートに記載されているので、
これに従って、 Ctrl+UP と、Ctrl+Down の機能を切りました。

これで快適! Atom上で矩形選択ができるようになったので、何かと捗ります。

Ruby on Rails チュートリアルのバックナンバーにアクセスする

Rails Tutorial を最近やり直そうと思って、
「あれ? テストフレームワークRSpecじゃなくなっている?!」
ということがありました。

これは、Rails4.0向けから、4.2向けにチュートリアルが更新され、
それに合わせて開発環境等も一新されたからです。
推奨するテストフレームワークが、RSpecからtestunitになった他、
開発環境が、ローカルではなく、Cloud9が紹介されているという違いもあります。

モダンな開発環境(?)に慣れる、という意味では、
最新の4.2向けのチュートリアルで学ぶべきだと思います。Rails5.0もリリースされたことですし。
ただ、私のように
RSpecを、Rails Tutorialをやりながら復習したい!」とか、
「会社の新人研修用に、以前と同じチュートリアルを教材にしたい!」
という場合、以前のRails4.0向けのチュートリアルを使いたいですよね。

安心してください。
実はバックナンバーはちゃんと生きていて、
下記のリンクでRails4.0向けのチュートリアルにアクセスすることができます。

railstutorial.jp

こうしてバックナンバーを残してもらえるのはありがたいですね!