nesheep5's blog

子持ちWebエンジニアのブログ。プログラミング・仕事効率化・健康・子育て etc...

ActiveRecordでの範囲指定検索

ActiveRecordでBETWEEN的な範囲指定検索をしたいケースがあり、挙動を調べたので整理してみました。 ( ※Rails 5.2.0, MySqlで確認しています。)

以下のようにRangeで表現することができます。

User.where(id: from..to)

通常の範囲指定

検索条件に1..10を指定すると、BETWEEN句に変換してくれます。

User.where(id: 1..10)
SELECT  `users`.* FROM `users` WHERE `users`.`id` BETWEEN 1 AND 10 LIMIT 11

from以上

toにFloat::INFINITYを指定すると、BETWEEN句ではなく空気を読んでid >= 1に変換してくれます。すごい!

User.where(id: 1..Float::INFINITY)
SELECT  `users`.* FROM `users` WHERE `users`.`id` >= 1 LIMIT 11

to以下

逆にfromFloat::MINを指定すると、idの最小値=0に置き換え(DBの型から判別してる?)、BETWEEN句に変換してくれます。

User.where(id: Float::MIN..10)
SELECT  `users`.* FROM `users` WHERE `users`.`id` BETWEEN 0 AND 10 LIMIT 11

from/toが同値

from/toに同値を指定すると、BETWEEN 1 AND 1となりました。
id = 1を期待していたのですが、1件なら性能も大差ないでしょうし問題なさそうです。

User.where(id: 1..1)
SELECT  `users`.* FROM `users` WHERE `users`.`id` BETWEEN 1 AND 1 LIMIT 11

おすすめの範囲指定

上記の挙動をふまえ、以下のようなコードに落ち着きました。

from = query.id_from.blank? ? Float::MIN : query.id_from
to = query.id_to.blank? ? Float::INFINITY : query.id_to
User.where(id: from..to)

ActiveRecordは便利な機能がたくさんあって面白いですね!しっかり勉強していこうと思います。
もっとスマートな書き方あるよ!という方いましたらぜひ教えてください!

体重7kg減!完全無欠コーヒー4ヶ月目レビュー

集中力向上を目的に続けてきた完全無欠コーヒーも4ヶ月目に突入。
体の変化をレビューしたいと思います。

以前のレビューはこちら

nesheep5.hatenablog.com

nesheep5.hatenablog.com

4ヶ月続けた体の変化

体重7.0kg / 体脂肪率5.8%減!ダイエット効果がすごい

一番の体の変化は体重でした。

体重:72.2kg → 65.2kg (-7.0kg)
体脂肪率:22.4% → 16.6% (-5.8%)

日によって増減はありますが、ピークtoピークで7.0kgの減量。
MCTオイルの効果で、脂肪を燃やしやすい体に変化したのではないかと思います。
お腹周りの浮き輪がなくなり、体も軽くなりました!

体重

体脂肪率

眠気がなくなり、集中力が増す

1ヶ月目レビューのときも書きましたが、完全無欠コーヒーを飲み始めてから眠気がなくなりました。

  • カフェイン による覚醒作用
  • 朝食置き換えで糖質が減り、血糖値の上昇が緩やかになった

の相乗効果によるものだと思います。 昔は通勤や昼食後に耐え難い眠気に襲われていたのですが、いまでは全く眠くならず時間を効率的に使えるようになりました。

参考:利用している道具&材料

参考までに、利用している道具と材料を紹介します。
より本格的にやってみたくなり、豆から挽く&フレンチプレスの道具を揃えたところ予想以上に満足したので参考にしてみてください。

デロンギ コーン式 コーヒーグラインダー KG364J

今年買ってよかったもの第一位!】というくらいオススメです。
挽きたてのコーヒーは別格に美味しく、衝撃的でした。コーヒーは鮮度が命ということを身をもって知りました。
エスプレッソ用の極細挽き〜フレンチプレス用の粗挽きまで対応できます。
音は電動鉛筆削りくらいのイメージです。

BODUM フレンチプレスコーヒーメーカー

公式レシピでは、コーヒーオイルをより摂取できるフレンチプレスを推奨しています。
ペーパードリップに比べかんたんに美味しいコーヒーが淹れられるので、忙しい朝にうってつけでした。
挽いた豆にお湯を注いで4分待つだけです。味はペーパードリップよりコクが強く出ます。

カリタ ミルクフローサー

しっかりとブレンドすることで、ミセルという体に取り込みやすい状態になるそうです。

カリタ ふわふわミルクフローサー FM-100 #64197
Kalita (カリタ) (2009-03-31)
売り上げランキング: 7,654

グラスフェッドバター

色々調べて、コスパと量がちょうどよいこれを選びました。

MCTオイル

他のを試したことがないのですが、癖がなく飲みやすいです。

MCTオイル(中鎖脂肪酸100%) 250g
プレミアムマーケティング (2016-12-27)
売り上げランキング: 1,487

コーヒー豆

安くて美味しいとの評判を見つけ、加藤珈琲の豆を購入しています。
Qグレードと呼ばれるスペシャルティコーヒーの規格をクリアしており、品質も高いです。

まとめ

4ヶ月続けてみて、体重も想像以上に減り、体調面も良い変化が起こりました。
個人的にはちょっと体重が減りすぎてしまった(筋肉が落ちてしまった)ので、完全無欠コーヒーは続けつつ食事量を運動量を調整するつもりです。
ちょっと費用がかかりますが、生活の質を高めたいという人は試してみる価値があると思います。
興味ある方はぜひ試してみてください!

オートモーティブ事業部に異動しました

2016年3月にDeNAに入社して以来子会社のペイジェントに出向していましたが、
2018年4月よりオートモーティブ事業部へ異動することになりました。
一つの区切りとして今までやってきたこと、これからやることをまとめようと思います。

シェイクハンズ制度とは

本人と異動先の部署の合意さえあれば、人事と現部署の上司の承認なしに異動が可能となる制度です。
2018年8月に立ち上がった、新しい制度です。
今回このシェイクハンズ制度を利用して異動が実現しました。

seleck.cc

この制度がなければ、多分他社に転職していたと思います。
社内異動という選択肢を用意してくれるのは、社員にとっても会社にとってもとても良い制度だと思います。
他にも副業が解禁になったりと、社員が働きやすい環境づくりを積極的に行なってくれる会社です。

ペイジェントでなにをしたのか

前半は基幹システムの大規模リプレースの設計&実装、後半は新規案件の立ち上げにPLとして携わりました。

  • 基幹システムの大規模リプレース
  • 新規案件の立ち上げ
    • PLとしてプロジェクト管理
    • システムの骨組みを実装
    • 開発サーバ、デプロイサーバの準備
    • 他社システムとの調整

優秀な方ばかりで、入社当時はこの会社で本当にやっていけるのだろうかとビビった記憶があります。
徹底的にロジカルな思考、社員一人ひとりが自分事になって仕事に向かう姿勢、役職関係なく正しいと思う意見をぶつけ合うフラットさなど、前職のSIerにはない文化がありました。
丸二年間、刺激的な環境で仕事をさせてもらい、成長させてもらいました。

なぜオートモーティブに行くのか

自分のやりたいことを改めて考えたとき、エンジニアとして自ら手を動かしてものづくりをしたいという気持ちが強くありました。
自分なりにキャッチアップしてきた技術や手法を、実サービスに落とし込みたい。
また、自動車業界は自動運転という大きな転換点にあり、
まだ世の中に存在しないものをつくるフェーズに関われることに大きな魅力を感じました。
家族や親しい人が今より少しでも幸せに過ごせる社会をつくれたらいいなと思います。

オートモーティブでなにをするのか

自動車事故低減を目指すプロジェクトに、サーバサイドエンジニアとして携わります。 Ruby、Go、AWSなど触ることになりそうです。
3月から兼務で働いていますが、スピード感が全く異なります。 同じDeNAでも、お金を扱うペイジェントと新しい価値を届けるオートモーティブでは開発手法や文化が全く違います。 Web系のスピード感に追いつきつつ、ミスできない大事な場面ではSIerやペイジェントで学んだ手堅い開発を活かしたいと思います。

今後の抱負

「ITの力で今よりもっと良い世の中にする」ということに、交通という大きな規模感で関われることにワクワクしています。
エンジニアとして腕を磨いて、プロジェクトに貢献できるよう精進していきます。 直近では、

  • 業務では未経験のRuby、Go、AWSなどキャッチアップ(ポテンシャル採用してもらえたことに感謝!)、
  • 個人やチームの生産性向上系の知識
  • 常にフルパワーで働く/遊ぶための体づくり

あたりに注力したいと思っています。
ペイジェントでお世話になった方、今までありがとうございました。
オートモーティブでも頑張っていきます。

shibuya.rbに参加してきました

仕事でRubyを使うことになったので、勉強と情報収集のためshibuya.rbという社外勉強会に参加してきました。

shibuya.rbとは

Shibuya.rbは、渋谷近郊のRubyが好きだったり、 Rubyの周辺技術が気になっている人のための地域Rubyistコミュニティだそうです。

shibuya.rb[:20180221]

雰囲気

想像していた以上にゆるくて自由な雰囲気でした。笑
イベントページにも書いてあるように、テーマやセッションは特に決まっていないそうです。
最初に簡単な自己紹介をしあったのち、飲みたい人はビールで乾杯。
LTしたい人は好きに発表し、もくもくしたり、数人でディスカッションしたりしていました。

参加者

今回は15名くらいでした。
自分のように初心者・初参加の方から、RubyKaigiにCFP出すような方まで様々でした。

発表聞いていたら、いつも読んでる技術ブログの著者が発表していてびっくり。
勉強になる、とツイートしたばかり、、、

エンジニア界は狭いですね、、、。

聞いてみたこと

自由過ぎて何してよいかわからず、周りのレベル高い会話に聞き耳を立てながらぼんやりしてました。苦笑
優しい方々が話しかけてきてくれたので、自分の状況(Ruby初心者、Javaは10年くらい)を伝えた上で、色々と相談に乗ってもらいました。

初心者におすすめの本ある?

以下の三冊を薦めてもらいました。

チェリー本はちょうど最近読んだばかり。やはり良い本でした。

nesheep5.hatenablog.com

Everyday Railsだけ持っていないので、さっそく買ってみようと思います。
改訂版がでたばかりなので良いタイミングですね!

blog.jnito.com

おすすめのエディタは?

エディタについては宗教戦争になるのでコメントを控えますとのこと。苦笑
相談した方の会社でもみんなバラバラです、とのことでした。
自分は最初Vimで、現在Atom使っています。RubyMineがどれくらい便利なのか気になっているところ。

どうやって勉強するのがよいか?

技術書読むのも大切だけど、実際にコードを読み書きするのが一番、とのことでした。

  • 業務で使っているgemのReadmeを全部読む
  • 使っていて困っているところから攻める。あわよくばパッチ送って自分の陣地を広げる。
  • 自分でgemを作る。ディレクトリ構成とか理解するので読みやすくなる
  • 特にkaminari作者の松田さんのコードは参考になる
  • できれば自分で発表すること。顔を覚えてもらえる、話しかけられるなどのメリットがある

最新情報のキャッチアップはどうしてる?

  • 勉強会での情報交換が一番勉強になる
  • 渋谷界隈だと、銀座.rb 表参道.rb 浅草.rb 千駄ヶ谷.rb あたりの勉強会に参加するとよい(参考:地域Rubyの会)
  • Issueを読む。(朝晩20件ずつくらい読んでいる)英語の勉強にもなる。社内Slackに投稿すると意識高い感出る
  • Twitter上でははみんな真面目な話ししないからあまり参考にならない。笑

その他

  • 実はJavaRubyは親和性ある。Treasure Data社など、 JavaRubyを併用している会社は意外とある。
  • Rubyは良くも悪くも柔軟な言語なので、Javaのように固い言語からRubyにくるのは良い流れ。
  • DeNA@sonotsさんや@namusyakaさんなどすごいコミッタがたくさんいるので、交流できたらよいね。

また参加しようと思います

初心者にも優しく接してくれる、アットホームな勉強会でした。
レベルの高い人たち同士の会話を聞くだけでも勉強になるし、刺激を受けます。
次回はもう少し技術的な質問もできるように、しっかり勉強を続けていきたいと思いました!

【Ruby入門】構造化データにStructクラスを利用する

Ruby門中です。今日はStructクラスについて調べました。

Structクラスとは

一言で言うと、クラスより簡単に構造体を作成する仕組みです。
docs.ruby-lang.org

Structクラスの特徴

定義が簡単

Struct.newで引数に渡したシンボルに対応するメンバとアクセサメソッドを持つクラスを生成します。

  # 気温情報を持つ構造化データ
  Temperature = Struct.new(:date, :high, :low)
  temp = Temperature.new('2018/01/01', 8.0, 0.5)
  temp.high # => 8.0

ブロックでメソッドも定義可能

ブロックを利用することでメソッドを定義することも可能です。

  Temperature = Struct.new(:date, :high, :low) do
    def mean
      (high + low) / 2.0
    end
  end

Structクラスの使いどころ

構造化データを用意する際、Hash、Class、Structあたりが選択肢となります。
以下のような時にStructクラスを利用すると良さそうです。

  • ちょっとした構造化データが必要だが、クラス作るほどではない
    • 利用箇所が限定的
    • その構造化データが今後拡張される想定がない(継承、ミックスインなどしない)
  • Hashのように、メンバが動的に変更されたくない
    • 動的に変更する構造化データが欲しい場合、OpenStructクラスも用意されている

HashとStructの比較サンプルソース

以下、Hashを利用した場合とStructを利用した場合の比較サンプルソースです。

require 'csv'

# --- Hashを利用した年間気温クラス
class AnnualWeatherWithHash
  def initialize(file_name)
    @readings = []
    CSV.foreach(file_name, headers: true) do |row|
      @readings << {
        date: Date.parse(row[2]),
        high: row[10].to_f,
        low: row[11].to_f,
      }
    end
  end

  # 平均気温
  def mean
    return 0.0 if @readings.size.zero?
    total = @readings.reduce(0.0) do |sum, reading|
      sum + (reading[:high] + reading[:low]) / 2.0
    end
    total / @readings.size.to_f
  end
end

# --- Structを利用した年間気温クラス
class AnnualWeatherWithStruct
   # Structを作成しReading定数に保持
  Reading = Struct.new(:date, :high, :low) do
    def mean  # ブロックでメソッド定義することも可能
      (high + low) /2.0
    end
  end

  def initialize(file_name)
    @readings = []
    CSV.foreach(file_name, headers: true) do |row|
      # Reading定数をクラスのように利用することができる
      @readings << Reading.new(Date.parse(row[2]), row[10].to_f, row[11].to_f)
    end
  end

  # 平均気温
  def mean
    return 0.0 if @readings.size.zero?
    total = @readings.reduce(0.0) { |sum, reading| sum + reading.mean }
    total / @readings.size.to_f
  end
end

参考

  • Effective Ruby (項目10: 構造化データにはHashではなくStructを使おう)