2018買ってすごく良かったもの

色々向き合うべきものが多く、1年ちょっとブログの更新が滞っていました。
2019年はもう少し更新して行きたいです。
まずはリハビリ程度に書きやすい題材で書いてみます。
 

LOWYAのテレビボード

引越しついでにテレビボードを買い換えたのですが、このLOWYAという家具屋さんがおしゃれかつ安くて とても気に入りました。


公式リンクの方が写真たくさんあるので載せます。
国産ローテレビ台 70V型対応 木製 半完成品 ヴィンテージ調 [幅178.6] [日祝配送不可] | 【公式】LOWYA(ロウヤ)|家具・インテリアのオンライン通販

個人的には、上段が空いているところにPS4を置きたい、下にお掃除ロボを収納したいという点を満たしつつ、 見た目もおしゃれな上、ケーブル収納などの日本製の家具特有の細かいこだわりがあり大満足の一品です。

Philips Hue スターターセット

Alexa 連携させたくて購入。
お値段がそこそこするので(これプラス照明も買い替えが必要だったり追加のランプ買ったりで)ので1or2年ほど悩みましたが、欲しい思いが変わらないので購入しました。
電球色や明るさの変更など、その時の気分に合わせて操作できる点はとても良いです。
「アレクサ、電気を電球色にして」、「アレクサ、電気を暗くして」などといった感じで利用。
ちなみに追加で購入した電球はiKea製のものを利用しています。それほど変わらないし、若干安いのでこちらも個人的には満足。

おしゃれ照明

なんとなく安く売っていたシーリングライトを使い続けてい他のですが、Hue購入ついでに念願のおしゃれ照明デビュー。

お掃除ロボ

これも引越しついでに購入。
床にモノを置かない状態でしか利用できないので、必然的に床にモノを直置きすることが減りました。
たまにケーブル類に絡まったりしますが、そこら辺も含めて可愛らしくて良いです。
ルンバ使ったことないので比較しようがないですが、今の所これで満足。

iPad Pro

Paypay祭りで購入。
絵はそんな書かないのでpro必要ないかもしれませんが、漫画を横向きでめくりながら見たりyoutube見たりするのに使っています。 購入時に触って見たFolio(キーボード&カバー)の出来が素晴らしいので、paypayの割引で購入しようか検討中。
apple pencilも使って見た所良さそうなので、こちらも検討中。

Apple iPad Pro (12.9インチ, Wi-Fi, 64GB) - スペースグレイ

Apple iPad Pro (12.9インチ, Wi-Fi, 64GB) - スペースグレイ

Ruby throwの使いどころ

例外ではなく、制御構造の話。

Effective Ruby

Effective Ruby

項目27 スコープから飛び出したい時にはraiseではなくthrowを使おう

catchとthrowはgotoの安全バージョン。

StopIterationを使った例

begin
  @characters.each do |character|
    @colors.each do |color|
      if player.valid?(character, color)
        raise(StopIteration)
      end
    end
  end
rescue StopIteration
  # ...
end

catchを使うと

よりsimpleに書ける。throwの第二引数に値を渡せるのも良いね。これ知らなかったな。

match = catch(:jump) do
  @characters.each do |character|
    @colors.each do |color|
      if player.valid?(character, color)
        throw(:jump, [charcter, color])
      end
    end
  end
end

覚えておくべき事項

  • 複雑な制御フローが必要な時には、raiseではなく、throwを使うようにしよう。throwを使うと、ボーナスとしてスタックの上にオブジェクトを送ることができる。catchの戻り値はそのオブジェクトだ。
  • できる限り単純な制御構造を使おう。catchとthrowの組み合わせは、単純にreturnでスコープから抜け出すメソッドとそれに対する呼び出しで置き換えられることが多い。

Ruby リソースはブロックとensureで管理しよう

File::openの話にとどまらず、リソースを確保するというコードの抽象化の紹介。
(File::openについてはここでは省略)

Effective Ruby

Effective Ruby

項目24 リソースはブロックとensureで管理しよう

ensureを使ってリソースの解放を行う例

class Lock
  def self.acquire
    lock = new
    lock.exclusive_lock!
    yield(lock)
  ensure
    lock.unlo0ck if lock
  end
end

Lock.qcquire do |lock|
  # ここで例外が発生しても問題なし
end

しかしこれだとblockがない場合が考慮されていない。

改良版

class Lock
  def self.acquire
    lock = new
    lock.exclusive_lock!

    if block_given?
      yield(lock)
    else
      lock # Lock::newのように動作する
    end
  ensure
    if block_given?
      lock.unlo0ck if lock
    end
  end
end

本書の例だと、少しblock_given?の所が見辛いですが、まぁ簡単に実装できます。

覚えておくべき事項

  • 確保したリソースを解放するためにensure説を書こう。
  • リソース管理を抽象化するために、クラスメソッドでblockとensureパターンを使おう。
  • ensure節で変数を使うときには、その前に変数が初期化さレテいるかどうかを確かめよう。