updated_atだけ更新

find_or_create_byを使う際、すでにレコードがあるときはupdated_atだけ更新して欲しいと思う状況がありました。 

 

User.find_or_create_by(name: “Hayashi”)

 

これだと既にHayashiさんが存在する場合、updated_atは更新されません。

 

 

なので以下のようにfind_or_initiaize_byしてからアップデートしようかと考えておりました。

user = find_or_initiaize_by(name: “Hayashi”)

user.update(name: “Hayashi”, updated_at: Date Time.now)

 

しかし、touchメソッドを使えばupdated_atのみ更新できると知りました!

 

User.find_or_create_by(name: “Hayashi”).touch

 

 

User.find_or_create_by(name: “Hayashi”)だと返り値は保存したオブジェクトですが、

User.find_or_create_by(name: “Hayashi”).touchとすると返り値がbooleanになるので注意する必要がありました!

 

 

 

文字列を配列に入ったハッシュに変換

文字列を配列に入ったハッシュにしたい状況がありました。

具体的には以下のような変換をしたいと思っておりました。

 

 

"[{{day: '2019/12/22', value: '5000'},{{day: '2019/12/22', value: '5000'}]"

=>

[{:day=>"2019/12/22", :value=>"5000"}, {:day=>"2019/12/22", :value=>"5000"}]

 

 

 

split(',')としてもハッシュの途中で区切られてしまうしどうしようかと思ってした時、instance_evalで解決できると知りました!!

 

instance_eval("[{day: '2019/12/22', value: '5000'},{day: '2019

12/22', value: '5000'}]")

=> [{:day=>"2019/12/22", :value=>"5000"}, {:day=>"2019/12/22", :value=>"5000"}]

 

 

感想その他

instance_evalを仕事のコードで使うのはよくないし、本来の使い方なのかは謎ですが、instance_eval使う機会が訪れて嬉しかったです!

 

 

 

TokyoGirls.rb Meetup vol.2へ参加した

本日TokyoGirls.rb Meetup vol.2へ参加しました!
去年の第一回目に参加して楽しかったし、各セッション面白そうなものばかりだったので以前から気になっておりました!
とってもよかったので記憶が薄れないうちに各セッションを聞いて感じたことや気づいたことをメモしておこうと思います!


TokyoGirls.rb とは?

「女性も参加しやすい(でも女性限定ではない)Ruby勉強会」です。

以下がイベントのリンクです!

techplay.jp


セッション

Ruby on Rails最初の一歩」(ただあき(@tdakak)さん)
  • 何か調べるとき検索でヒットする記事を参考にして済ませがちだが、やはり公式ドキュメントに目を通すことが大事
  • railsならRailsガイド、より深くなぜこう書くのかを理解するためにAPIドキュメントを見る
  • 1プルリク・1コミットの大きさを考える
  • 修正等行った際はなぜそうしたか&根拠となるソースも載せる
  • レビューでギスギスしないために人後のコミュニケーション大事

 

 

「事業知識を深掘りし、より人の役に立つサービスに改善する」(Kubota Nao(@kazenomachi_)さん)
  • 事業にコミットするにはコードを書けるだけでなくドメイン知識が必要
  • ドメイン知識が浅いと情報の分け方がわからないのでDB設計も間違えてしまうリスクがある
  • 事業知識が増えると本質的な部分でのサービス改善提案もできるようになる

 

 

「Rackミドルウェア入門のためのRackミドルウェア」(塩井美咲(しおい / @coe401_)さん)

speakerdeck.com

 

github.com

発表スライド以外にも事前資料作ってくれている!!!

 

 


「エンジニアとチームを組んで見えないものをデザインする」(羽野めぐみ(@featherplain)さん)

speakerdeck.com

  • デザイナーさんのご発表
  • figmaというツール良さそうできになる
 

「プロジェクトマネジメントへようこそ」(浪川舞(まいどる / @maidol_28)さん)

speakerdeck.com

  • タスクを見える化することで属人化も減らせる

→ただ闇雲に頑張るという状態を防げる

  • 上下関係ない人同士のフラットな1on1

→フラットな関係だからこそ言いづらいことも言えるというメリットがある

 

 

「いつもの開発のようにOSS活動をしよう」(makicamel(@makicamel)さん)

speakerdeck.com

  • エンドユーザー、開発者、レビュアー、いろんな人のことを考えて実装しているのすごい!!
  • レビュアーさんがわかりやすいように伝えるための努力も参考にしたい
  • わからない何かがわかるようになるのは楽しい

エンドユーザー、開発者、レビュアー、いろんな人のことを考えて実装しているのがすごいと思ったのですが、@makicamelさん自身は普通のこととおっしゃっており、自分も普通の事として出来るようになりたいと感じました!!

 

「絶対に後戻りしない!時短勤務ママエンジニアの、要件ヒアリング力」(ちょうかおり(@kaori_cho)さん)

  • エンジニアの仕事は問題の発見と解決

→背景を知ることが大切
→理想を正しく把握すること
→なぜ?をきく

  • 背景や目的を聞きにくい時「いつ使ってる?」「今どうやってる?」と聞いてみる
  • 「念のため作って」という顧客からの依頼には一旦使ってもらって様子を見てから追加実装対応する方向に持っていく

 


「強いエンジニアという灯」(大場寧子(@nay3)さん)

speakerdeck.com

  • エンジニアには技術を使った問題解決力・折れない心・柔軟で強いことが求められる
  • クラッチでコードが書けることが大事

→覚えることは速さの根源
→全部覚えるのは効率悪いので法則を覚える

  • 法則を意識して実装する

→そうしないとあとで全部調べないとメンテできなくなる

  • 1つ1つの実装に信念をもているようにする

→不安定な土台の上に新たな土台を載せることはできない

  • 失敗から学べることは多い

→失敗を知っているから回避できるようになる

→失敗の芽を気にせず得た成功はラッキーで再現性がない

  • 失敗の芽とうまくいくパターンの引き出しをたくさん持っておく

 


感想その他 

刺さる発表ばかりでした!!

自分が今まさに課題だと感じている問題に関係するセッションがいくつもあり、参加できてよかったです!!

 

 

日本語のtypoチェックツール

日本語のtypoチェックツールを探しておりました。

一番最初に以下のツールを見つけたので試してみました!!

 

 

enno.jp

どうやらこちらはRubyで作られているようです!

 

試してみる

試してみたのですが、日本語はなかなか難しいようで以下の例はtypoを検出してくれませんでした。

  • 本来であれあば可能です。もう一度試していただけないでしょうか。
  • 本来であれば可能です。もうう一度試していただけないでしょうか。
  • 本来であれば可能mです。もう一度試していただけないでしょうか。

 

以下の例のように明らかに文法的におかしい場合は検出してくれました!

  • 私にの正しい。

にの正しい。

にの【純粋エラー】助詞「の」「に」のいずれか一方は不要な可能性があります。

 

 

感想その他

他の日本語typoチェックツールも探していきます!!

まず次は以下のツールを試してみようと思います!

https://github.com/textlint/textlint-app/releases/

RipperとRubyParser

今日とあるプルリク上でrubyで書かれたコードをパースする話が出てきました。

気になったので調べてみました。

 

Rubyで書かれたコードをパースする方法はいくつかあるようです。

 

RubyParserを使う

gem install ruby_parser を実行してruby_parserをローカルに入れます。

その後、以下のようにすればコードをパースできます。

irb(main):001:0> require 'ruby_parser'

=> true

irb(main):003:0> p RubyParser.new.parse 'hello world'

s(:call, nil, :hello, s(:call, nil, :world))

=> s(:call, nil, :hello, s(:call, nil, :world))

 

 

 

Riooerを使う

RubyにはRipperというライブラリが用意されているようです。

以下はRipperのリファレンスマニュアルリンクです。

docs.ruby-lang.org

 

以下のようにパースできます。

irb(main):004:0> p Ripper.sexp('hello world')

[:program, :command, [:@ident, "hello", [1, 0, [:args_add_block, :vcall, [:@ident, "world", [1, 6]], false]]]]

=> [:program, [[:command, [:@ident, "hello", [1, 0]], [:args_add_block, [[:vcall, [:@ident, "world", [1, 6]]]], false]]]]

 

 

感想その他

Ripperはgem installしなくても使えるので楽ですが、パースした結果はRubyParserの方がみやすいと感じました。

 

 

 

ナンバーパラメータ

昨日ruby2.7から入る新機能の1つとして紹介があったナンバーパラメータについて、試せていなかったので試しました!

 

ナンバーパラメータとは

ブロックの仮引数を宣言しなくても_1、_2、_3、、、というように`_引数の番号`で参照できる機能です。

 

最初は`@引数の番号`となる予定だったそうですが、インスタンス変数と似てて紛らわしいので`_引数の番号`となったらしいです。

 

 

irb(main):009:0> [1, 2, 3].each { |i| puts i }

1

2

3

=> [1, 2, 3]

 

 

上のeach文が下のようにかけます。

 

[1, 2, 3].each { puts _1 }

1

2

3

=> [1, 2, 3]

 

 

 

感想その他

慣れたら便利に感じそうです!!

 

 

Ruby Hack Challenge Holiday #9 Ruby 2.7 + 年末LT大会へ参加した

本日はRuby Hack Challenge Hpliday #9 Ruby 2.7 + 年末LT大会へ参加しました!
以下がイベントリンクです。
https://rhc.connpass.com/event/155899/

 

まずruby2.7の新機能について紹介していただき、その後各自作業を進めました。
やっと自分もruby 2.7.0から入る新機能を試すことができました!
新機能がたくさんあり、何を試すか迷ったのですが、とりあえずirbを試してみることにしました!

irbの2.7から入る新機能は以下です!

  • オートインデント
  • 色付き
  • 前の行へカーソル移動できる
  • ↑キー選択で複数行まとめて履歴戻れる

gyazo.com

 

そのあとはパターンマッチのスライドも読み返してみました。

speakerdeck.com

 

その他、キーワード引数の扱いが変わる話、ナンバーパラメータが@じゃなくて_を使うように変更された経緯、ヒープを圧縮するためのGC.compactが追加された話などなど、とても興味深い内容が盛りだくさんでした!!

 


感想その他

本日ruby 2.7.0-preview3を入れた際はいつも通りHomebrewから入れてしまいましたが、Cからビルドして動かせるようにする方法も以下のリポジトリに書いてあるので、その方法も試してみたいです!
Rubyのビルド方法以外にもrubyをハックするために役立つ内容がたくさん書いてあります!!

github.com