コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Ruby

Rubyでeach.with_indexを使うと n+1みたいなことをしなくてもいい感じに1からはじまる値が取得ができる

配列の長さが個数を兼ねているときによく考えるネタ。 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18] 実例 要件 配列に画像のファイル名が入っているので No.1:添字0の画像名、No2:添字1の画像名 というように表示したい 対象…

Rubyの and と && は使い方によって優先度の影響で振る舞いが変わるので気をつける

DoubleRenderError避けに使う書き方で render :hoge and return みたいになぜandを使うのかという話。 実例 たとえばこんな感じで test.rb を作る def normal(val) p val and return p "end of normal" end def shortcut(val) p val && return p "end of sho…

Rubyで環境変数を取るときはENVオブジェクトを使えばとれる

当たり前の話だけどそれにちょっとトリビアをつける 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18] $ bin/rails -v Rails 5.2.2 使い方 ENV[{{キー名}}] で値が取れる $ HOGE=huge irb と起動すれば ENV["HOGE"] #=> "huge" …

BOM付きのCSVをRubyのCSVクラスでreadする

header:true しようとしたらできなかったのでそのメモ 環境 $ ruby -v ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-darwin18] どういうことか BOM付きのファイルを CSV クラスで読み込むと、先頭行にBOMの情報がついてしまう。そのため、headerのオ…

Rubyの positive? や negative? は0を含めない

以上ではなく、それより上。そりゃ文字通りなんだけどさネタ。 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18] 挙動 positive?とnegative? は以下の感じ。 1.positive? #=> true -1.positive? #=> false 0.positive? #=> false…

Webmockでform送信されるリクエストをモックする

割と考えればわかりそうなことだが、ピンと来なかったのでメモとして書く 環境 webmock (3.5.1) やり方 WebMockのwithに以下の記述を書き足す headers: { "Content-Type": "application/x-www-form-urlencoded" } 例 user_idの100がformでPOSTでされたときに…

RSpec3の配列系マッチャを利用シーン別に逆引き表を作ってみた

RSpec3から結構選択肢があるようなので一覧表にしてみる 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18] $ bundle exec rspec -v RSpec 3.8 - rspec-core 3.8.0 - rspec-expectations 3.8.2 - rspec-mocks 3.8.0 - rspec-rails…

Rubyで初期値設定を行うときは || を使って nil 判定をする自己代入式を使うと便利

x ||= 10 みたいな形でORの仕組みを使って初回だけ値を入れるやり方を考える 環境 $ ruby -v ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18] 考え方 たとえば、インスタンス変数に 「すでに a に 値が入っていれば値をそのまま使…

Rubyのgem、configで使う設定値のymlには環境変数を指定することができる

erb的な書き方はできるんですよ、というメモ 環境 rails (5.2.2.1) config (1.7.1) 書き方 <%= %> の記法で書く。 キー名: <%= ENV["指定したい環境変数名"] %> 実践 以下のように記述する sample: <%= ENV["SAMPLE_SAMPLE"] %> 環境変数を指定しないとnilに…

RubyのCSVライブラリは header: true とすると1行目の行情報でハッシュのように扱える

トリビア風タイトルネタ 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18] 実例 例えばこんなCSVがあった場合 no,name,age 1,Taro,20 2,Ziro,31 3,Saburo,33 名前のnameだけ出力したいなぁとかなると、CSVの1行目を削ってからRea…

Faraday(にてNet::HTTPを使う場合)で証明書検証をスキップする

2日連続Faradayネタ 環境 faraday (0.15.4) 考え方 FaradayではHTTP接続のadapterが指定できるので、そちらで Net::HTTP を使えばSSLの認証モードとして証明書検証が失敗しても続ける指定ができるのでそちらを使う やり方 Faraday.new do |faraday| faraday.…

RubyのFaradayで送信するURLはURIエンコードを勝手にかけてくれる

表題の通りネタ 環境 faraday (0.15.4) 実演 下記の用にクライアントクラスを作る client = Faraday.new do |faraday| faraday.response :logger #ログが見れる用に faraday.adapter Faraday.default_adapter # デフォルトアダプタ指定 end まずは普通のパラ…

Rubyで , 区切りの代入は配列扱い

タプルっぽい動きではあるが、そういう機構ではない。 環境 $ ruby -v ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18] どういうものか a,b = 1,2 のような記述の話。 上記のような個別になるが、格納先がひとつだと配列として入る…

Rubyでサッとカウントアップのループを書く書き方

本当にメモ書きレベルのトリビア 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18] 書き方 範囲式の x..y を使って書く 例 (1..4).each { |inc| p inc } #1 #2 #3 # カウントダウンしたい場合 reverse_eachを使うこともできるが…

Faradayで普通のフォームのようなPOSTする

すげー当たり前だけど、Faradayがらみは application/json の事例しかないので改めて書いてみる 環境 faraday (0.15.4) 考え方 POST リクエストは、ふつう HTML フォームを介して送信され、サーバーに変化をもたらします。この場合、 <form> 要素の enctype 属性も</form>…

RailsでのRSpec実行時乱数の状態を実行毎に変わらないように固定する

RSpecでsampleするとコケるんだけど特定しづらい…みたいな奴を解消する。 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18] $ bin/rails --version Rails 5.2.2 $ bundle exec rspec --version RSpec 3.8 - rspec-core 3.8.0 - r…

RailsでIDを指定したリソースに対して、更に持つリソースを持つ情報を別コントローラーに割り当てるときのroutes.rbの書き方

あれ、どうやるんだっけ?というときのメモ 環境 $ bin/rails --version Rails 5.2.2.1 例 例えばユーザID100が所持する本が欲しい場合、以下のURLが思いつく https://example.com/users/100/books みたいな場合 resources :users do get ":id/books" => "us…

Rubyにおける%記法と%iと%wの挙動

よくRubocopに直された状態になり、あれ、これ何と同じなんだっけ?ってなるのでメモ %(パーセント)記法 %を使う記法はリファレンスにも%記法として紹介されている。 リテラル (Ruby 2.6.0) - %記法 %wと%W 小文字のダブリューで始まるとシンボルとして生成…

Timeのmktimeをすると、タイムゾーンはシステムに依存する様子

おお…なるほど…?という実装。あんまり明記されていないので言い切れない感じのタイトル。 環境 マシンA $ ruby -v ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-linux] $ date 2019年 4月 10日 水曜日 06:39:32 UTC マシンB $ ruby -v ruby 2.3.7p45…

RubyでYAMLのstamp型を読み込むと、それっぽい文字列があってもそのままだとタイムゾーン情報文字列が出てくれない

動作原理までは突き止められていないのでただのメモ 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18] 例 例えばこんなyamlを text.yaml として用意する stamp1: 2005-01-01 00:00:00 +09:00 stamp2: 2005-01-01 00:00:00 +10:00…

Rubyのcase文において、複数対象したい場合は , 区切りで指定できるし、その定義は配列を使うこともできる

滅多に大量のwhenとかしないんですが、やる場合のメモ 環境 $ ruby -v ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-darwin18] 実例 対象の値が taro か ziro の場合だけ同じ反応をするようなcase文を書く , で区切る場合 NAME_KEYS = "taro","ziro" …

Rubyには配列を作る方法としてKernel付けのArrayというメソッドが存在する

あー、そういう原理だったのね…というメモ 環境 $ ruby -v ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18] よくある実例 代表的な使い方例 a = "Yeah!" # => "Yeah!" [a] # => ["Yeah!"] Array(a) # => ["Yeah!"] Array(["hoga","…

ActiveRecordで保存前の値を取りたいときはカラム名_before_last_saveというものがある

ActiveRecordのDirty系小ネタ 環境 $ bin/rails -v Rails 5.2.2 使い方例 今回はUserにnameというカラムがあるという形の例で説明 ActiveRecordでオブジェクトを作る、この時点ではsaveされてないのでnil。 u = User.new(name:"Taro") #=> #<User id: nil, name: "Taro", created_at: nil, updated_at: nil> u.name # => "Ta</user>…

RubocopのBundler/OrderedGemsは空行やコメント行があると反応しなくなる

rubocopってgemの順番にイチイチつっこんできますよね…みたいな記憶だけがあって実際には言われないな…みたいな話で気づいたメモ、原理までは追えなかったのでとりあえず。 前提 Bundler/OrderedGems が default で enable なので反応する 当該コード:ruboc…

rubyでpng画像をBASE64化してHTMLに貼り付ける

話には聞いていたがやったことないのでやってみる。 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18] やり方 png画像をBASE64に変換する こんな感じで対象画像をtarget.pngという名前で配置 $ tree . ├── convert.rb └── target…

bundlerのpathを指定しない場合のインストール先

実は知らなかったシリーズ 概略 通常のgemと同じところにインストールされる。 ネタ元 By default, Bundler installs gems to the same location as gem install.(中略) Therefore, git gems are downloaded and installed into ~/.bundle rather than $GEM_…

RubyのStringリテラルのfrozenはプラス演算子で解除できる

あ、こんな書き方あるんだっていうメモ 出典 instance method String#+@ (Ruby 2.6.0) 実例 freze_text = "hubuki" #=> "hubuki" # freezeで凍結 freze_text.freeze #=> "hubuki" # 代入しようとするとエラー freze_text << "a" RuntimeError: can't modify …

Rubyのbetween?は大なり小なりをしているだけなのでいろいろ比較できる

ActiveSupportの拡張かと思ったらRubyの実装で、原理を知らなかったのでメモ 環境 $ ruby -v ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-darwin18] 出典 比較演算子 <=> をもとに self が min と max の範囲内(min, max を含みます)にあるかを判断…

Rubyの場合、Unicodeのコードポイントをバックスラッシュuで記述してダブルコーテーションで囲むと該当文字列に展開してくれる

なるほどと思ったので 環境 $ ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18] ip-192-168-101-58:duck 00048takada$ irb 実例 Unicode一覧 0000-0FFF - Wikipedia によると @ のUnicodeコードポイントは U+0040 なのでirb上で "\u0040…

RSpecのletは遅延評価なので2つ書いた場合は最も近いブロックの値を評価する

『遅延評価』を謳っているが、重複表記の場合はどうなるのというメモ。 後述しているが 単純に読みにくくなるので使わないことに越したことはない ものです。 環境 $ bundle exec rspec -v RSpec 3.8 - rspec-core 3.8.0 - rspec-expectations 3.8.2 - rspec…