Web備忘録

雑多に書いています

「メタプログラミングRuby」を読んだ感想

メタプログラミングRuby」を読みました。

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

物語形式で進む技術書で、主な登場人物は二人。ボブとビルです。

ボブは新入社員で、Rubyを触り始めて数週間(の割にはすごい理解力ある)。その上司である「経験豊かなビル」が、実務上の課題を解決する上でのメタプログラミングの使用法をボブに教える、という形式で進んでいきます。

メタプログラミングというタイトルが「なんかやばそう」なオーラを出してますが、内容としては思っていたよりは理解が追いついてちゃんと読めて、凄く面白かったです。

いままで、「Ruby超入門」、「たのしいRuby 5版」、「プロを目指す人のRuby入門」とやってきて、4冊目としてとてもいいレベル感のものに手を出せたなーと思ってます。我ながら素晴らしい

理解が難しい所もありましたが、Rubyについて実践的な知識が得られる本じゃないですかね?(といっても本当に実践的かどうかはまだ実務してないのでわからないですが)

学んだこと(覚えてる範囲で)

  • クラスとモジュールの継承関係
  • 動的メソッド・ゴーストメソッド
  • クロージャ(ブロック)を利用した動的処理の受け渡し
  • スコープとself
  • 特異クラス
  • フックメソッド
  • ActiveRecord::Baseの構成要素

印象に残った概念とかコードとか

うーむ、10日ぐらい前に読んだので、すぐにぱぱっと思い出せない。 プログラミングあるあるだと思うんだけど、挙動ベースで覚えるから、こう、言葉にできない。言葉にする力、ダイジダネ。

下の概念は、この本で学んだ、個人でRuby書いてく上でも瞬間的に役に立ってるって思ってる部分です。

  • メソッドの探索経路
  • Object#method_missingをオーバーライド
  • スコープとself

メソッドの探索経路

これでRubyのメソッド探索の理解度がぐんと上がりました。

(自分でまとめた図。字が汚いのは原著リスペクトです。本気で書いてこんなもんってわけじゃないよ!!(大声))

f:id:fujiten3:20190323144243j:plain

改めて読むと読み解き辛くて笑える。 過去の自分の呟きに読み方が書いてました。

お、おう。

うん、つまりたぶんこういうことだと思う。まずあるクラスがあるとする。そして、そのクラスのスコープ範囲内で定義されたメソッドは、そのクラスに生成されたインスタンス達がそのメソッドが持ってるかのような挙動(インスタンスメソッド的)であるが、この探索経路を踏まえて考えると、あくまでもそのメソッドを持っているのは定義されたクラスで、インスタンスは「メソッドの探索経路の中で、親クラスで定義されているメソッドを捕まえるだけである」と考えてもいいということだ。

……まあ、このへんは実際に本買ったほうがわかりやすいですわ…。

Object#method_missingをオーバーライドする

Object#method_missingは例外NomethodErrorを返すメソッドです。 そいつをオーバーライドすることでそのクラスのインスタンス達はあらゆるメソッドに反応できる力を得ます。

class Dog 

  def method_missing(method, *args)
    puts "呼び出したメソッド: #{method}(#{args.join(',')}) "
    puts "(ブロックも渡したね)" if block_given?
  end

end
dog = Dog.new
dog.wow!
=> 呼び出したメソッド : wow!()
dog.wowow!{ "BowWow!!" }
=> 呼び出したメソッド : wowow!()
(ブロックも渡したね)

これでNomethodErrorからおさらば! このような「コード上に存在しないメソッド」のことをゴーストメソッドというそうです。 今回の場合だと、Dog#wow!や、Dog#wowow!がゴーストメソッド。

(ただし危険性も高いので、出来る限り「動的メソッド」で対応した方が望ましいとのことです。詳しくは原著へ。)

深い

結論から言うと、Ruby、ありえん深みがある。(というかどのプログラミング言語も深みがありそう)

また追記するかもしれないですが、今日のところは以上です。

Ruby、もうちょっと深く知りたいな」って方はぜひ読んでみて下さい!

おわり。

「abceed」という英語勉強アプリがとてもよい

2ヶ月ぐらい前にインストールしたんですが、とてもよいアプリなんです、これが。

TOEICに特化したアプリですが、普通のリスニング教材としても優秀だと思ってます。

ちなみにアフィリエイトとかではないです。ただの紹介です。 あ、課金要素はあります。

なにがよいか

  • レベル感がちょうどいい
  • スキマ時間に簡単に問題が解ける
  • 解説が充実してる(スクリプト完備)
  • UI/UXがよい

といった感じです。

一つ一つ解説していきます。


レベル感がちょうどいい

自分はたぶん今TOEIC750点ぐらいの実力だと思うんですが、(家での模試で800点だった) 英語の勉強で苦労してるのが、Podcastとかでネイティブの会話聞いてても、 「聞き取れないレベルの早さと単語のやり取り」が頻発してくることなんですね。

TEDの動画で以前見た語学力向上法として、「『ギリギリ聞き取れる&理解できるレベルの会話』を聞きまくって、その上で意味を咀嚼しようと努力することが大事」ってのがあったんですが、正直、今の僕のレベルではネイティブが普通に会話してる英語は、じゃっかんハードです。というかスーパーハードです。 そんな僕のレベルでも大丈夫な感じに仕上がってます。このアプリは。

アプリの概要としては、中にいろんな電子書籍が入ってて、買い切り型(またはプレミアム会員型)で、その本の問題を気軽に解けるっていう形式なので、自分のレベルに応じた電子書籍を買えますしね。


スキマ時間に簡単に問題が解ける

一番はこれですかね。 電車でささっと解けるんですよ。 画面みても分かりづらいかもしれませんが、リスニングの問題とかを下みたいな画面でささっと解けます。

f:id:fujiten3:20190313181941p:plain

問題形式で出題してくれるメリットは「なんとなく聞いている」状態では正解率が下がるということ。 正解しにいく姿勢(≒聞き取ろうとする姿勢)が養われます。 ていうか、アプリで問題解けるって本当にいい時代ですよね〜。 自分が受験生の頃は単語帳でしたからねー。(老害アピ)


解説が充実してる(スクリプト完備)

これも偉いポイント。

f:id:fujiten3:20190313182124j:plain

充実の解説力。 重要単語を下にまとめてくれているのもいいですね!

あと、フルスクリプトなので、会話を単語のニュアンスで理解しようとせず、「一言一句完璧に聞きに行く」という練習ができます。 これ大事だと思ってます。英語は冠詞一つでニュアンスが変わる繊細な言語なので、完璧に聞きにいく訓練は絶対必要だと思ってます。 有識者の方々、そうですよね? このへんは諸説かもしれないですが、僕はそう信じてるので「一言一句完璧に聞く練習」が出来るのはアドです。

UI/UXがよい

2つ画面挙げたのでわかっていただけるでしょうが、問題を解くまでのハードルが低いです。

「電車でいそいそと単語帳取り出し→読む」等に比べて、「スマホのアプリですぐ問題が解ける」ということがでかいです。 問題も1単語レベルから2分ぐらいの会話文まであるので、そのときの気分に応じて選べます。 (リーディングの問題もありますが、僕はあんまそっちはやってません)

僕はめちゃくちゃ面倒くさがりで、基本財布をカバンから出すのも面倒だと思ってるタイプです。IC決済大好きです。 電車で本を出すのは大変なので、スマホでサクッと問題が解けるっていうのはもはや革命です。

結論

abceedはいいぞ! 僕はプレミアム会員的なのに入ってますが、電子書籍買い切り型にしといた方が得だったかもなって今は思ってます。 というのが、プレミアム会員はだいたい月1500円かかるんですが、これ1月に1冊終わらせるぐらいのペースじゃないと元とれないです。 なので、中で電子書籍買ってアプリ形式で解くのが最強かもしれない。

まあ、Podcastと併用するのが一番ですね。 Podcastは単語力とか上げに行きづらいのと、その会話の「答え(意図)」が何だったのかっていう答え合わせの時間がないですから、その点を補ってくれるアプリです。

おわり。

「開眼! JavaScript」を読んだ

前からJavaScriptについてちゃんと勉強したいなー、と思ってたのでamazonで評判が良かった「開眼JavaScript」を読みました。

開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質

開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質

 

 

感想としては、「とても良かった」です。というか、こういうふうにJavaScriptを勉強したいなーって思ってた内容をしっかり書いてくれていた感じ。

「言語仕様の説明に徹している」という点がこの本のよいところで、悪いところが「その言語仕様でどのようにコードを書いていくか」みたいな説明はほとんどないところですかね。(これは裏表の関係ですが。)

 

どんな本かというのはまえがきに書いてあって、本当にまえがき通りです。

 

本書はJavaScriptデザインパターンや、JavaScriptによるオブジェクト指向プログラミングの本ではありません。良いJavaScriptの特徴を悪い特徴と区別しているものでもありません。JavaScriptの完全なリファレンスガイドでもありません。プログラミングの超初心者の本でもなく、JavaScriptを全く知らない人のための本でもありません。レシピ満載のクックブックでもありません。これらの本はすでに存在します。
本書の目的は、JavaScriptにおけるオブジェクトをはじめとするさまざまな要素、たとえばオブジェクトそのものやプリミティブ値、スコープ、継承、グローバルオブジェクトなどを考えることによって、JavaScriptの正確な世界観を提供することです。本書はJavaScriptのオブジェクトの性質について焦点を当てており、ECMA-262 Edition3標準の簡潔かつ消化可能な要約でもあります。
 (開眼!JavaScript ー 言語仕様から学ぶJavaScriptの本質)

 

出版日が2013年なので、当然ながらES2015に関する仕様説明なんかは全くないです。それについては別のところでやったほうがいいですね。

 

たぶん実務でJavaScript書いてる人だったら「おお!この挙動の裏はこんなふうになってたんだな(感覚ではわかってたけど)」みたいな感じな本なんでしょうが、自分はJavaScriptまだあまり書かず比較的Rubyを多めに触ってるので、「ここRubyでいうアレに似とるなー(小並感)」みたいな読み味でした。

 

JavaScriptを深く知りたい方、おすすめです。開眼します!ソースは自分で、サンプル数1です。

もうちょっと内容に踏み込んだこと書きたかったんですが、言語の本質的な話が多いので、僕のレベルではまだあんまり語れません!

でも面白い本でした。

 

おわり。