webエンジニアの日常

RubyやPython, JSなど、IT関連の記事を書いています

名前の森で定数を見つける物語

Effective Ruby勉強メモです。

Rubyで大きなアプリケーションなどを作る場合には、どうしても既存クラスと同じ名前のクラスを定義したいときがあります。

以下のように書くとクラスを新しく定義しているかのように見えますが、実際には既存のArrayクラスを再オープンしてメソッドを追加してるだけにすぎません。

Rubyではクラスはミュータブル(可変)なのです。

class Array
  def print_first
    p first
  end
end

これでは思わぬ副作用をもたらしてしまいます。最悪、メソッドを完全に上書きしてしまいシステム全体に不具合が生じてしまいます。

そこで、新しくモジュールを定義し、その中でクラス定義をすることで既存のクラスと同じ名前の異なるクラスを定義することができます。これは名前空間と言われるテクニックです。

module Demo
  class Array
    def print_first
      p "first"
    end
  end
end

a = Demo::Array.new
a.print_first #=> "first"

呼び出す際はDemo::Arrayのようにモジュールを明示的に書くのが望ましいです。

呼び出すときにRubyがどのように定数を探すのかは後述します。

続きを読む

豚の角煮を作るときの下処理に効果があるか実験してみた

f:id:s-uotani-zetakansu:20180709205435j:plain

今回は珍しく料理ネタを書きたいと思います。

最近圧力鍋を購入してから、結構な頻度で豚の角煮を作っています。

いろんなレシピを見ながら味付けを変えたりしているのですが、意外と書かれていないのが、肉の下処理です。

主に臭みを取るのに酒や塩をかけたりするのですが、今回は塩に注目してみます。

肉に塩を振って置いておくと、徐々に中から水分が抜けていきます。水分が抜けると仕上がりがぱさぱさしそうなのですが、実は逆で、食品に塩を浸透させることで結合水(食品の成分と結びつく水分で、蒸発したり抜けたりしない)が増え仕上がりがジューシーになります。

カラカラの干物を焼くとしっとりと仕上がるのは干す前に塩漬けにすることで結合水が増えているためです。

実験

そこで、実際に塩を振っておくことでジューシーに仕上がるのか比較実験してみました。

続きを読む

即席クラス。構造化データの表現にはStructを使おう

配列ではなく、キーと値のペアで構成されているデータを扱うには、普通ハッシュを使うかと思います。

それ自体は間違いではありませんが、ハッシュにしてしまうとゲッターメソッドが使えず、オブジェクトかハッシュかを意識しながら扱わなくてはいけません。

要するに、クラスにするまでもない一時的なデータでもオブジェクトのようにゲッターメソッドを使いたいのです。

このような場合にはStructクラスを使うときれいに書くことができます。

続きを読む

買ってよかったAmazonKindle本を紹介します

最近またkindleで本を読み始めました。

欲しい本をkindleで探して、買って、読む。

買うまでのハードルが低すぎてついつい買っちゃうんですよね。

もちろん、買って後悔した本もありますが、今日は買ってよかった本をランキング風に紹介したいと思います。

ちなみに、本体を買うならkindle paperwhiteじゃなくて、Fireタブレットが絶対オススメです。

ほんまにコスパ最強のタブレットです。去年だったか、父の日にプレゼントしてとても喜ばれました。

端末に本をダウンロードしてしまえば通勤電車で読めるし、一旦閉じても次に開いたときにはすぐに途中から読むこともできます。

付属のカメラがしょぼい意外は文句のつけようがないです。

Fire HD 8 タブレット (8インチHDディスプレイ) 16GB

Fire HD 8 タブレット (8インチHDディスプレイ) 16GB

Fire 7 タブレット (7インチディスプレイ) 8GB

Fire 7 タブレット (7インチディスプレイ) 8GB

続きを読む

SCSSの文法で最も基本的であると思われるものをまとめてみました

Progateで勉強したSCSSの文法のまとめです。

「なんかcssをちょっと便利にしたもの」程度の理解しかなかったので、progateで勉強し、文法をまとめてみました。

入れ子構造

通常のcssであれば

.header {
  width: 100%;
}

.header  ul{
  padding: 10px;
}

と書いていたところを、

.header{
  width: 100%;
  
  ul{
    padding: 10px;
  }
}

というように入れ子にして書くことができます。

続きを読む

Rubyをもう一歩進んで勉強する9章(セッターメソッドについて)

Rubyではメソッド名の末尾に"!"や"?", "="のような非英数字文字を使うことができます。

"!"はメソッドの使用者に注意を促すとき、"?"はメソッドが真偽値を返すのを明示的に表したいときに使ったりします。

たまに、"!"を付けると破壊的メソッドになるとか、真偽値を返すメソッドには必ず"?"を付けなければいけないとか質問されているのを目にしますが、強制力もなければ、メソッド名でメソッドの中身が変わることもありません。

しかし、"="が付いたメソッドは少し特別な意味を持ちます。

続きを読む

Rubyをもう一歩進んで勉強する8章(initializeメソッドについて)

伝統的かどうかわからないが、RubyはJavaなどにあるようなコンストラクタを持っておらず、代わりにnewメソッドから呼ばれるinitializeという特別なメソッドを定義することによりオブジェクトを初期化することができます。

特に定義しなければ、BasicObjectクラスに定義されているinitializeメソッドが呼ばれますが、中身は空なので何も起こりません。

initializeメソッドもほかのメソッドと同じくようにメソッド探索を行い、最初に見つかったinitializeメソッドを実行します。

続きを読む