Ruby

ActiveRecordでnew => build => save! するとどうなる

関連付けのあるモデルにおいて、親レコードをnew => 子レコードをbuild => 親レコードをsave! したときの挙動が複雑な気がしたのでメモ。 (理解力が不足しているだけかもしれない。) 検証環境: ActiveRecord 6.0.2.1 追記 さんざん書いてから気づいたのだ…

ERBで'<%='の前にある空白文字を取り除くシンプルな方法は用意されていない...のか?

リファレンス 基本形 > ERB.new("<%= :hoge %>").result # => "hoge" > ERB.new(" <%= :hoge %> \n").result # => " hoge \n" 後ろを消したい リファレンスによれば、trim_modeを"-"にした場合、「行末が-%>のとき改行を出力しない」。 > ERB.new("<%= :hoge…

デメテルの法則

「ドットがつながったらあかんで」とかいうやつ、くらいの認識しかなかったが整理できたのでメモ。 結論としては、「ドットがつながったらあかんで」ではなく、「ドットがつながったときは不要な依存をつくっちゃう場合があるから、ほんとにそれでいいかよく…

クラス変数とインスタンス変数

職場で「クラス変数とクラスインスタンス変数の違い」が話題にあがっていて、以前理解したよな、と思いつつ咄嗟に整理して述べられないなと思ったので、思い出しつつまとめてみる。 基本的にはクラス変数とインスタンス変数というものがある。 まずサンプル…

Rspecでuse_transactional_fixturesはexampleのみにtransactionを張る

Rspecの基本的なことを知らなかったのでメモ。 rails_helper.rb RSpec.configure do |config| config.use_transactional_fixtures = true end 1つ1つのテストにtransactionを張って、テスト終了時に必ずrollbackしてくれる設定。 user_spec.rb require 'rail…

IOインスタンスの読み書きモード

Kernel.#openとIO.openはだいたい同じ。IOインスタンスを返す。 第二引数で指定する読み書きモードについてメモ。 各種モードの違い 読み込み可能 書き込み可能 開いた時点で内容を白紙にする 書き込み開始位置 r 1 0 0 - r+ 1 1 0 先頭 w 0 1 1 先頭 w+ 1 1…

Arrayのメソッドいろいろ

挙動がちょっとややこしいものや、「どうなんだっけ?」となりがちな点についてまとめてメモ。 Array#product Array#product(*array) -> array レシーバの配列と引数の配列から、それぞれの全要素を掛け合わせた一次元配列を返す。 main = [:meat, :fish] sa…

日時のフォーマット

都度調べればいいけど、最低限「日付は小文字、時間は大文字」ってイメージをもっとくとよさそう。DateとTimeでフォーマットは基本的に共通。 日付 d = Date.new(2020,12,31) # => #<Date: 2020-12-31 ((2459215j,0s,0n),+0s,2299161j)> d.strftime('%y') # => "20" d.strftime('%Y') # => "2020" d.strftime('%</date:>…

X進数の数値リテラルほか

リファレンスのなぞり書き。 X進数の数値リテラル 接頭辞をつけることで10進数以外の表記でリテラルを記述できる。 接頭辞と整合的でない入力が続いた場合はエラーを返す。 16進数 => 接頭辞0x 0x10 # => 16 0x1g # => SyntaxError 2進数 => 接頭辞0b 0b10 #…

ヒアドキュメント

リファレンスのなぞり書き。 基本文法 <<[(-|~)]["'`]識別子["'`] ... 識別子 <<[(-|~)] << ヒアドキュメント内の空白文字は全て文字列に含まれる。 終端の識別子は行頭にある必要がある。=インデントされていると識別子とみなされない。 string = <<EOS line1 line2 EOS => " line</eos>…

Nonblocking TCP Server

Socket(TCP)通信をかじったのでメモ。 first implementation サーバ。 require 'socket' server = TCPServer.new(4481) loop do connection = server.accept request = connection.read connection.write("request served: #{request}") connection.close en…

superをフックメソッドで代替すると良い、という話

下記書籍を読んでて学びがあったので、自分なりに整理してメモ。 オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方 要約 継承において、あるメソッドを呼んだら各サブクラスに共通の処理をしつつ、各サブクラス…

dependency inversion

なぜBigDecimalでは高い精度で10進数を扱えるのか

「Floatだと丸め誤差が発生するから10進数を扱う精度が低い」 「BigDecimalだと丸め誤差が発生しないから10進数を扱う精度が高い」 という話に触れたのだが、その理由がぱっと理解できなかったので、ちょっと整理して考えてみた。*1 *1:Rubyに限ったトピック…

AWS Lambdaではてなブログの記事をQiitaに自動転載した

コード first commit · k-tokitoh/sync_entries@b05ed9e · GitHub

インスタンス変数とかはselfに依存するという話

@varが何を指すかって、何を元に判断しているのだろうか。

x_evalしたときのコンテクスト(続)

前回x_evalメソッドでのコンテクストについて、selfとklassという側面からまとめた。*1 今回はローカル変数の状態という側面を加えて、x_eval/x_execメソッドでのコンテクストについておさらいする。 *1:https://tamani.hatenadiary.jp/entry/2019/08/04/135…

x_evalしたときのコンテクスト

コンテクスト 「コンテキストとはおおざっぱに言えばローカル変数の状態、self, klassから成る。」*1 *1:https://blog.yugui.jp/entry/547

evalことはじめ

eval osamu = 'tezuka osamu' # => "tezuka osamu" eval('osamu') # => "tezuka osamu"

StructとOpenStruct

似た名前だが意外と挙動が異なるな、と思ったのでメモ。

特異メソッドのmix-in

mix-inにおける特異メソッドの扱いがよく分かっていなかったのでメモ。 結論は以下。 モジュールに定義された特異メソッドはmix-inされない いろいろmix-inしたい場合はincludeとextendを組み合わせる 「extendedフックでinclude」、「includedフックでexten…

Rubyのマルチスレッド

プロセスについて学んだのでついでにスレッドも触ってみる。

『なるほどUnixプロセス』を読んだ

『なるほどUnixプロセス』が良書だった。 かいつまんでメモ。

"<=>"メソッドのオーバーライドによる比較の実装

名著"Effective Ruby"に「"<=>"とComparableモジュールで比較を実装しよう」と書いてあったので江戸時代の身分制度を実装してみた。

ビンゴカード作成問題を解いてみた

問題はこちら。 最初に書いたコード

Rubyにおける(オブジェクトへの参照の)値渡しを理解しようとして無知を感じた

Rubyのメソッド呼び出しではだいたい全部(オブジェクトへの参照を)値渡しする。

joins, eager_load, preload

絞り込みあり、joinしたテーブルの情報を使わない 絞り込みするのでpreloadはつかえない。 処理時間 joinsで連結先テーブルの情報を含まない小さめのオブジェクトを扱う eager_loadでは連結先テーブルの情報を含む大きめのオブジェクトを扱う => joinsの方が…

Rubyでメソッドの引数にnilを渡すと、デフォルト引数は適用されない。

タイトルのとおりで初歩的な話ながら、知らなかったのでメモ。

Rubyにおけるローカル変数のスコープ

いまさらだけど、あれ?と思うことがあったのでメモ。 変数と定数 (Ruby 2.6.0) 「ローカル変数のスコープは、宣言した位置からその変数が宣言されたブロック、メソッド定義、またはクラス/モジュール定義の終りまでです。」 試してみる。 top_level = 1 cla…

しゃくとり法

D - Enough Array 「いちばん愚直にやるとO(n**3), 累積和つかってもO(n**2)だな」まで考えたところで詰まったので解説みた。 しゃくとり法の存在はなんとなく知っていたが、そうかこういう場合に使うと一気にO(n)にできるんだ。 しゃくとり法のアイデアだけ…